|
KOMUNIKACIJE - SPI
SPI je standard za serijsku komunikaciju razvijen od Motorole. Radi se o veoma elegantnom
rešenju za brz i sinhroniziran serijski prenos podataka.
SPI standard za serisku komunikaciju je razvijen od strane Motorolinih inženera, za potrebu brzog i pouzdanog seriskog prenosa podataka. Od samog imena (Serial Peripheral Interface) saznajemo da je to standard primarno predviden za komunikaciju sa perifernim uredajima, ali je moguca i medumikrokontrolerska komunikacija. Postoji široka paleta SPI baziranih perifernih uredaja, od obicnih TTL šift registra, do SPI bazirane memorije, LCD-i, A/D konvertori i.t.d.
Da naglasimo na pocetku da se radi o sinhronoj komunikaciji, tako da je moguce postizanje velikih brzina prenosa, ali zbog toga su fizicka rastojanja izmedu uredaja mala.

Tabela 1. SPI protokol
Iz Tabele 1 vidimo da je SPI komunikacija oko 10 puta brža od SCI komunikacije kada mikrokontroler radi kao master, i 20 puta brža kada mikrokontroler radi kao slave. Takode se vidi da kada mikrokontroler radi kao slave, moguca je brzina prenosa podataka jednakva internom taktu mikrokontrolera.
SPI PROTOKOL
Pri SPI transferu, podatci se šalju preko sift registra sa seriskim izlazom, a primaju preko šift registra sa seriskim ulazom. U bilo kom trenutku može postojati najviše jedan master da bi se osigurala pravilna komunikacija. Kao što vidimo na Slici 1 potrebne su 4 linije odnosno koriste se 4 pina za ovaj tip komunikacije.
MOSI (Master Output Slave Input). Kada mikrokontroler radi kao master, onda je ovo linija za slanje podataka, a kada radi kao slave, ovo je linija za primanje podataka.
MISO (Master Input Slave Output). Kada mikrokontroler radi kao master, onda je ovo linija za primanje podataka, a kada radi kao slave, ovo je linija za slanje podataka. U slucaju da je komunikacija iskljucivo jednosmerna, svakako da se može izvesti sa tri linije (otpadaju MOSI ili MISO zavisno od slucaja).
SCK (SPI Clock). Ovo je linija za takt pod kojim se izvodi komunikacija. Takt daje master, a šift registar slave-a prima podatke, odnosno ocitava ulaz na promenu ovog takta.
SS (Slave Select). Ovaj pin mikrokontrolera se veže na liniju za selektriranje slave-a i visoko nivo na ulazu je neaktivno. Ovo znaci da kada mikrokontroler radi kao slave, i kada je ovaj (u slucaju ulazni) pin na visokom nivou, onda takt sa SCK linije i podaci sa MOSI linije se ignoriraju. Tek kada se dovede SS na aktivno niskom nivou, SPI sistem slave-a prati promene na pinovima koji su vezani za oaj tip komunikacije i moze da primi i pošalje informaciju. Kada mikrokontroler radi kao master, SS pin ima dve opcije. Može da se konfigurira kao ulazni pin i da setuje odredeni flag t.j da inicira interapt u slucaju da bude doveden na niskom nivou. To je dobra opcija za meduprocesorsku komunikaciju. Na ovaj nacin može uspešno da se odstarni mogucnost da dva ili vise mikrokontrolera u datom trenutku pokušaju da budu master-i. Ovo svakako treba rešiti softverski. SS pin takode moze da se konfigurira kao izlazni pin, i da selektira neki slave, ili da vrsi bilo kakvu funkciju nezavisnu od SPI podsistema mikrokontrolera.
| U
slucaju povezivanja više mikrokontrolera preko SPI kanala, svi MISO
pinovi se vežu zajedno na jednu liniju, svi MOSI pinovi se vežu
zajedno na drugu liniju, i svi SCK pinovi se vežu zajedno na trecu
liniju kao sto je prikazano na Slici 1. Slika 1 je primer vezivanja
kada samo jedan mikrokontroler moze da bude master. Ako uloga
mastera treba da bude promenljiva, onda svaki mikrokontroler treba
da ima pojedinacnu vezu sa SS pinovima ostalih mikrokontrolera.
Zamislimo dva šift registra vezani kao na Slici 2. Neka sa strane sa koje su povezani medusobno, registri imaju seriske ulaze i izlaze. Kakvi su ulazi i kakav je hardver logike rada, to nas ne interesuje. Pinovi za podatke (DATA1) su povezani zajedno, i to je jednosmerna linija sa koje šift registar 1 daje podatke šift registru 2. Pinovi za podatke (DATA2) su povezani zajedno, i to je jednosmerna linija sa koje šift registar 2 daje podatke šift registru 1. Pinovi za takt (CLOCK) su povezani zajedno, i to je jednosmerna linija sa koje šift registar 1 daje takt bez razlike u kojem smeru idu podaci. Pinovi za omogucavanje komunikacije (ENABLE) su vezani zajedno, i to je jednosmerna linija preko koje šift registar 1 omogucava t.j. dozvoljava šift registru 2 da radi. Svakako u analogiji sa SPI mikromikrokontrolerskom komunikacijom, šift 1 radi kao master, a šift 2 radi kao slave. |

|
| Slika 1. Povezivanje jednog mastera i dva slejva u SPI komunikacij |
| |
 |
| Slika 2. Hardverska
šema SPI komunikacije |
Kada jedinica šalje poruku dvojki, redosled operacija je sledeci:
1. Preko linije ENABLE, jedinica omogucava rad dvojke ili preciznije omogucava da dvojka na svakom prelazu na liniji CLOCK iz visokog na nisko nivo (ili obrnuto zavisno od logike), procita stanje na liniju DATA 1
2. Preko linije CLOCK jedinica daje takt pod kojim dvojka cita promene koje daje jedinica na liniju za podatke DATA 1.
3. Kada jedinica završi sa prenosom, onda stavlja linije CLOCK i ENABLE u stanje mirovanja (idle state).
Kada jedinica želi da dobije informaciju od dvojke, preduslov koji treba da je ispunjen je da dvojka vec ima spremnu informaciju koju treba da pošalje. Zadnja pretpostavka u analogiji mikromikrokontrolerske SPI komunikacije znaci da smo u registar za slanje slave-a programski vec postavili informaciju koja se trazi. Znaci redosled operacija je:
1. Preko linije ENABLE, jedinica omogucava rad dvojke ili preciznije omogucava da dvojka na svakom prelazu na liniji CLOCK iz visokog na nisko nivo (ili obrnuto zavisno od logike), po potrebi promeni stanje na liniju DATA 2
2. Preko linije CLOCK jedinica daje takt pod kojim ce citati promene koje daje dvojka na liniju za podatke DATA 2. Ili obrnuto receno, dvojka preko linije CLOCK, dobija takt pod kojim ce slati signale.
3. Kada dvojka završi sa prenosom, onda jedinica stavlja linije CLOCK i ENABLE u stanje mirovanja. Jedinica zna da je prenos zavrsen kada (na primer kod osmobitnih informacija), na liniji CLOCK se završi osmi ciklus.
Ovo je primer koji opisuje SPI logiku, a pri tome ne ulazi u pojedinosti interne periferije samog mikrokontrolera. Relativno je lako da se pošalje poruka preko SPI kanala od master-a do slave-a, pomocu tehnicke literature koja prati Motoroline mikrokontrolere. Mnogo je teže i nerazumljivije da izvedemo komunikaciju u obrnutom smeru. Ne mogu da kazem za druge proizvodace, jer nisam imao prilike i potrebe za rad sa SPI podsistemima drugih mikrokontrolera. Najbitnija stvar koju bi želeo da naglasim ovim tekstom jeste nacin slanja podataka slave-master.
U kom trenutku treba slave da pošalje poruku, odlucuje master. On tada daje takt na linili CLOCK. Da bi dao takt, zbog automatizovanosti SPI kontrolne i upravljacke logike, master u stvari mora da pošalje poruku na magistralu i normalno da selektira slave-a.
Sve navedeno opisuje suštinu SPI komunikacije. Svakako da ima mnogo detalja koji variraju u zavisnosti od mikrokontrolera i perifernog uredaja, ali to se mnogo lakše usvaja kada se znaju osnovni principi.
SERIJSKI SPI EEPROM
U novije vreme dosta su aktuelni serijski EEPROM-i. U slucaju paralelne spoljašne memorije gubimo dragocene pinove, t.j. cele porte, što u mnogim aplikacijama je veliki problem. Seriske spoljašne memorije koriste seriski kanal mikrokontrolera koji može da opslužuje više uredaja. Znaci seriske memorije mogu mnogo lakše da se prikljuce u sistem, a da pri tom ne okupiraju dodatne pinove. Postoje varijacije na temu seriske memorije u zavisnosti od tipa memorije i protokola za komunikaciju. Svakako tu su neprikosnoveni EEPROM-i od aspekta tipa memorije zbog lakoce pisanja i brisanja. Dosta popularan tip seriske komunikacije je SPI, a koriste ga mnogi proizvodaci mikromikrokontrolera i ogroman broj proizvodaca periferija. U narednom delu ovog pasusa bice ukratko objašneni princip funkcioniranja SPI EEPROM-a kada želimo da procitamo njegov sadržaj, i funkcije nekih pinova koji su bitni za ovaj clanak.
Na Slici 3 je prikazana opšta šema jednog Microchip-ovog SPI EEPROM-a 25C160 povezanim sa mikromikrokontrolerom 68HC11F1. Oznake i funkcije pinova Microchip-ovog SPI EEPROM-a koji su na Slici 3 su:
CS (Chip Select) Ovaj pin mora da bude na niskom nivou da bi memorija bila selektovana.
SI (Serial Input) Serijski ulaz za instrukcije adrese i podatke. Podatci se citaju (latched) na usponskoj ivici takta.
SO (Serial Output) Seriski izlaz. Podatci na ovom pinu se menjaju na padajucu ivicu takta.
SCK (Seial Clock) Ulaz za takt. |
 |
| Slika 3. SPI komunikacija mikrokontrolera i EEPROM-a |
ČITANJE
Cip se selektira dovodenjem niskog nivoa na pin CS. Onda mora na pin SI da se pošalje instrukcija za citanje koja u našem slucaju je $03. Posle instrukcije za citanje kontrolna logika memorije ocekuje 16 bitnu adresu sa koje treba da procita sadržaj. Posle korektno primljene instrukcije za citanje i adrese, traženi sadržaj se postavlja na izlazni šift registar povezan sa pinom SO. Ovaj sadržaj se šalje uz uslov da takt na pinu SCK produži. Podatak sa naredne adrese se cita sa produžavanjem takta na pinu SCK. Tada unutarnji adresni pointer se inkrementira automatski i novi podatak se izvodi preko SO. Ako se dostigne najveca adresa, adresni brojac dobija vrednost $0000 i odatle se nastavlja citanje.
PRIMER POVEZIVANJA MIKROKONTROLERA I SERIJSKOG EEPROMA
POMOĆU SPI KOMUNIKACIJE
Asemblerski program koji sledi, cita deo sadržaja SPI EEPROM-a i procitani sadržaj upisuje u RAM mikromikrokontrolera. Da napomenemo samo da RAM kod 68HC11F1 pocinje od adrese $0000, EEPROM od $FE00, a SPI EEPROM kod 25C160, od $0000. U našem slucaju mikrokontroler ce procitati sadržaj serijskog EEPROM-a od adrese $0007 do $000C i postavice sadržaje istim redosledom u RAM mikromikrokontrolera od adrese $0000 pa nadalje.
Na pocetku programa su odradene sve potrebne inicijalizacije i definisanja adrese sistema. Kao što vidimo od linije 89, program pocinje da se izvršava od linije 47 (Inicijalizacija programa). Zatim sledi inicijalizacija SPI kanala. Podešavaju se pinovi za ulaze ili izlaze, polaritet i faza takta i pocetno se prazni registar za podatke. Podešavanja polariteta i faze takta omogucuju da se prilagodi mikromikrokontroler na bilo kakvoj SPI periferiji.
Sa linije 60 zapocinje sekvenca citanja. U indeksni registar Y se stavlja pocetna adresa RAM-a gde ce zapoceti upisivanje. Zatim se priprema adresa seriskog EEPROM-a $0007 sa koje ce poceti citanje. U liniji 65 se selektira EEPROM dovodenjem niskog nivoa na njegov CS pin. Zatim u linije 66 i 67 se šalje kod za citanje. Potprogram za primopredaju se nalazi od linije 82 do linije 85. Iz ovog dela vidimo da je sama SPI komunikacija potpuno automatizovana. Znaci, pošto smo poslali kod za citanje, od linije 68 do 71 šaljemo 16 bitnu adresu sa koje ce poceti citanje. Sa linije 72 se šalje ista poruka kao sa linije 71. To je bitno kod SPI komunikacije što smo naglasili u objašnjavanju protokola. Potrebno je produžavanje takta koji prima memorija i ona automatski nastavlja da šalje sadržaje sa sledecih memoriskih lokacija sve dok traje takt. Linije od 74 do 76 služe da se procita onoliki broj lokacija koliko treba i da se izade iz petlje preko linije 79 naravno deselektirajuci EEPROM u prethodnoj liniji. Linija 87 produžava program, i odavde možemo na primer da produžimo program sa obradom procitanih podataka.
x
|
LISTING PROGRAMA |
|

|
|