Mikrokontrolery STM32 Użycie interfejsu I2C, USART, SPI


PODZESPOAY
Dodatkowe materiały >>
Mikrokontrolery STM32
Użycie interfejsu I2C, USART, SPI
Wszystkie nieco bardziej zaawansowane systemy mikroprocesorowe resowania wpisywany jest do niego adres 7- lub
10-bitowy. Ostatnimi czynnościami konfigura-
muszą komunikować się z układami dodatkowymi. Mogą one być
cyjnymi jest włączenie lub wyłączenie potwier-
zamontowane na tej samej płytce drukowanej, ale również mogą
dzeń.
to być elementy interfejsu zewnętrznego, przykładowo komputer.
W ten sposób skonfigurowany, a następnie
Wspólnym mianownikiem przy projektowaniu takiego systemu jest
włączony kontroler I2C jest gotowy do nawiąza-
wybór odpowiedniego standardu transmisji danych.
nia komunikacji. Na rys. 2 przedstawiono prze-
Wszystkie przedstawione w artykule przykłady zostały uruchomione
biegi sygnałów podczas komunikacji I2C. Każdą
na płytce ewaluacyjnej STM3210B  EVAL/A, natomiast transmisję rozpoczyna układ nadrzędny wysy-
Å‚ajÄ…c sekwencjÄ™ START. Po wykryciu sekwencji
przedstawione przykłady zostały napisane w oparciu o bibliotekę API
startowej wszystkie układy podrzędne przełą-
dostarczanÄ… przez firmÄ™ STMicroelectronics.
czają się w tryb odbioru danych, ściślej  adre-
su. Ostatni bit (ACK) to potwierdzenie odebrania
Obecnie każdy producent mikrokontro- W celu ukazania zasady nawiązywania ko- danych, wystawiane przez układ odbierający in-
lerów ma w swojej ofercie układy z wbudo- munikacji i wymiany danych uruchomimy prosty formację.
waną większością popularnych sprzętowych przykład. Układ STM32F103VBT posiada wbu- Istotną cechą transmisji I2C jest wymóg
kontrolerów komunikacyjnych. Znacznie dowane dwa sterowniki magistrali I2C. Można stałości sygnału danych podczas trwania stanu
upraszcza to proces tworzenia aplikacji, po- je wykorzystać w przykładzie programowania wysokiego na linii zegarowej. Jeśli w tym czasie
nieważ programista nie musi wnikać w szcze- tak, aby mikrokontroler komunikował się sam pojawią się stany nieustalone, to przesyłany bit
góły transmisji. Płytka ewaluacyjna STM3210B ze sobą. Kontroler I2C1 będzie skonfigurowa- jest nieważny. Na końcu ramki danych transmi-
 EVAL/A jest wyposażona w mikrokontroler ny jako master dla I2C2. Bufor I2C1_TxBuf[32], towana jest zawsze sekwencja STOP. Jak pokaza-
STM32F103VBT, który oferuje w sumie pięć wypełniony przykładowymi danymi jest wysy- no na rys. 2, zmiany SDA podczas trwania stanu
różnych, szeregowych interfejsów komunika- łany przez urządzenie I2C1 do urządzenia I2C2. wysokiego na SCL mogą mieć miejsce tylko przy
cyjnych. Do wykorzystania sÄ…: 2×I2C, 3×USART, Program realizujÄ…cy te zadania to plik o nazwie przesyÅ‚aniu znaków START i STOP.
2×SPI, CAN, USB 2.0 i2c.txt zamieszczony na CD-EP2/2009B. Fizycz- W celu nawiÄ…zania komunikacji z odpo-
nie na płytce ewaluacyjnej trzeba połączyć: PB6 wiednim układem podrzędnym, należy przesłać
I2C (I2C1_SCL) z PB10 (I2C2_SCL) i PB7 (I2C1_SDA) jego adres. Ponieważ omawiany przykład nie
Magistrala I2C jest dwukierunkowym, dwu- z PB11 (I2C2_SDA). Linie interfejsu (SDA i SCL) pracuje w oparciu o przerwania, to należy po
przewodowym interfejsem komunikacyjnym za- muszą być zasilone przez rezystory o wartości każdym poleceniu poczekać na jego wykonanie.
projektowanym przez firmę Philips. Oryginalnie 4,7 kV. Służy do tego funkcja I2C_CheckEvent(),
przeznaczona jest do wymiany informacji po- Kontroler I2C może pracować w jednym która sprawdza, czy podane jako argument zda-
między układami scalonymi znajdującymi się na z trzech trybów: I2C i dwóch SMBus. Wyboru rzenie miało miejsce i zwraca wartość PRAWDA
tej samej płytce. Na rys. 1 przedstawiono spo- dokonuje się wypełniając I2C_Mode struktury wtedy, jeśli wynik testu jest pozytywny.
sób połączenia dwóch układów magistralą I2C inicjującej. Przedstawiony przykład wykorzy- Wysyłanie i odbiór danych wykonuje ta
i przykładowy kierunek przesyłania danych oraz stuje I2C, co wskazano przy inicjacji. Ustalenie sama pętla while(), która wykonywana jest
sygnału zegarowego. Jak wynika z rysunku, prędkości transmisji odbywa się przez inicjację tyle razy, ile wynosi długość bufora wysyłanych
połączenie takie składa się z linii danych (SDA) pola I2C_ClockSpeed. Jeżeli zegar będzie usta- danych. Wysyłanie danych do tego samego
i linii sygnału zegarowego (SCL). lony powyżej 100 kHz, będzie to oznaczać układu ma raczej niewielki sens i tu służy tylko
Sprzętowy kontroler I2C, w jaki wyposa- wybór szybkiego trybu komunikacji. Wówczas celom demonstracyjnym.
żony jest mikrokontroler, umożliwia transmisję znaczenia nabiera wartość I2C_DutyCycle,
z prędkością do 100 kbps w trybie standard, która określa relację pomiędzy czasem trwania Uniwersalny synchroniczny/
lub do 400 kbps w trybie szybkim. Może praco- poziomu wysokiego i niskiego na wyjściu zega- asynchroniczny port szeregowy
wać jako: podrzędny (slave) nadajnik lub odbior- rowym. Możliwe do ustawienia relacje to 16 do  USART
nik, nadrzędny (master) nadajnik lub odbiornik. 9 oraz 2 do 1. Kontroler USART oprócz obsługi standar-
Domyślnie kontroler jest ustawiony do pracy Wartość adresu kontrolera I2C ustala pole dowej komunikacji szeregowej, może pracować
jako slave. I2C_OwnAddress1. W zależności od typu ad- z protokołem IrDA lub SMARTCARD. Pierwszy
Rys. 1. Sposób połączenia układów I2C Rys. 2. Przebiegi na liniach SDA:SCL podczas transmisji danych
128 ELEKTRONIKA PRAKTYCZNA 2/2009
Użycie interfejsu I2C, USART, SPI
umożliwia kodowanie i dekodowanie danych Liczba 1 odejmowana od indeksu tablicy Sprawdzanie, który bit portu jest ustawiony,
w standardzie IrDA, co upraszcza aplikacje w chwili sprawdzania warunku końca polecenia a który nie, również wykorzystywane jest za po-
transmisji danych z użyciem podczerwieni. wynika z użycia postinkrementacji w trakcie mocą operacji bitowych. W zależności od tego,
Do współpracy z portem szeregowym, tak jak odczytu danych z rejestru odbiorczego portu który aktualnie cykl jest realizowany przez pętlę
w przypadku wszystkich interfejsów komuni- szeregowego. W związku z tym, w momencie for, tyle razy wartość zmiennej stan_portu
kacyjnych, może być wykorzystany kontroler sprawdzania końca komunikatu indeks wskazuje przesuwana jest bitowo w prawo. Na koniec
DMA. na element o jedną pozycję dalej. Po zakończe- maskowane są wszystkie bity oprócz najmłod-
niu odbioru konieczne jest zdekodowanie łańcu- szego. Jeśli wartość otrzymanego wyrażenia bę-
Komunikacja z terminalem cha znaków zawartego w tablicy RxBuf[]. dzie równa 1, to oznacza, że wyprowadzenie mi-
Uruchomienie omawianego przykładu bę- Wszystkie znaki zawarte w tablicy bufora od- krokontrolera jest w stanie wysokim. Wówczas
dzie wymagało podłączenia zestawu ewaluacyj- biorczego reprezentowane są przez kody ASCII. wypełniane są dwa kolejne pola tablicy bufora
nego do komputera z uruchomionym termina- Spoglądając na tabele kodów ASCII można zaob- przeznaczonego do wysłania TxBuf[]. Diody
lem portu szeregowego. serwować pewną zależność. Zarówno cyfry jak na płytce ewaluacyjnej są ponumerowane od 1,
W pliku usart.txt zamieszczonym na CD_ i litery są uszeregowane w oddzielnych ciągach a nie od 0 i dlatego do końcowej wartości do-
EP2/2009B umieszczono fragment aplikacji bę- rosnących. Zmiana kodu ASCII na cyfrę może się dawany jest kod cyfry  1 . Na ostatniej pozycji
dącej prostą powłoką, umożliwiającą użytkow- odbywać przez zwyczajne odejmowanie od liczby wstawiany jest znak CR, a następnie włączana
nikowi sterowanie wyjściami mikrokontrolera w kodzie ASCII, kodu znaku  zero . jest przerwanie od nadajnika USART i zawartość
za pomocą odpowiednich poleceń wydawanych Wyznaczenie właściwego pinu odbywa się bufora wysyłana jest przez port szeregowy do
z użyciem terminala. Efektem ich realizacji bę- dzięki przesuwaniu bitowemu. Zaglądając do komputera.
dzie zmiana stanów wyprowadzeń, co sygnali- pliku nagłówkowego stm32f10x_gpio.h z bi-
zuje zaświecanie i gaszenie diod LED. Ponadto blioteki API znajdujemy, w jaki sposób są kodo- SPI
naciśnięcie przycisku  Key powoduje wysłanie wane poszczególne wyprowadzenia. Fragment Interfejs SPI (Serial Peripheral Interface)
przez USART aktualnego stanu diod. Prawidło- tego pliku umieszczono poniżej: służy do dwukierunkowej, synchronicznej trans-
/* GPIO pins Define -------------------
we polecenie ma postać: N. misji danych. Poprawne nawiązanie komunika-
-------------*/
#define GPIO_Pin_0 ((u16)0x0001) /*
Np. polecenie N6 po naciśnięciu Enter spowo- cji wymaga trzech linii: zegarowej SCK, MOSI,
Pin 0 selected */
duje pojawienie siÄ™ stanu wysokiego na wypro- #define GPIO_Pin_1 ((u16)0x0002) /*
MISO. Akronim MOSI jest pochodzi od Master
Pin 1 selected */
wadzeniu PC6 i zaświecenie diody LD1. Analo- Out/Slave In, czyli na tej linii dane są przesyłane
#define GPIO_Pin_2 ((u16)0x0004) /*
Pin 2 selected */
gicznie do gaszenia diod służy polecenie F#define GPIO_Pin_3 ((u16)0x0008) /*
diody>. W tym przykładzie będzie to (slave). Analogicznie linia MISO (Master In/Slave
Pin 3 selected */
#define GPIO_Pin_4 ((u16)0x0010) /*
F6 Enter. Sprawdzenie stanu starszej połowy Out) służy do przesyłania informacji od układu
Pin 4 selected */
portu C odbywa się przez naciśnięcie przycisku podporządkowanego (slave) do nadrzędnego.
 Key . Jeśli założymy, że zaświecone są diody Każdy pin jest reprezentowany przez poje- Istnieje możliwość skonfigurowania kontrolera
LD2 i LD4, to zostanie wtedy w terminalu wy- dynczy bit na odpowiadajÄ…cej mu pozycji. Aby SPI do pracy z tylko jednÄ… liniÄ… danych.
świetlony komunikat: onLED: 2,4, zmodyfikować stan wyprowadzenia należy do- Kontroler SPI, znajdujący się w mikrokon-
Całość komunikacji obsługiwana jest przez konać operacje przesunięcia bitowego w lewo trolerze STM32F103VBT, umożliwia transmisję
przerwania od kontrolera USART. Parametry tyle razy, ile wynosi jego numer. Wszystkie opi- z prędkością do 18 Mb/s. Ramka danych może
transmisji to: prędkość 9600 bps, 1 bit stopu, sane wyżej operacje wykonuje jedna, zwięzła mieć rozmiar 8 lub 16 bitów. Kolejność przesyła-
brak kontroli parzystości. linijka kodu. nia bitów jest konfigurowana.
Po skonfigurowania układu USART do pracy, Podobnie jak to miało miejsce w przypadku
włączane są przerwania od bufora odbiorczego. Wysyłanie danych I2C, również tutaj zostanie wykorzystana do-
Podstawowym zadaniem pętli głównej progra- Przerwanie od nadajnika portu szeregowego stępność dwóch kontrolerów sprzętowych. Do
mu jest sprawdzanie, czy nie został naciśnięty generowane jest natychmiast po jego włączeniu, uruchomienia przedstawionej aplikacji na płytce
przycisk. Funkcja obsługi przerwań zostanie wy- jeśli tylko rejestr danych do wysłania jest pusty. ewaluacyjnej należy połączyć: PA5 (SPI1_SCK)
wołana za każdym razem, kiedy do bufora od- Podobnie jak dla odbioru, w pierwszej kolejno- z PB13 (SPI2_SCK), PA6 (SPI1_MISO) z PB14
biorczego portu szeregowego zostanie wpisany ści należy sprawdzić, czy przerwanie faktycznie (SPI2_MISO), PA7 (SPI1_MOSI) z PB15 (SPI2_
nowy bajt. Ponadto, gdy mikrokontroler wykryje pochodzi od nadajnika. Służy do tego funkcja MOSI).
stan niski na linii PB9, to po przygotowaniu da- USART_GetITStatus(). Następnie, wywołu- Obydwa kontrolery skonfigurowane są do
nych do wysyłki, zostanie włączone przerwanie jąc funkcję USART_SendData() i podając jako pracy z pełnym dupleksem. Mikrokontroler
od bufora nadawczego portu szeregowego. jej argumenty wywołania numer USART i bajt musi  wiedzieć , który z interfejsów SPI jest
Przerwanie to jest wywoływane za każdym ra- do wysyłki, wysyłamy porcję danych. Sprawdza- nadrzędny, a który podrzędny. Wyboru doko-
zem, gdy bufor Tx jest pusty. nie końca danych przeznaczonych do wysyłki nuje się poprzez wypełnienie pola SPI_Mode
odbywa się w ten sam sposób, jak w przypad- struktury inicjującej. Możliwe wartości, jakie
Odbiór danych ku odbioru. Na koniec transmisji wyłączane jest może przyjmować to SPI_Mode_Master oraz
Funkcja obsługi przerwania od portu sze- przerwanie od nadajnika USART. SPI_Mode_Slave.
regowego sprawdza, czy przerwanie pochodzi Kodowanie danych do wysłania rozpoczy- Jak wspomniano wcześniej sprzętowy in-
od części nadawczej, czy odbiorczej. Jeśli dane na się od odczytania stanu portu, do którego terfejs SPI w STM32 może pracować z ramka-
przysyłane są do mikrokontrolera, to ich odczyt są podłączone diody LED (GPIOC). Zajmują one mi o długości 8 lub 16 bitów. Przedstawiany
z rejestru danych odebranych odbywa się za po- wyprowadzenia PC6& PC9 i dlatego wartość przykład wykorzystuje ramki 8-bitowe. Kolej-
mocą funkcji USART_ReceiveData(). Zwraca- zwracana przez funkcję odczytu stanu portu ność transmisji bitów jest programowana. Do
na wartość jest zapisywana do tablicy bufora przesuwana jest bitowo w prawo o 6 pozycji. nastawy służy pole o nazwie SPI_FirstBit.
odbiorczego RxBuf[]. Teraz funkcja sprawdza, Pola pozostające z lewej strony dodatkowo są Jeśli aplikacja wymaga, aby bity przesyłane były
czy ostatni odebrany znak jest kodem CR. Jeżeli maskowane. w kolejności od najstarszego do najmłodszego,
tak, to indeks tablicy ustawiany jest na jej począ- Stały łańcuch, który wysyłany jest do kom- to polu należy nadać wartość SPI_FirstBit_
tek i ustawiana jest flaga informująca o nadej- putera ma długość 7 znaków, więc bufor wysył- MSB. W przeciwnym przypadku należy użyć
ściu polecenia. ki zapisywany jest zaczynając od pozycji ósmej. SPI_FirstBit_LSB.
ELEKTRONIKA PRAKTYCZNA 2/2009 129
PODZESPOAY
W omawianym przykładzie
funkcja NSS nie jest wyko-
rzystywana.
Dane przesyłane są
w pętli while(), która
wykonuje siÄ™ tyle razy, ile
wynosi rozmiar bufora. Do
sprawdzania, czy dany frag-
ment komunikacji został
zakończony służy funkcja
SPI_I2S_GetFlagSta-
tus(). Przy każdym wyko-
naniu się pętli przesyłany
jest jeden bajt z buforów
SPI1_TxBuf[] i SPI2_
TxBuf[]. Jeśli rejestr da-
nych przeznaczonych do
wysyłki jest pusty, to mikro-
kontroler rozpoczyna wysy-
Å‚anie danych przez interfejs
SPI1 i SPI2. Następnie, po
poprawnym odebraniu
przekazywanej informacji,
następuje proces wysyłania
Rys. 3. Tryby pracy interfejsu SPI kolejnej porcji danych.
Do wyboru polaryzacji linii zegarowej PCLK podzielonej przez zawartość SPI_Bau- I2S
w stanie spoczynku oraz momentu próbkowa- dRatePrescaler. W omawianym przy- Interfejs I2S został stworzony do szerego-
nia/zmiany stanu linii danych służą odpowied- kładzie PCLK jest dzielone przez 2, więc czę- wej transmisji dzwięku pomiędzy urządzenia-
nio nastawy pól SPI_CPOL i SPI_CPHA. stotliwość linii zegarowej jest równa około: mi. Jest dostępny tylko w mikrokontrolerach
Nazwa te wynikają wprost z nazw bitów 36 MHz/128=280 kHz. Jako pierwszy wysyła- STM32 z najwyższej półki, a więc na płytce
w rejestrze kontrolnym SPI  SPI_CR1. ny/odbierany jest bit najbardziej znaczący. STM3210B  EVAL/A nie ma możliwości uru-
Wartość SPI_CPHA określa, na którym zboczu Nieco obszerniejszego komentarza wy- chomienia programów wykorzystujących ten
sygnału zegarowego stany na liniach danych maga pole SPI_NSS struktury inicjującej. Od- interfejs. Kontroler I2S został tak zaprojektowa-
mają być zatrzaskiwane. W połączeniu z para- powiada ono linii NSS wyprowadzonej na ze- ny, aby jego nastawy odpowiadały standardom
metrem SPI_CPOL otrzymywane są 4 możliwe wnątrz mikrokontrolera. Wszystkie urządzenia dzwięku przesyłanego cyfrowo. Przykładem
sytuacje próbkowania linii danych (rys. 3). podłączone do interfejsu SPI mogą być pod- może tutaj być format danych, do wyboru
Kontroler SPI1 skonfigurowano do pra- łączone również do linii NSS. Stan niski NSS mamy słowa o długości 16, 24, lub 32 bitów.
cy jako układ nadrzędny, natomiast SPI2 jako może być wymuszony przez układ zewnętrzny Pełną specyfikację interfejsu I2S przedstawio-
układ podrzędny. Transmisję zawsze rozpoczy- i wówczas to on przejmuje kontrolę nad trans- no w nocie katalogowej mikrokontrolerów
na i kończy układ nadrzędny (master). Dłu- misją. Również programowa zmiana roli ukła- STM32.
gość ramki wynosi 8 bitów, a częstotliwość du (master/slave) powoduje automatycznie Krzysztof Paprocki
linii zegarowej SCK jest równa częstotliwości wymuszenie odpowiedniego stanu linii NSS.
R E K L A M A
130 ELEKTRONIKA PRAKTYCZNA 2/2009


Wyszukiwarka

Podobne podstrony:
Interfejs I2C, część 2
Interfejs I2C, część 1
Mikrokontrolery STM32 Bezpieczeństwo i stabilność
Podwójny wyświetlacz LED z interfejsem I2C 3
Układ pozycjonowania serwomechanizmu z interfejsem I2C
Mikrokontrolery STM32 Wykorzystanie ADC i DMA
Moduły wyświetlaczy LED z interfejsem I2C 2
Mikrokontrolery STM32 Obsługa kart SD i FatFs
Interfejs I2C, część 3
karta przekaźnikowa z interfejsem i2c
Programowanie pamięci Flash mikrokontrolerów STM32 – Flash Loader
Bootloader dla mikrokontrolerów STM32 Aktualizacja oprogramowanie z zastosowaniem karty SD lub prz
Moduł wyświetlacza LED z interfejsem I2C
gpio,spi,usart, can przyklad
Sterowanie rejestrami przesuwnymi z wykorzystaniem interfejsu SPI na przykładzie 6 cyfrowego wyświet
8–cyfrowy wyświetlacz z interfejsem spi
I2C Interface fuer Druckerschnittstelle

więcej podobnych podstron