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
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. 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
SPSR
SPDR
SPI használata AVR-rel 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 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:
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).
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.
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:
A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |