SPI na AT mega 32 (obsluha EEPROM 25LC040A)

Ahoj

Poprosím o konzultaci. Mám AT mega32 + EEPROM 25LC040A, kteří jsou propojeni SPI sběrnicí.
Nejsou mi úplně jasné 2 věci:

  1. Pochopil jsem správně, že jak data z Mastera posílám na slave po jednotlivých bitech, tak mi úplně stejně po bitech vrací (ve stejný čas) slave svá data zpátky ?
    tj. Když odešlu do slave bajt z SPDR, a odeslání dokončím, tak zároveň už mám v SPDR registru nový bajt, který mi poslal slave zpět, takže odeslání dotazu (bajt z master do slave) a přijmutí odpovědi (bajt z slave do mastera) zabere 8 SPI hodinových cyklů ?
    = full duplex ?

Proč se na to ptám? V datasheetu k té EEPROM jsou ukázány průběhy signálů a je to tam ukázáno tak, že nejprve bajt odešlu (to zabere prvních 8 hodinových cyklů) a pak v následujících dalších 8 hodinových cyklech teprve přijímám bajt zpět - tj. operace odešlu dotaz, vrátí se mi odpověď zabere celkem 16 hodinových cyklů.
= half duplex ?

  1. V datasheetu k té EEPROM je pak na konci uvedeno:
    Serial Output = Data out of the 25XX040A. During a read cycle, data is shifted out on this pin after falling edge of the serial clock
    Serial Input = The SI pin is used to transfer data into device. It receives instructions, addresses and data. Data is latched on the rising edge of the serial clock.

Znamená to, že data z Slave do Master (serial output) jsou potvrzovány sestupnou hranou (CPHA = 1 => trailing edge) a naopak
data z Master do Slave (serial input) jsou potvrzováný nástupnou hranou (CPHA = 0 => leading edge)?

Jenže jak to udělat ? Můžu do Slave odeslat bajt (dotaz) při nastavení CPHA = 0, poté přenastavit do CPHA = 1, odeslat nějaký prázdný bajt (čímž spustím CLK) a na konci z SPDR registru přečtu odpověď od Slave ?

Předem děkuji za vaše názory.

K bodu 2: SPI komunikace probíhá tak, že při jedné hraně CLK (dejme tomu náběžné) se data na MOSI nemění a slave čte bit a posílá na MISO nový. Při druhé hraně se naopak master na MOSI mění bit a čte platná data z linky MISO.

Polopatě :

  1. Master nastaví linku MOSI a provede CLK 0->1
  2. Při 0->1 slave načte bit z linky MOSI a na linku MISO pošle nový bit.
  3. Master pošle CLK 1->0, přečte z linky MOSI bit a vše se opakuje od bodu jedna.

K tomu ještě patří obvykle signál SS (Slave select), který aktivuje linku pro daný slave (obvykle log. 0) a byl by uveden jako bod 0.
Následuje ukončení přenosu (byl by to bod 4) a to změna SS z 0 na 1. Slave v tuto chvíli ví, že je přenos u konce a může přijatá data zpracovat.

Na druhou stranu třeba 74595 nepoužívá signál SS, ale WR pulz (označovaný jako ST_CP - Store Clock Pulse). Může se chovat úplně stejně jako SS nebo jej lze použít tak, že po zápisu 8 až n*8 bitů (podle délky řetězu připojených IO) se provede zápis změnou signálu WR (0->1->0).

Jinak odpověď na dotaz, zda po odeslání všech 8 bitů po SPI máš v registru SPDR data ze slave, tak ano - máš.
Jenže z logiky věci vyplývá, že EEPROMka se kterou komunikuješ nejdříve musí dostat instrukce, co má dělat. Laicky řečeno - nemůže odpovídat dřív, než dostane dotaz. Takže v SPDR sice data máš, ale smysluplná data dostaneš až když EEPROMka “zpracuje zadání”.

Podívej se sem.
noel.feld.cvut.cz/vyu/scs/prezen … serial.htm

Posuvné registry SPDR-master a SPDR-slave jsou zapojené do smyčky.
Takže při vyslání bajtu si navzájem vymění hodnoty.

Např. pro čtení musíme vyslat 3 bajty:

  1. bajt - instrukce pro čtení a 9. bit adresy.
  2. bajt - dolních 8 bitů adresy.

Tady slave vloží do svého SPDR bajt z žádané adresy.

  1. bajt - libovolná hodnota.

V SPDR-master teď máme hledaný bajt.


Nad hranama nemusíš bádat, nastav SPI mode 0 (CPOL=0, CPHA=0) a je to.

Nádhera - HC11 mám ještě někde na destičce… chjo :wink: