SPI kerdes
Papp Zoltán
zombi at c2.hu
Sat Dec 2 16:52:06 CET 2006
2006.12.02. 15:23:15 dátumon B Z <kalip777 at freemail.hu> írta:
> Sziasztok!
>
> 2db ATmega32 komunikalna egymassal SPI-n keresztul. Addig
> nincs is bajom mig a master ad a slave-nek. Helyesen at is
> kuld mindent. Viszont a slave-vel nem tudok adatot kuldeni a
> master fele. Adatlapot atolvastam ketszer is, bar lehet
> valami elkerulte a figyelmem, vagy a hianyos nyelvtudas
> okozhatja vesztem.
>
> Ahogy kommunikalok:
> Master:
> Slave kivalsztas
> SPDR regiszterbe iras
> SPIF flag vizsgalata, hogy befejezodott-e az atvitel
> Slave tiltasa
>
> Ezutan a slave-nel interrupban:
> SPDR regiszter kiolvasa -> megjott a jo adat
> SPDR regiszter irasa, amit masternak kuldenek
>
> Masternal ezekutan:
> Slave kivalsaztasa
> SPDR reg irasa
> SPIF flag vizsgalata
> SPDR reg olvasa -> rossz az adat amit a slave kuldott
>
> Helyes ez a gondolatmenetem, vagy kihagyok valamit, vagy nem
> is igy kellene kommunikalni?? Az aramkorben kulso felhuzo
> ellenallasok nincsenek. Master fele akkora orajelrol jar
> mint a slave.
A master a slave-t csak az első bájt előtt engedélyezze, és az utolsó
(jelen esetben a második) után tiltsa.
Érdemes elolvasni az "SS Pin Functionality" részt.
Először mindig a legkisebb SPI sebességen próbálkozzál (fosc/128).
Példa C-ben:
// SPI könyvtár részlet:
#define SPIDONTCARE (0x00)
char spi_rw(char data)
{
// set data to send into SPI data register
SPDR = data;
// Wait for transmission complete
while(!(SPSR & (1<<SPIF)));
// return data read from SPI
return SPDR;
}
char spi_r()
{
return spi_rw(SPIDONTCARE);
}
//pl. MCP2515 regiszter olvasás:
char mcp2515_readRegister(const char address)
{
char ret;
MCP2515_SELECT(); //Slave select
spi_rw(MCP_READ); //1. byte: Read command
spi_rw(address); //2. byte: register address
ret = spi_r(); //3. byte: reading register
MCP2515_UNSELECT();//Slave deselect
return ret;
}
Üdv
--
Papp Zoltán
OneWay Electronics
More information about the Elektro
mailing list