Fórum témák

» Több friss téma
Cikkek » SPI használata AVR-rel
SPI használata AVR-rel
Szerző: Fizikus, idő: Jún 13, 2011, Olvasva: 32109, Oldal olvasási idő: kb. 6 perc
Lapozás: OK   3 / 8

SPI használata AVR-rel

Amint láthattuk az SPI működése elég egyszerű. A korábban vázolt folyamatot szoftveresen is megvalósíthatjuk normál I/O lábak használatával, de ahelyett hogy a saját bit-banging algoritmusunkat leprogramoznánk, használhatjuk az ATMega8-ba épített SPI perifériát is, ami nagyon megkönnyíti a dolgunkat. Az elküldendű adatot csak beírjuk az SPI adatregiszterbe (SPDR) és az SPI periféria automatikusan elküldi az adatot a Slave eszköznek és be is olvassa a róla érkező adatot.

Az alábbi ábra egy AVR-re épülő alap SPI kapcsolást mutat. A MISO, MOSI és SCK vezetékek a Slave eszköz megfelelő lábaival vannak összekötve.
 

Több eszközt is csatlakoztathatunk ugyanarra az SPI buszra, csak arra kell odafigyelni, hogy egyszerre csak egy Master és egy Slave lehet aktív. Egyirányú SPI eszközöknek csak az SCK órajelvezeték és az egyik adatvezeték kell. Az hogy egy eszköz csak a MISO vagy csak a MOSI adatvezetéket használja-e, attól függ hogy milyen funkciót lát el. Előfordulhat hogy egyszerű érzékelők csak adatot küldenek (az ábrán S2-vel jelölt eszköz), amíg pl. egy Digitális-Analóg konverter (DAC), vagy az első példámban használt 74HC595-ös shift regiszter csak adatokat fogad (pl. az ábrán S3-mal jelölt eszköz).

Az SPI-hez használt I/O lábak kiosztása AVR-enként változik. Az általam használt ATMega8-as esetén az SPI lábkiosztást az alábbi ábra mutatja:

Amikor az SPI periféria engedélyezve van (be van kapcsolva), akkor a MOSI, MISO, SCK és SS lábak adatirányát az AVR automatikusan felülírja az alábbi táblázatnak megfelelően:

Látható hogy csak a bemeneti lábak állapotát állítja be az AVR, a kimeneti lábakat nekünk kell majd az AVR szoftverében beállítani.

AVR SPI regiszterek
Az AVR SPI periféria működése és beállítása 3 regiszterhez kötődik (SPCR, SPSR, SPDR).

SPCR
A különböző SPI működési módok az SPI kontrol regiszter-rel állíthatók be.

  • SPI Interrupt Enable (SPIE): Megszakítás engedélyezés – Ez a bit annak a beállítására szolgál, hogy sikeres adattranszfer esetén legyen-e megszakítás (ehhez az AVR globalis megszakításait is engedélyezni kell az SREG regiszterben).
  • SPI Enable (SPE): SPI periféria engedélyezese. 1 – SPI bekapcsolása, 0 – SPI kikapcsolása
  • Data Order (DODR): adatirány megadása, 1 – az SPI adatregiszter (SPDR) legkisebb helyiértékű bitje (LSB) lesz elsőként elküldve, 0 – az SPI adatregiszter (SPDR) legnagyobb helyiértékű bitje (MSB) lesz elsőként elküldve
  • Master/Slave Select (MSTR): A Master/Slave kiválasztó bittel allítható be, hogy az AVR Master (1) vagy Slave módban (0) üzemeljen.
  • Clock Polarity (CPOL): Az SPI órajel polaritását (az SCK órajel alapszintjét) megadó bit. 1 – SCK alapállapota a logikai magas szint. 0 – az SCK alapállapota a logikai alacsony szint.
  • Clock Phase (CPHA): Az órajel fázisát beállító bit. Megadja, hogy az adatbitek mintavételezése az órajelimpulzus felfutó (0), vagy lefutó (1) élére történjen.
  • Az SCK órajelimpulzus a rendszerórajelből állítható elő leosztással. Az SPI kommunikáció sebességét (a leosztás mértékét) az SPCR regiszterben lévő SPR0 és SPR1, valamint az SPSR regiszterben lévő SPI2X órajelkiválasztó bitekkel állíthatjuk be az alábbi táblázatnak megfelelően:

SPSR

  • SPI Státusz Regiszter (SPSR): ebben a regiszterben van az SPI megszakításjelző bit (SPIF). A jelzőbit értéke logikai 1-re vált, ha 8 adatbit el lett küldve a Master-től a Slave-nek.
  • SPI2X: az SPI kommunikációs sebesség megduplázását beállító órajelkiválasztó bit.

SPDR

  • SPI Adat Regiszter (SPDR): ebbe a regiszterbe kell írni a Master által elküldendő adatbájtot, és a kommunikáció végeztével innen olvasható ki a Slave eszköz által küldött adat.

SPI használata AVR-rel
Az SS láb központi szerepet játszik az SPI beállításánál attól függően hogy milyen kommunikációs módot (Master/Slave) állítottunk be, és hogy az SS lábat ki- vagy bemenetnek állitottuk-e be (a részletekért mindenki nézze meg az ATMega8-as adatlapját).

Ha az SS lábat bemenetnek állítottuk be, akkor Master módban az SS lábat magas állapotban kell tartani, különben alacsony állapotban az SPI-t Slave módba kapcsolja.

Ha az AVR-t Master-nek állítjuk be, akkor az SPI interfész nem irányítja automatikusan az SS vezetéket, ezt szoftveresen kell megtennünk mielőtt elkezdenénk az SPI kommunikációt (lásd később).

Ha az AVR-t Slave-nek állítjuk be, akkor az SPI interfész alszik, amíg az SS láb állapota magas. Ebben az állapotban az AVR-en futó szoftver szabadon változtathaja az SPDR adatregiszter tartalmát, mert az adatokat a hardver nem küldi ki az SCK vezetéken érkező órajelimpulzusok hatására mindaddig amíg az SS láb állapota alacsony nem lesz.

A példáimban Én csak Master módban használom az AVR-t, ezért a továbbiakban ezt tárgyalom.
 

Master módban ha egy adatbájtot írunk az SPI adateregiszterébe, akkor ez elindítja az SPI órajelgenerátort, ami órajelimpulzusokat szolgáltat közvetlenül a Master shift regiszterének és az SCK vonalon keresztül közvetve a Slave shift regiszterének is. Ennek hatására, mint azt már korábban láttuk, minden egyes SCK órajelimpulzusra egyetlen bit lesz kiléptetve a Master shift regiszteréből a MOSI lábon keresztül. Ezt az adatot a Slave eszköz a SI lábon fogadja. Ezzel egy időben ugyancsak egyetlen bit lesz kiléptetve a Slave shift regiszteréből az SO lábon keresztül a Master eszköz MISO lábára. Nyolc SCK órajel impulzus után, éppen egy adatbájtnyi információ cserélődött ki a Master és a kijelölt Slave eszköz között. Egy bájt (8 bit) elküldése után az SPI órajelgenerátor megáll, és az SPI állapotregiszterben (SPSR) az adatküldés végét jelző SPIF jezőbit értéke 1 lesz. Ha az SPCR regiszterben az SPI megszakítást engedélyező SPIE bit értéke 1, és az SREG regiszterben az I bit-tel az általános megszakítások is engedélyezve vannak, akkor egy megszakításkérés jön létre (a megszakításokról részletesebben itt olvashatsz). A Master eszköz ezután folytathatja a kommunikációt a következő bájt elküldésével, vagy lezárhatja a kommunikációt a Slave Select vezetéket magasra állítva.

Az adatküldés egyszeresen pufferelt, az adatfogadás pedig kétszeresen pufferelt. Ez az adatkezelést az alábbi módon befolyásolja:

  1. Az új, elküldendő adatbájt addig nem írható az SPI adatregiszterbe (SPDR) amíg az egész 8 bites küldési ciklus be nem felyeződött.
  2. Az adatáramlás végeztével a beérkező adatbájt azonnal a fogadó pufferbe (Recieve Buffer) íródik.
  3. Amikor adatot fogadunk, akkor a beérkező bájtot a Recieve Buffer-ből még azelőtt ki kell olvasni, mielőtt a következő adatküldési ciklus be nem felyeződik (a következő adatbájt teljesen  meg  nem érkezik), különben a beérkező új bájt a régit felülírja és a korábbi adat elveszik
  4. Az SPDR regiszter értékenek kiolvasásakor a Recieve Puffer-ben lévő adatot olvassuk ki.
     

Az AVR beépített SPI perifériája gondoskodik a beérkező adatok fogadásáról és feldolgozásáról. A fogadott adatokat bájtonként automatikusan az SPI Recieve pufferébe helyezi. Az AVR-en futó programunknak csak arra kell ügyelnie, hogy a beérkezett adatokat a pufferből gyorsabban olvassa ki mint ahogyan azok beérkeznek.

Az AVR programunk kétféleképpen tudja megvizsgálni hogy beérkezett-e adat. Vagy rendszeresen ellenörzi (pollingolja) az SPI státusz regiszter SPIF jelzőbitjét, hogy érkezett-e adat, vagy az SPI beállítható úgy is hogy egy megszakítást generáljon amikor beérkezett egy adatbájt és már kiolvasható a pufferből. Ehhez az SPI kontrol regiszterben az SPIE bit értékenek kell 1-et adni.

Az első dolog amit meg kell tenni mielőtt az SPI perifériát használni kezdenénk, hogy beállítjuk az SS, a MOSI (PB3) és az SCK (PB5) lábakat kimenetnek, a MISO (PB4) lábat pedig bemenetnek. Az alábbi C kód is ezt mutatja:

  1. // MOSI es az SCK lab beallitasa kimenetnek
  2. DDRB = (1<<PB3) | (1<<PB5);

Master mód esetén az SS vonalat bármelyik portra beállíthatjuk (a példákban a 74HC595-ös shift regisztert a PB2-re, az MCP3202-t pedig a PB1-re állítottam be hogy kijelöljem az aktív SPI Slave eszközt).

  1. // A PB1 es PB2 lab beallitasa kimenetnek
  2. DDRB = (1<<PB2) |(1<<PB1);

A portok beállítasa után az SPI perifériát engedélyezni kell az SPI kontrol regiszterben az SPE(SPI Engedélyezese) bit értékenek 1-re állításával. Ugyancsak az SPI kontrol regiszterben be kell állítani az SPI portot Master üzemmódra az MSTR bit értékenek 1-re állításával. Az összes többi bitnél az alapértelmezett logikai 0 értéket használjuk. Azaz az adatirányt megadó bitnél (DODR) a legmagasabb helyiértékű bit küldése először, az SPI órajel alapállapota a logikai alacsony szint (CPOL bit), és a bejövő adatbitek mintavételezése az órajelimpulzus felfutó élénél (CPHA bit). Az SPI órajelének a sebességét is be kell állítani az SPI kontrol regiszterben és a SPI állapotregiszterben a megfelelő bitekkel. Az MCP3202 adatlapjából kiderül, hogy 5V-os tápfeszültség használata esetén a maximális SPI órajel 1.8MHz lehet. A 74HC595-ös shift regiszter adatlapját megnézve pedig látható, hogy ennél az eszköznél 5V-os tápfeszlütség esetén a maximális SPI órajel 25MHz lehet. Ezért az általam használt 7.238MHz-es AVR órajel esetén 16x-os leosztást használva 0.45MHz-es SPI frekvenciát állítok be, amelyen mindkét eszköz képes kommunikálni. Ez a frekvencia az SPCR regiszterben az SPR1=0 SPR0=1, és az SPSR regiszterben az SPI2X=0 értékek megadásával állítható be.

  1. // SPI engedelyezese, Master mod, SPI orajel beallitasa (FCPU/16)
  2. SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

Az SPI periféria beállítása után egy adatbájt elküldéséhez már csak a következőket kell tenni:

  1. A használni kívánt SPI Slave eszközhöz tartozó SS lábat alacsony állapotra kell állítani (az SPI eszköz aktiválása).
  2. Az elküldendő adatbájt SPI adatregiszterbe írása
    1. SPDR = bajtkuld;
  3. Várakozás addig, amíg az SPIF jelzőbit azt nem jelzi, hogy az adat el lett küldve
    1. while(!(SPSR & (1<<SPIF)));
  4. A Slave-től fogadott bájt most már az SPDR regiszterben van, csak ki kell olvasni
    1. bajtfogad = SPDR;
  5. A tovább már nem használt SPI eszköz SS lábának magas állapotra kapcsolása (az SPI eszköz deaktiválása)

A cikk még nem ért véget, lapozz!
Következő: »»   3 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem