Interfejs SPI w mikrokontrolerach Atmega

Dziś napiszę kilka słów na temat SPI. Temat o tyle ciekawy, że spotykany często w mikrokontrolerach – a raczej przy okazji, gdy zachodzi potrzeba podłączenia urządzeń, które interfejs ten wykorzystują. O ile podłączenie urządzenia jest banalnie proste, to jeśli zachodzi potrzeba podłączenia więcej niż jednego urządzenia przy pomocy SPI, pojawiają się kłopoty. Myślę, że wynikające z niewiedzy początkujących, którzy nie rozumieją zasady działania interfejsu.

Co to jest SPI?

SPI (ang. Serial Peripheral Interface) – to interfejs szeregowy dla urządzeń peryferyjnych, takich jak na przykład zegar RTC, pamięci (EEPROM, flash, MMC/SD) czy przetworników. SPI jest jednym z najbardziej popularnych interfejsów, zaś komunikacja odbywa się za pomocą 3 linii:

  • MOSI (ang. Master Output Slave Input) – służy do przesyłania danych dla układu peryferyjnego;
  • MISO (ang. Master Input Slave Output) – do odbierania danych z układu peryferyjnego;
  • SCLK (ang. Serial Clock) – czyli zegarowy sygnał taktujący.

Zatem szeregowy interfejs SPI jest trójprzewodowy i składa się z dwóch linii synchronicznie przesyłających dane (w przeciwnych kierunkach) oraz linii, która dostarcza sygnał taktujący, którego zadaniem jest synchronizacja transferu danych. W interfejsie SPI transfer danych odbywa się w układzie master-slave (zwykle master to po prostu mikrokontroler), zaś w przypadku, gdy w projektowanym systemie istnieje więcej niż 1 mikrokontroler, jedynie jeden z nich w danej chwili pełni rolę mastera. Zasada działania interfejsu oparta jest na rejestrach przesuwnych umieszczonych w urządzeniach master i slave oraz na zegarze generowanym przez master – generator taktujący znajduje się zawsze w układzie nadrzędnym.

Przykład: gdy master zamierza wysłać bajt danych (A) do slave, ale jednocześnie otrzymać inny bajt danych od slave (B):

  1. Przed rozpoczęciem komunikacji, master umieszcza A we własnym rejestrze przesuwnym, zaś slave umieszcza B w swoim rejestrze przesuwnym. (Rysunek 1-a).
  2. Master generuje 8 impulsów zegarowych a zawartość rejestru przesuwnego master jest przenoszona do rejestru przesuwnego slave’a i na odwrót (rysunek 1-b do 1-e).
  3. Na końcu impulsów zegarowych, master otrzymał całkowicie B, a slave otrzymał A.
  4. Zatem transmisja i odbiór odbywa się w tym samym czasie, w pełnym dupleksie.
Transmisja SPI w układzie Master-Slave[2]

Przesyłowi danych danych na linii MOSI przez master zawsze towarzyszy nadawanie danych na linii MISO przez układ slave, jednakże nie zawsze dane niosą informacje. Często bowiem w jednym kierunku nadawane są dane niosące informacje, podczas gdy w drugim są nadawane puste dane.

Najprostszy przykład połączeń – jedno urządzenie master i jedno urządzenie slave (źródło: Wikipedia)

Dotychczasowy opis jest w mojej opinii jasny i nie wymaga dodatkowych wyjaśnień, zaś mikrokontrolery Atmega posiadają wyprowadzenia MOSI, MISO oraz SCK, to jednak problem pojawia się wówczas, gdy zachodzi potrzeba podłączenia do interfejsu więcej niż jednego urządzenia. Jak widać na obrazku powyżej, istnieje jeszcze jedna – wydawać się może – niepodłączona linia. Mowa o tajemniczym pinie SS w urządzeniach wyposażonych w interfejs SPI (np. moduły kart pamięci SD, Ethernet, moduły RFID czy niektóre wyświetlacze).

SS (ang. Slave Select) to pin decydujący o uaktywnianiu jednego z wielu urządzeń w danym urządzeniu i właśnie dzięki linii SS w konfiguracji SPI może istnień kilka urządzeń slave w tym samym czasie. Otóż pin ten decyduje o aktywnym w danym momencie urządzeniu. Na niektórych urządzeniach występują także oznaczenia pinów CS lub SDA, które służą właśnie jako Slave Select. Aby mikrokontroler działał z wieloma urządzeniami podłączonymi do linii SPI, należy odpowiednio sterować linią (a raczej liniami) SS tak, być uaktywniać transmisję z aktualnie potrzebnym urządzeniem slave. Urządzenie master zatem musi sterować liniami SS, by w ten sposób wymieniać dane z każdym z urządzeń podrzędnych z osobna.

Gdy na pinie SS istnieje stan wysoki, żadne z pinów slave SPI nie odbierają danych.
Jeśli linia SS jest w stanie niskim, aktywowany jest intefejs SPI na urządzeniach slave.
W jednym momencie tylko jedno urządzenie slave może być aktywne (stan niski tylko na jednej linii SS)!

Urządzenie master i dwa urządzenia slave sterowane za pomocą stanu linii SS (out1 i out1)

Wybór urządzenia następuje po wybraniu określonego stanu na pinie wyjściowym out1 lub out2 (istnieją urządzenia wybierane stanem niskim oraz stanem wysokim, lecz najczęściej urządzenie slave włącza się stanem niskim). Podczas transmisji, aby uniknąć kolizji może być aktywne tylko jedno z urządzeń. W przypadku modułów Arduino, urządzenie slave zawsze włącza się stanem niskim.

Jeśli chodzi o rodzinę mikrokontrolerów AVR, piny SPI mogą pokrywać się z pinami wykorzystywanymi do programowania przez interfejs ISP (ang. In-System Programming), bowiem interfejsy te mają podobną budowę. Atmel też stosuje takie same nazwy pinów do obu interfejsów (SPI oraz ISP), zatem może to być problematyczne. Na prezykład ATMega128 posiada piny interfejsu SPI na portach PB0-PB3 (w przypadku obudowy TQFP64), natomiast piny interfejsu SPI nazwane zostały nietypowo – PDI (ang. Serial Data In), PDO (ang. Serial Data Out) oraz SCK, a wyprowadzone są na portach PE0, PE1 i PB1. [3].

W przypadku Arduino, dostęp do linii SPI różni się w zależności od modelu układu:

Arduino / Genuino BoardMOSIMISOSCKSS (slave)SS (master) Level
Uno lub Duemilanove11 or ICSP-412 or ICSP-113 or ICSP-3105V
Mega1280 lub Mega256051 or ICSP-450 or ICSP-152 or ICSP-3535V
LeonardoICSP-4ICSP-1ICSP-35V
DueICSP-4ICSP-1ICSP-34, 10, 523,3V
ZeroICSP-4ICSP-1ICSP-33,3V
10111 or ICSP-412 or ICSP-113 or ICSP-310103,3V
MKR100081093,3V

Sygnały MISO, MOSI oraz SCK są także dostępne na złączu ICSP.



Bibliografia:

  1. The Serial Peripheral Interface (SPI) , www.avrbeginners.net/architecture/spi/spi.html
  2. Źródło: http://castor.am.gdynia.pl/~dorra/pliki/Magistrale%20%20-%20podstawy%20teoretyczne.pdf
  3. Więcej: http://mikrokontrolery.blogspot.com/2011/05/interfejs-spi-sprawa-isp.html

2465total visits,4visits today

Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

52 + = 55

This site uses Akismet to reduce spam. Learn how your comment data is processed.