SVETELEKTRO

14. septembra 2012   Verzia pre tlač Verzia pre tlač

Programujeme AVR v jazyku C – 9. časť


zawin

Rozhranie SPI, popis registrov a ukážkový program

Popis rozhrania SPI (sériové periférne rozhranie)

Najčastejšie sa používa na komunikáciu mikropočítača s ostatnými perifériami (AD-prevodník, EEPROM, displeje a pod.). V systéme využívajúcom rozhranie SPI môže byť zapojených dva alebo viac obvodov, pričom jeden z nich je označovaný ako Master (riadi komunikáciu), ostatné sú označované ako Slave.

 

Komunikácia prebieha pomocou štyroch vodičov MOSI, MISO, SCK, SS nasledovne:

–          Dátový výstup Master obvodu MOSI (Master Out, Slave In), je pripojený na vstupy MOSI všetkých obvodov Slave

–          Dátový vstup Master obvodu MISO (Master In, Slave Out), je pripojený na výstupy MISO všetkých obvodov Slave

–          Hodinový signál SCK, generovaný Master obvodom, je pripojený na vstupy SCK všetkých obvodov Slave

–          Každý obvod Slave má vstup SS (Slave select) alebo označovaný aj ako CS (Chip Select). Pokiaľ je vstup SS v neaktívnom stave,  rozhranie SPI daného obvodu je neaktívne a jeho výstup MISO je v stave vysokej impedancie.  Vstupy SS jednotlivých obvodov sú samostatnými vodičmi pripojené k obvodu Master. Pomocou týchto vodičov teda možno jednoducho vyberať obvod, s ktorým máme v danom okamihu komunikovať.

 

Ukážka komunikácie MCU s viacerými perifériami pomocou rozhrania SPI:

Obr. č.1: Komunikácia pomocou rozhrania SPI (prebraté s wikipedia.org)

 

Priebeh komunikácie rozhrania SPI:

–          Na začiatku komunikácie nastaví Master pin SS do log. 0 na zariadení, s ktorým chce komunikovať.

–          Následne začne generovať hodinový signál SCK a v tej chvíli pošlú obe zariadenia (Master aj Slave) svoje dáta. Master cez pin MOSI, Slave cez pin MISO.

–          Akonáhle sú dáta vyslané môže komunikácia ďalej prebiehať pokiaľ Master dodáva hodinový signál a hodnota SS je stále v log. 0.

–          Master ukončí komunikáciu uvedením SS do stavu log. 1.

 

Polarita a fáza hodinového signálu

Vzťah medzi hodinovým signálom a dátami sa určuje pomocou dvoch konfiguračných bitov CPOL a CPHA.

Ich význam je nasledovný:

–          CPOL = 0, hodnota hodinového signálu v stave nečinnosti je log. 0

–          CPOL = 1, hodnota hodinového signálu v stave nečinnosti je log. 1

–          CPHA = 0, dáta sú snímané nábežnou hranou hodinového signálu

–          CPHA = 1, dáta sú snímané dobežnou hranou hodinového signálu

Prenos dát pri rôznych nastaveniach CPOL a CPHA možno vidieť na nasledovných obrázkoch:

 

 
 

Obr.č.2:  CPHA = 0, dáta sú snímané nábežnou hranou

 

 

 
 

Obr. č.3.: CPHA=1, dáta sú snímané dobežnou hranou

 

Pozn.:  Správne nastavenie bitov CPOL a CPHA býva zväčša uvedené v datasheete daného obvodu. Preto si vždy overte toto nastavenie, aby ste sa vyhli prípadným problémom.

 

Rozhranie SPI mikropočítača Atmega8

Parametre:

–          Obojsmerný (Full-duplex) synchrónny prenos prostredníctvom troch vodičov.

–          Režim „MASTER“ alebo „SLAVE“

–          Prenos začína LSB, alebo MSB

–          Sedem programovateľných prenosových rýchlostí

–          Príznak prerušenia pri ukončení prenosu

–          Nastavenie príznaku pri kolízii

–          Aktivácia procesora z „Idle“ režimu

–          Dvojnásobná rýchlosť (Ck/2)

 

 
 

Obr. 4. Bloková schéma SPI rozhrania

 

V jednoduchosti systém pozostáva z dvoch posuvných registrov (jeden pre vysielanie, druhý pre príjem) a generátora hodinového signálu. Systém SPI sa vyznačuje jednoduchou vyrovnávacou pamäťou v smere vysielania a dvojitou pri prijímaní dát. To znamená, že bity, ktoré sú vysielané nemôžeme zapisovať do SPI dátového registra pred tým, než je kompletne vyslaný predchádzajúci byte. Pri príjme údajov môžeme predchádzajúci byte čítať v priebehu príjmu nasledujúceho bitu. Predchádzajúci byte musíme prečítať pred tým než je kompletne prijatý ďalší byte. V režime Slave riadiace obvody vzorkujú prichádzajúci hodinový signál na vstupe SCK. Frekvencia hodinového signálu SPI nesmie prekročiť hodnotu fOSC/4.

 

Funkcia pinu SS mikropočítača:

a) v Master móde:

Ak je pin nastavený ako výstupný nepreberá automaticky v režime Master riadenie na vodiči SS. Toto riadenie musí byť realizované pomocou užívateľského programu počas komunikácie.

Ak je pin SS nastavený ako vstupný v režime Master, musíme ho udržiavať v log. 1 pokiaľ požadujeme Master mód. Pri privedení pinu SS do stavu log. 0 sa rozhranie SPI prepne do Slave modu a čaká na prijatie dát.

 

b) v Slave móde:

Ak je rozhranie SPI nastavené na režim SLAVE, potom pin SS bude vždy vstupný. Pokiaľ privedieme pin SS do stavu log. 0, aktivujeme SPI rozhranie. V opačnom prípade je rozhranie SPI neaktívne a nie je možné prijať žiadne dáta.

 

Popis registrov

Riadiaci register SPCR – SPI control register

–          Riadiaci register SPCR je využitý na riadenie činnosti jednotky SPI.

 

Bit 7 – SPIE: Povolenie prerušenia od SPI, SPI Interrupt Enable

            Ak bit SPIE obsahuje hodnotu log.1 a súčasne sú globálne  povolené prerušenia, potom pri nastavení bitu SPIF bude generovaná žiadosť o obsluhu prerušenia.

Bit 6 – SPE: Povolenie činnosti jednotky SPI, SPI Enable

                Ak bit SPE obsahuje hodnotu log.1, potom je povolená činnosť jednotky SPI.

 

Bit 5 – DORD: Poradie dát, Data Order

            Ak bit DORD obsahuje hodnotu log.1, potom prenos dát začína od LSB (najmenej významného bitu). Ak bit DORD obsahuje hodnotu log.0, potom prenos dát začína od MSB (najvýznamnejšieho bitu).

 

Bit 4 – MSTR: Výber režimu MASTER/SLAVE, Master/Slave select

            Pomocou  bitu MSTR volíme režim jednotky SPI. Ak bit MSTR obsahuje hodnotu log.1 bude jednotka SPI v režime MASTER. V opačnom prípade bude SPI v režime SLAVE. Ak je vývod /SS  konfigurovaný ako vstupný a je naň privedená log. 0, pričom je bit MSTR   log.1, potom sa bit MSTR vynuluje a príznak SPIF sa nastaví na hodnotu log.1.

 

Bit 3 – CPOL: Nastavenie polarity hodinového signálu, Clock Polarity

            Ak je bit CPOL  nastavený na hodnotu log. 1 bude hodinový signál SCK v stave nečinnosti v log. 1 v opačnom prípade v log. 0. (viď obr. 2 a 3)

 

Bit 2 – CPHA: Nastavenie fázy hodinového signálu, Clock Phase

            Ak je bit nastavený do log. 1, budú dáta vzorkované na dobežnú hranu hodinového signálu. V opačnom prípade na nábežnú hranu. (viď obr. 2 a 3)

 

Bity 1, 0 – SPR1, SPR0: Nastavenie generátora hodín, SPI Clock Rate Select 1 a 0

            Ak SPI je v režime MASTER, potom pomocou obsahu bitov SPR1 a SPR0 je možné nastaviť frekvenciu hodinového signálu SCK. Vzťah medzi signálom SCK a frekvenciou oscilátora fosc je uvedený v nasledujúcej tabuľke.

 

SPI2X

SPR1

SPR0

Frekvencia SCK

0

0

0

fosc/4

0

0

1

fosc/16

0

1

0

fosc/64

0

1

1

fosc/128

1

0

0

fosc/2

1

0

1

fosc/8

1

1

0

fosc/32

1

1

1

fosc/64

Tab.1 Voľba frekvencie hodinového signálu SCK

 

Stavový register jednotky SPI – SPSR

 

Bit 7 – SPIF: Príznak prerušenia od SPI, SPI Interrupt Flag

            Po skončení sériového prenosu dát sa príznak SPI nastaví na hodnotu log. 1. V prípade, že je povolené prerušenie bude generovaná aj žiadosť o obsluhu prerušenia. Aj v prípade, ak na vývod /SS, ktorý je v režime MASTER konfigurovaný ako vstup privedieme log. 0,  sa nastaví príznak SPIF. Príznakový bit SPIF je nulovaný automaticky po skončení zodpovedajúcej obsluhy prerušenia. Príznakový bit SPIF je tiež nulovaný čítaním SPI stavového registra, prípadne prístupom k SPI dátovému registru.

 

Bit 6 – WCOL: Príznak kolízie pri zápise, Write Collision Flag

            Bit WCOL sa nastaví na hodnotu log.1 ak do SPI dátového registra sa zapisuje počas prenosu dát. Bit WCOL je nulovaný čítaním SPI stavového registra, prípadne prístupom do SPI dátového registra.

 

Bity 5. . .1: Nevyužité bity

           

Bit 0 – SPI2X: Bit dvojnásobnej rýchlosti SPI, Double SPI Speed Bit

            Keď bit SPI2X má hodnotu log.1, potom v prípade, ak jednotka SPI je v režime MASTER bude frekvencia hodinového signálu SCK dvojnásobná.

 

 

Údajový register SPI – SPDR

Údajový register SPDR sa využíva na prenos dát medzi poľom univerzálnych registrov a posuvným registrom SPI. Zápisom do registra SPDR inicializujeme prenos dát. Čítanie registra spôsobí prečítanie obsahu posuvného registra SPI.

 

 

Praktická realizácia prenosu dát cez SPI

 

Zapojenie mikropočítača atmega8 pre prenos dát cez SPI

schema.png

Obr č. 5: Zapojenie MCU Atmega8 pre prenos dát cez SPI

 

Obvod pripojíme cez rozhranie SPI s mikropočítačom pomocou 4 vodičov SS, MOSI, MISO, SCK (viď popis na začiatku článku). Pokiaľ chceme pripojiť viacero obvodov cez SPI ku mikropočítaču, využijeme ďalšie voľne piny mikropočítača pre riadiace signály SS pre ďalšie zariadenia

 

Práca s knižnicou na obsluhu rozhrania SPI

Pre jednoduchšiu prácu s rozhraním SPI na mikropočítači Atmega8 som sa rozhodol naprogramovať knižnicu na jeho obsluhu. Pomocou nej si ukážeme ako inicializovať SPI a ako prenášať dáta. 

 

Knižnicu určenú pre mikropočítač atmega8 si môžete stiahnuť tu: spi.zip

 

V AVR studio 4 vytvoríme nový projekt, následne vo vytvorenom adresári projektu pridáme súbory knižnice (spi.c, spi.h). Tieto súbory taktiež pridáme aj do nášho projektu v AVR studio. Ak sa nám to podarilo môžeme otestovať náš prvý program.

 

Pre správnu činnosť nezabudnite správne nastaviť bity CPOL a CPHA. Tieto bity možno nastaviť vo funkcií  InitSPI(void), konkrétne zápisom do registra SPCR (viď popis registrov vyššie). V hlavičkovom súbore sa nachádzajú okrem definície portov rozhrania aj makrá select() a desect() ktorými riadime pin SS.

 

Ukážkový program:

Ako sa vám páčil tento článok?
  • Páči sa mi (0)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)
Najnovšie články od zawin (zobraziť všetky)

Komentáre (3)

  1. PeCha píše:

    V prvom rade ďakujem za tento skvelý návod pre prácu s AVR MCU. Konečne niečo na úrovni v slovenčine.
    Mal by som aj jednu prosbu. Snažím sa o komunikáciu cez SPI medzi dvoma mikroprocesormi ATmega162 a ATmega16A. Používam AtmelStudio 6. V programe najprv iniciujem MASTRA a potom sa snažím vložiť príkazom SPDR=0x41 hodnotu do datového registra. Zdá sa mi, že sa do registra nič nezapíše. Dokonca aj keď pozerám chod programu v AVRsimulatore, po príkaye sa nič do registra nezapíše. Stále tam zostáva 0x00. Mal by som vidieť v okne IO Viev, počas simulácie behu programu, hodnotu vloženú do registra SPDR?
    Ďakujem za radu.

  2. tusakxxl píše:

    Tu by sa hodil maly program na ukážku 😛 Stále to nemôžem rozhybať :/ PS: som uplny začiatočník 😛

Pridaj komentár