Licho nie SPI

Licho nie SPI
Razem głosów: 7 co stanowi: 94.29% całości.

PrzechwytywanieWielu ma kłopoty z magistralą SPI dlatego właśnie pragnę poruszyć ten temat i rozprawić się z potworą raz na zawsze. Mam nadzieję że będzie to pomocne i zarazem wyczerpujące.

:> JEDZIEMY:

SPI pozwala w bardzo prosty sposób na synchroniczne przesyłanie danych między różnymi urządzeniami w tym samym czasie. Protokół ten został opracowany przez firmę Motorola i przyjął się w wielu urządzeniach oraz mikrokontrolerach. Zwykle rozróżniamy 2 wersje SPI – sprzętowe i programowe. Dodatkową zaletą SPI jest fakt iż może być stosowane w urządzeniach jednocześnie z I2C (o tym innym razem). Cały protokół transmisji może być jak już wiemy zawarty w oprogramowaniu, ale w mikrokontrolerach AVR oraz innych, mamy dostęp do sprzętowego SPI co znacznie skraca czas opracowywania oprogramowania.

:>  SPRZĘT:

atmega8-pinout

Tu ładnie widać umieszczenie pinów SPI w ATMegach w obudowie DIP28

Jak więc już zauważyliście SPI używa 4 pinów :

SCK  — System Clock

MOSI — Master Output Slave Input

MISO — Master Input Slave Output

SS — Slave Select

O popatrzcie jak fajnie nazwy podpowiadają konfiguracje pinów, ale w różnych urządzeniach piny mogą mieć inne alternatywne nazwy co może wprowadzić nieobeznanych w lekką frustrację i zdenerwowanie więc zobaczmy jakie to są typowo stosowane nazwy inne:

 

SCK   =  CLK 

MISO =  SOMI, SDO, DO, DON, SO 

MOSI =  SIMO, SDI, DI, DIN, SI

SS     =  CS, CBS, CSN, STE, SCE

 

Jak więc widać trochę się różnią nazwami , a oznaczają to samo. Dodatkowo połączenie jest bardzo proste i nie wymaga żadnych elementów zewnętrznych jak np. Pull-Up  znane z I2C. Ale każde urządzenie Slave wymaga specjalnej linii SS w celu zapewnienia obsługi trybu multi BUSS Slave, co oznacza, że każde urządzenie SLAVE na magistrali ma wszystkie piny SPI wspólne, a SS osobny.

Wyjaśnią to 2 rysunki poniżej :

——> Tryb single slave

SPI - Single Slaves

——> Tryb multi slave

SPI - Multi Slaves

Prawda że jest wszystko jasne i klarowne ??  Tak, nie ma żadnych kruczków, o dziwo to naprawdę i tak prosto wygląda i takie proste jest przynajmniej od strony sprzętowej :)

:> PRZYNUDZANIE  CZYLI TROCH? TEORII

 

Tak, tak, trochę teorii musi być więc troszkę po przynudzam rozważaniami teoretycznymi  na temat komunikacji po SPI , ale bez tego ani rusz ….

Widoczny poniżej obrazek przedstawia typowy schemat blokowy połączeń 2 urządzeń poprzez SPI i gotowych do komunikacji.

Free Image Hosting at www.ImageShack.us

Jak więc widać urządzenie MASTER generuje sygnał zegara SCK dla całego systemu i dodatkowo odpowiada za wybranie układu SLAVE, z którym chce rozmawiać. Stan niski na linii CS (SS) będzie decydować, które urządzenie będzie źródłem. Częstotliwość taktowania magistrali (SCK) powinna być ustawiona na mniej lub równą maksymalnej szybkości najwolniejszego urządzenia SLAVE podłączonego do magistrali.  Gdy urządzenie dostanie Sygnał CLK (SCK) odczyta stan pinu MOSI , a MASTER odczyta stan pinu MISO. AVRy używają 8 bitowego rejestru przesuwnego (co widzicie wyżej), a to oznacza że po 8 impulsach zegara układy MASTER i SLAVE wymieniają 8bitów danych i tak wkoło aż przejdzie cała paczka.

 

:> REJESTR PRZESUWNY

 

Skoro już jest to wypada go opisać, no nie ??  Tak wiem, wydaje się to trochę bez sensu i głupie przecież każdy wie jak działa rejestr przesuwny :) . Ale muszę po nudzić trochę :) Więc tak powiedzmy że mamy przeprowadzić transmisję z układu MASTER do SLAVE. Najbardziej znaczący bit (MSB lub 7bitów) z MASTERA będzie przesuwane do najmniej znaczącego bitu (LSB lub 0bitów) układu SLAVE (linia MOSI na rysunku wyżej). W układzie SLAVE MSB zostanie zepchnięte na LSB MASTERA (linia MISO na rys. wyżej). I tym sposobem po 8 zmianach zawartość obu rejestrów zostanie wymieniona między sobą.  Mam nadzieję że jest to jasne :)

:> POLARYZACJA ZEGARA I FAZY ZEGARA

Wbrew temu co wam się może wydawać to ważne zagadnienie i wcale nie takie proste :) Ale sprowadza się do tego że musimy ustawić TRYB SPI, który składa się z 2 ustawień biegunowości zegara i fazy zegara co widać w tabelce poniżej:

                   Mode                   CPOL                   CPHA
 0  0  0
 1  0  1
 2  1  0
 3  1  1

No dobra. Fajnie, ale co to są te tryby i co robią ??

Polaryzacja zegara decyduje czy dane są wysyłane na zboczu narastającym czy opadającym. Jeśli CPOL ustawimy na 0 (LOW) dane są wysyłane/odbierane na zboczu narastającym, a stan pinów jest aktualizowany (do następnego odczytu 0 na zboczu opadającym. Natomiast jeśli CPOL ustawimy na 1 (HI) dane będą wysyłane i odbierane na zboczu opadającym , a stan pinów jest aktualizowany (do następnego odczytu) na zboczu narastającym.

Faza zegara natomiast o odczycie danych. Jeśli CPHA ustawimy na 0 (LOW) dane będą czekać na zbocze zegara , a jeśli CPHA jest na 1 (HI) dane będą oczekiwać wzrost zegara.

Zresztą wyjaśni to najlepiej rysunek :

Free Image Hosting at www.ImageShack.us

 

::> Rejestry

Hmm, no będzie trochę suchych tabelek po prostu, no bo co więcej tu dać i lakoniczny opis zjawiska w sumie nuda i nic ciekawego …. A każdy by chciał zobaczyć jak coś działa, no nie :)

Przyglądnijmy się teraz kilku tabelkom:

7 bit  6 bit  5 bit  4 bit  3 bit  2 bit  1 bit  0 bit 
SPCR SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0

Rejestry kontrolne SPI (SPI Control Register)

 Tryb  CPOL   CPHA
 0  0  0
 1  0  1
 2  1  0
 3  1  1

Tryby SPI  (SPI Modes)

7 bit  6 bit  5 bit  4 bit  3 bit  2 bit  1 bit  0 bit 
SPSR SPIF WCOL SPI2X

Rejestry Statusu SPI  (SPI Status Register)

 

 

 SPI2X  SPR1   SPR0   SCK Frequency
 0  0  0  Clock / 4
 0  0  1  Clock / 16
 0  1  0  Clock / 64
 0  1  1  Clock / 128
 1  0  0  Clock / 2
 1  0  1  Clock / 8
 1  1  0  Clock / 32
 1  1  1  Clock / 64

Zegar FSD (System Clock Division Factor)

 

7 bit  6 bit  5 bit  4 bit  3 bit  2 bit  1 bit  0 bit 
SPDR MSB LSB
Rejestry Danych (SPI Data Register)
Ładne tabelki prawda ?? :) , no ale zdało by się małe wyjaśnienie.
Ustawienie bitu SPE w rejestrze SPCR uruchamia SPI.
Ustawienie bitu SPIE (1) umożliwia przerwanie od SPI.
Bit DORD w rejestrze SPCR kontroluje kierunek transmisji. Domyślnie jest ustawiony
na (0) co oznacza, że pierwszym przesyłanym bitem będzie MSB, a ostatnim LSB, jeśli jednak będzie on ustawiony na (1) przesył będzie odwrotny czyli najpierw LSB, a na końcu MSB.
Bit MSTR w SPCR odpowiada za to czy AVR jest MASTER czy SLAVE. Działa to tak:
jeśli pin SS jest ustawiony jako wejście gdy AVR jest w trybie MASTER , a SCK ma
stan (0) bit MSTR zostanie wyczyszczony i ustawiony na (0) to musimy ustawić go
na HI (1) aby ponownie ustalić tryb MASTER.
W skrócie:
MSTR = 0 (Low)  = SLAVE
MSTR = 1 (Hi)  = MASTER
Bit SPIF w rejestrze SPSR ustawia (1), gdy transmisja danych jest kompletna, nawet
jeśli przerwania nie są włączone. Jest to bardzo przydatne ponieważ wystarczy
sprawdzić stan bitu SPIF żeby sprawdzić czy bezpiecznie możemy cos zapisać do
rejestru SPDR.
Zapis do rejestru SPDR powoduje załadowanie danych do rejestru przesuwnego i wyzwala automatycznie transmisję czyli nadawanie, natomiast odczyt z rejestru
SPDR powoduje pobranie danych z rejestru przesuwnego czyli odbiór.
WCOL w rejestrze SPSR zostanie ustawiony na (1) przy próbie zapisu danych
w rejestrze SPDR podczas transmisji danych. Bit WCOL zostanie wyczyszczony (0)
gdy SPDR będzie pusty.
To tyle czas na Software :)
 
 
:> Oprogramowanie …. nareszcie ?
Zajmiemy się tu babcią AtMegą8 dlaczego ?? dlatego, że w sumie pisząc na M8, możemy używać tych samych rejestrów na na nowszych Megach jak 48/88/168/328.
Tak po za tym i tak niema to znaczenia bo zasadniczo SPI jest wszędzie takie samo,
a nazwy rejestrów i piny możemy sobie sprawdzić w nocie układu:)
Dlatego zamieszczone kody będą dla ATmegi8  oraz xx8 :)

Kod MASTER!

Kod SLAVE!

To proste kody jak widzicie, ale pozwalają na komunikację 2ch układów po SPI

lub po małej modyfikacji z większą ilością, gdyż możemy zrobić sobie więcej sleavów.

Oczywiście alternatywnie możemy zrobić to samo , ale z użyciem przerwań :

 

Kod MASTER!

Kod SLAVE!

Mam nadzieję, że się dobitnie rozprawiliśmy z tematem SPI i rozwiałem wszelkie obawy przed stosowaniem

SPI oraz z łaczeniem 1 i więcej układów. Wysokich transferów ….

 

 

 

 

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay