Mikrokontrolery_ARM_cz20.pdf

(364 KB) Pobierz
101-103_arm_cz20.indd
KURS
Mikrokontrolery z rdzeniem ARM,
część 20
Interfejsy szeregowe: SPI
Interfejs SPI
W przeciwieństwie do interfejsu
I 2 C, interfejs SPI nie posiada żad-
nej wbudowanej inteligencji, ani
mechanizmów arbitrażu, jest on
tylko prostym dwukierunkowym in-
terfejsem synchronicznym. Interfejs
SPI wykorzystuje 4 wyprowadzania
mikrokontrolera: MOSI, MISO, SCK,
SSEL. Pierwsze trzy linie pełnią
rolę linii sygnałowych, zaś ostat-
nia linia służy do wyboru układu
podrzędnego. Układy podłączone do
magistrali SPI mogą pracować jako
urządzenia nadrzędne lub podrzęd-
ne, jednak w przeciwieństwie do
I 2 C na magistrali może pracować
tylko jedno urządzenie nadrzędne.
W przypadku, gdy mikrokontroler
pracuje jako urządzenie nadrzęd-
ne wyprowadzenie SCK mikrokon-
trolera jest wyjściem sygnału tak-
tującego, MOSI wyjściem, a MISO
wejściem danych, natomiast gdy
mikrokontroler pracuje jako układ
podrzędny, SCK jest wejściem sy-
gnału taktującego, MOSI wejściem,
a MISO wyjściem danych. Pomimo
swojej prostoty interfejs SPI cechuje
się wieloma zaletami, na przykład
dużo większą prędkością pracy, na-
wet rzędu kilkudziesięciu MHz,
i najczęściej będziemy go wykorzy-
stywać do podłączania szybkich
układów peryferyjnych, takich jak
duże pamięci Flash, karty pamięci
MMC, przetworniki A/C itp.
Sposób transmisji danych na
magistrali SPI przedstawiono na
rys. 55 . Przedstawiono tutaj tylko
jeden wariant transmisji SPI na na-
rastającym zboczu zegarowym, przy
dodatniej polaryzacji impulsów ze-
garowych. Nie ma tu jednak stan-
dardu transmisji, jak dla I 2 C, więc
W tej części cyklu zajmiemy się pokazaniem
obsługi interfejsu SPI w mikrokontrolerach LPC213x
i LPC214x, na bazie interesującego przykładu: karty
MMC.
Tab. 5. Przypisanie linii SPI i SSP do wyprowadzeń mikrokontrolerów LPC213x
i LPC214x
Sygnał
Linie
(SSP)
Linie
(SPI)
Opis
MISO P0.18 P0.5 Linia danych – w trybie nadrzędnym wejście, w podrzędnym wyjście
MOSI P0.19 P0.6 Linia danych – w trybie nadrzędnym wyjście, w podrzędnym wejście
SCK P0.17 P0.4
Wyjście sygnału zegarowego w trybie nadrzędnym lub wejście w trybie
podrzędnym
SSEL P0.20 P0.7
Linia wyboru układu w trybie podrzędnym.
transmisja może odbywać się rów-
nież przy ujemnej polaryzacji im-
pulsów zegarowych, jak i na drugim
zboczu sygnału, a interfejsy mikro-
kontrolerów posiadają wbudowane
mechanizmy pozwalające sterować
tą zależnością. W przypadku, gdy
mikrokontroler pracuje jako urzą-
dzenie nadrzędne, wysyłanie da-
nych na magistrali SPI rozpoczyna
się w momencie wpisania danych
do odpowiedniego rejestru, przed
tą czynnością należy pamiętać, aby
za pomocą portu GPIO zmienić
stan linii SSEL wybranego urządze-
nia podrzędnego na niski. W mikro-
kontrolerach rodziny 8051 interfejs
SPI występuje tylko w nielicznych
modelach mikrokontrolerów, na
przykład 89S8252, natomiast w mi-
krokontrolerach AVR jest on zdecy-
dowanie bardziej popularny i wy-
stępuje w większej liczbie modeli.
W mikrokontrolerach LPC213x/214x
mamy dwa układy peryferyjne mo-
gące pracować w trybie SPI mia-
nowicie układ SPI oraz SSP. Układ
SPI jest prostym układem, który
może pracować tylko w trybie SPI,
natomiast SSP jest rozbudowanym
układem który potrafi pracować
w trybach SPI, 4–wire TI, NS bus.
Z uwagi na największą popular-
ność interfejsu SPI oraz ograniczo-
ne łamy kursu, będziemy zajmować
się tutaj tylko trybem SPI interfejsu
SSP. Z interfejsem SSP i SPI mikro-
kontrolera związane są linie zesta-
wione w tab. 5 .
Użycie interfejsu SPI w praktyce
jest dużo prostsze niż I 2 C i spro-
wadza się do konfiguracji kilku
rejestrów, a następnie zapisu lub
odczytu danych. Kontroler SPI po-
trafi zgłaszać przerwania w reakcji
na zdarzenia, jednak najczęściej nie
będzie potrzebne korzystanie z sys-
temu przerwań i będziemy posłu-
giwać się badaniem bajtu statusu.
Prędkość transmisji interfejsem SPI
określa rejestr SSPCPSR ( rys. 56 ).
SSPCPSR
7 6 5 4 3 2 1 0
Rys. 56. Rejestr SSPCPSR (0xE0068010)
Prędkość pracy interfejsu SSP
możemy wyznaczyć według wzoru
F clk =P clk /(SSPCPSR*(SCR+1)), musimy
pamiętać o prawidłowym ustawieniu
podzielnika w rejestrze SSPCPSR.
Gdy kontroler pracuje w trybie nad-
rzędnym, najmniejszą dozwoloną
wartością podzielnika jest liczba
2, natomiast w trybie podrzędnym
najmniejszą wartością, jaką może-
my wpisać jest 12. Jak więc ła-
two można policzyć, maksymalną
Rys. 55. Transmisja danych interfejsem SPI
Elektronika Praktyczna 7/2007
101
197731028.050.png 197731028.057.png 197731028.058.png 197731028.059.png 197731028.001.png
 
KURS
SCR
CPHA CPOL FRF DSS
rejestr SSPDR. Jeżeli chcemy wysłać
jakąś daną na magistralę SPI, wów-
czas wpisujemy ją do tego rejestru
i jeżeli kontroler w danym momen-
cie jest wolny zapis rejestru auto-
matycznie rozpoczyna proces nada-
wania danych. Odczyt danych jest
możliwy, gdy bit RNE w rejestrze
statusu jest ustawiony w stan 1.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Rys. 57. Rejestr SSPCR0 (0xE0068000)
częstotliwością, z jaką może praco-
wać interfejs SSP mikrokontrolerów
LPC213x/214x, jest 30 MHz w trybie
nadrzędnym, co jest wartością wie-
lokrotnie większą od prędkości pra-
cy interfejsu I 2 C (400 kHz). Oczy-
wiście musimy pamiętać, że urzą-
dzenie podrzędne również powinno
być dostosowane do taktowania tak
dużą częstotliwością. Kontroler SSP
posiada wiele trybów pracy, również
sama magistrala SPI może pracować
w wielu konfiguracjach, dlatego do
ustawienia odpowiedniego trybu pra-
cy służą rejestry konfiguracyjne SSP-
CR0 i SSPCR1:
DSS – określa liczbę bitów da-
nych (n) w jednej ramce, gdzie n
= DSS+1. Najczęściej będziemy
używać 8–bitowego formatu ramek.
FRF – określa tryb pracy inter-
fejsu SSP (najczęściej będziemy wy-
korzystywać tryb SPI)
00b – SPI
01b – SSI
10b – Microwire
11b – zarezerwowane
CPOL – określa polaryzację sy-
gnału zegarowego SCK
0 – polaryzacja „dodatnia”
(nieaktywny stan 0)
1 – polaryzacja „ujemna”
(nieaktywny stan 1)
CPHA – określa fazę próbkowa-
nia danych
0 – dane próbkowane na
zboczu aktywującym
1 – dane próbkowane na
zboczu deaktywującym.
SCR – podzielnik sygnału pre-
skalera, określa prędkość transmisji
interfejsu SPI zgodnie ze wzorem
opisanym wcześniej.
bitu jest możliwa tylko wtedy, gdy
kontroler SSP jest wyłączony (bit
SSE=0)
SOD – bit ten działa tylko
w trybie podrzędnym kontrolera,
wówczas jego ustawienie powoduje
zablokowanie wysyłania danych li-
nią MISO.
Jak widzimy kontroler SSP mi-
krokontrolerów LPC jest bardzo
elastyczny, do dyspozycji mamy
ogromną liczbę opcji konfiguracyj-
nych i w zasadzie może on praco-
wać z każdym urządzeniem pracu-
jącym w jednej z odmian transmisji
synchronicznej. W innych mikrokon-
trolerach 8–bitowych, na przykład
AVR, kontroler SPI nie jest tak
elastyczny i może pracować tylko
w trybie SPI z 8–bitowymi danymi.
Zbadanie statusu mikrokontrolera
SSP umożliwia rejestr SSPSR (tylko
do odczytu). Podobnie jak rejestr
LSR w sterowniku portów szerego-
wych umożliwia on sprawdzenie
czy można zapisać daną do bufora,
sprawdzić stan błędów oraz stwier-
dzić obecność nowej danej w bufo-
rze odbiornika.
SSPDR
151413121110 9 8 7 6 5 4 3 2 1 0
Rys. 60. Rejestr SSPDR (0xE0068008)
W niektórych przypadkach za-
miast cyklicznego badania rejestru
statusu istnieje konieczność użycia
przerwań generowanych przez kon-
troler SSP. Na przykład, gdy urzą-
dzenie podłączone do magistrali SPI
jest bardzo wolne lub pracujemy
w trybie podrzędnym i nie wiemy
kiedy możemy spodziewać się no-
wych danych. Kontroler SSP może
zgłaszać przerwania od nadajnika,
odbiornika, braku odbioru znaków,
jak i nadpisania bufora. Określe-
nie rodzaju zgłaszanych przerwań
umożliwia rejestr maski przerwań
SSPMIS ( rys. 61 ).
– – – – TXIM RXIM RTIM RORIM
7 6 5 4 3 2 1 0
Rys. 61. Rejestr SSPMIS (0xE006801C)
– – – BSY RFF RNE TNF TFE
7 6 5 4 3 2 1 0
Rys. 59. Rejestr SSPSR (0xE006800C)
RORIM – flaga zezwolenia na
przerwanie zgłaszanego w momencie
nadpisania kolejki FIFO odbiornika.
RTIM – flaga zezwolenia na
przerwanie od timeoutu . Przerwanie
to jest zgłaszane w momencie, gdy
przez czas trwania 32 bitów nie
zostały odebrane żadne dane.
RXIM – flaga zezwolenia na
przerwanie zgłaszanego w momen-
cie, gdy bufor odbiornika jest w po-
łowie zapełniony.
TXIM – flaga zezwolenia na
przerwanie, gdy bufor nadajnika
jest w połowie pusty.
Stan bitów RTIM oraz RXIM
jest automatycznie aktualizowany
w miarę zmiany ilości danych znaj-
dujących się w kolejkach FIFO, na-
tomiast bity od przekroczenia czasu
oraz przepełnienia kolejki FIFO mu-
szą być kasowane przez procedurę
obsługi przerwania. Skasowanie tych
bitów umożliwia rejestr SSPICR.
TFE – ustawienie tego bitu
oznacza, że bufor FIFO nadajnika
jest pusty.
TNF – ustawienie tego bitu
oznacza, że bufor FIFO nadajnika
nie jest zapełniony. Do rejestru da-
nych można wstawić daną do wy-
słania.
RNE – ustawienie tego bitu
oznacza, że bufor FIFO odbiornika
nie jest pusty, tak więc z rejestru
danych można odczytać odebrane
dane.
RFF – ustawienie tego bitu
oznacza zapełnienie bufora FIFO
odbiornika.
BSY – flaga zajętości. Ustawienie
tego bitu oznacza, że kontroler SSP
właśnie odbiera lub wysyła daną.
Stan tego rejestru możemy
sprawdzać bezpośrednio w programie
głównym (tak będziemy robić naj-
częściej), albo w procedurze obsłu-
gi przerwania od interfejsu SSP. Do
wysyłania i odbioru danych służy
– – – – SOD MS SSE LBM
7 6 5 4 3 2 1 0
Rys. 58. Rejestr SSPCR1 (0xE0068004)
LBM – ustawienie tego bitu po-
woduje pracę kontrolera SSP w try-
bie pętli ( loopback ), co można wy-
korzystać tylko do celów diagno-
stycznych.
SSE – ustawienie tego bitu po-
woduje załączenie kontrolera SSP.
MS – wybór trybu pracy nad-
rzędny/podrzędny. Gdy bit ten
jest wyzerowany, kontroler pracuje
w trybie nadrzędnym. Zmiana tego
– – – – – – RTIC RORIC
7 6 5 4 3 2 1 0
Rys. 62. Rejestr SSPICR(0xE0068020)
102
Elektronika Praktyczna 7/2007
197731028.002.png 197731028.003.png 197731028.004.png 197731028.005.png 197731028.006.png 197731028.007.png 197731028.008.png 197731028.009.png 197731028.010.png 197731028.011.png 197731028.012.png 197731028.013.png 197731028.014.png 197731028.015.png 197731028.016.png 197731028.017.png 197731028.018.png 197731028.019.png 197731028.020.png 197731028.021.png 197731028.022.png 197731028.023.png 197731028.024.png 197731028.025.png 197731028.026.png 197731028.027.png 197731028.028.png 197731028.029.png 197731028.030.png 197731028.031.png 197731028.032.png 197731028.033.png 197731028.034.png 197731028.035.png 197731028.036.png 197731028.037.png 197731028.038.png 197731028.039.png 197731028.040.png 197731028.041.png 197731028.042.png 197731028.043.png 197731028.044.png 197731028.045.png 197731028.046.png 197731028.047.png 197731028.048.png 197731028.049.png 197731028.051.png 197731028.052.png 197731028.053.png 197731028.054.png 197731028.055.png
KURS
RORIC – ustawienie tego bitu
powoduje skasowanie źródła prze-
rwania od przepełnienia kolejki
FIFO kontrolera SSP.
RTIC – ustawienie tego bitu po-
woduje skasowanie źródła przerwa-
nia od przeterminowania odbioru
znaków.
Omówiliśmy już wszystkie nie-
zbędne rejestry do pracy z kontrole-
rem SSP, teraz pokażemy jak zdoby-
te wiadomości można wykorzystać
w praktyce. W ostatnim czasie bar-
dzo potaniały karty pamięci MMC/
SD, tak więc stały się one dosko-
nałym rozwiązaniem w przypadku,
gdy zależy nam na przechowywa-
niu dużej ilości danych. Dodatko-
wym ułatwieniem jest możliwość
pracy pamięci MMC w trybie SPI,
tak więc do przesyłania danych
pomiędzy kartą a pamięcią może-
my wykorzystać standardowy inter-
fejs SPI. Sposób podłączenia karty
MMC do mikrokontrolera LPC21xx
przedstawiono na rys. 63 .
List. 12. Procedura obsługująca transfer danych pomiędzy kartą MMC i mi-
krokontrolerem LPC
//Nadaje i odbiera znak po SPI
static u08 spiTransferByte(u08 byte)
{
SSPDR = byte;
while (SSPSR & 0x10); //Czekaj na koniec nadaw
byte = SSPDR;
return byte;
}
się już stosowne gniazdo pamięci,
więc wystarczy tylko „pożyczyć”
kartę MMC z jakiegoś aparatu i wło-
żyć do gniazda naszego zestawu.
W pliku ep8d.zip znajduje się pro-
gram, który za pomocą interfejsu
SPI odczytuje 32 sektor karty MMC
i wyświetla jego zawartość na ter-
minalu. Z uwagi na skomplikowaną
komunikację z kartą MMC przedsta-
wię tutaj tylko procedury odpowie-
dzialne za transfer MMC. Kontroler
SSP do pracy w trybie SPI obsłu-
gi karty MMC jest inicjalizowany
w procedurze mmcInit() list. 11 .
Najpierw wybierane są funk-
cje alternatywne linii SCK MISO
MOSI, następnie kontroler jest usta-
wiany tak, aby ramka zawierała 8
bitów danych z dodatnią polaryza-
cją impulsów CLK. Następnie usta-
wiana jest częstotliwość taktowania
interfejsu SPI. Może tutaj dziwić
duża wartość podzielnika, przez co
transfer danych będzie bardzo wol-
ny, jednak zgodnie ze specyfikacją
SPI inicjalizacja powinna odbywać
się z częstotliwością mniejszą niż
podczas normalnej pracy, i dopiero
po zainicjalizowaniu karty kontro-
ler można ustawić na pełną pręd-
kość pracy. Po ustawieniu podziel-
nika następuje włączenia kontrole-
ra SPI oraz zainicjalizowanie linii
CS jako wyjście w stanie wysokim
(nieaktywnym). Za przesyłanie da-
nych pomiędzy kartą MMC a mi-
krokontrolerem odpowiedzialna jest
funkcja spiTransferByte() , która jed-
nocześnie wysyła i odbiera bajt da-
nych z magistrali SPI ( list. 12 ).
Sama procedura jest trywial-
nie prosta, mianowicie do rejestru
SSPDR wpisywany jest bajt do wy-
słania, a następnie w aktywnej pętli
sprawdzany jest stan bitu BUSY
w rejestrze statusu, który informuje
nas o zakończeniu wysyłania i od-
bierania danych. Na końcu zawar-
tość rejestru SSPDR zawierająca
odebraną daną jest zwracana przez
funkcję. Jeżeli nie wykorzystujemy
systemu przerwań, same procedury
interfejsu SPI za pomocą kontro-
lera SSP są bardzo proste. Trochę
problemów może jedynie sprawić
wstępna konfiguracja interfejsu, po-
nieważ do dyspozycji mamy wiele
trybów pracy.
Interfejsy szeregowe
–podsumowanie
Zapoznaliśmy się z układami
transmisji szeregowej, które są zde-
cydowanie bardziej rozbudowane
oraz jest ich więcej niż w innych
mikrokontrolerach 8–bitowych. Do
dyspozycji mamy dwa porty szere-
gowe, które są zgodne ze standar-
dem 16550, tak więc nie musimy
specjalnie pisać nowych programów
do ich obsługi. Dodatkową zale-
tą LPC21xx jest wyposażenie ich
w dwa interfejsy I 2 C, co jest rzadko
spotykane wśród innych mikrokon-
trolerów, dysponujących zazwyczaj
co najwyżej jednym interfejsem
I 2 C. Użycie sprzętowego kontrolera
I 2 C z wykorzystaniem systemu prze-
rwań pozwala odciążyć mikroproce-
sor, który w tym czasie może zająć
się realizacją innych zadań. Rów-
nież bardzo ciekawy jest interfejs
SSP, który oprócz tego, że potrafi
pracować w standardzie SPI, posia-
da dodatkowe protokoły wykorzy-
stywane w innych układach. Z tego
powodu w większości przypadków
nie będziemy musieli pisać progra-
mowych procedur obsługi. Powoli
zbliżamy się do końca naszego cy-
klu. W kolejnym i ostatnim odcinku
zajmiemy się tematyką przetwarza-
nia A/C i C/A.
Lucjan Bryndza, EP
lucjan.bryndza@ep.com.pl
Rys. 63. Sposób podłączenia karty
MMC do mikrokontrolera LPC21xx
W przypadku, gdy do ćwiczeń
będziemy wykorzystywać zestaw
ZL6ARM, kartę MMC będziemy
musieli podłączyć do zestawu we-
dług powyższego schematu, nato-
miast gdy wykorzystamy nowszy
zestaw ZL11ARM z mikrokontrole-
rem LPC214x, na płytce znajduje
List. 11. Procedura inicjalizująca kontroler SSP
//Inicjalizacja protokolu mmc i spi
void mmcInit( void )
{
//Piny jako funkcja alternatywna SPI
PINSEL1 |= SCK1_P017_SEL|MISO1_P018_SEL|MOSI1_P019_SEL;
//SPI Master 8 bitow CPOL 0
SSPCR0 = 0x07;
//Podzielnik
SSPCPSR = 150;
//Zalacz kontroler SPI
SSPCR1 = 2;
// CS nieaktywny
MMC_DIR |= MMC_CS;
MMC_SET = MMC_CS; // CS wysoki
}
Elektronika Praktyczna 7/2007
103
197731028.056.png
Zgłoś jeśli naruszono regulamin