Szeregowy interfejs komunikacji z urz¹dzeniami peryferyjnymi

Transkrypt

Szeregowy interfejs komunikacji z urz¹dzeniami peryferyjnymi
Politechnika Wrocławska
Instytut Telekomunikacji i Akustyki
Pracownia Techniki Mikroprocesorowej
Instrukcja do ćwiczenia:
Wykorzystanie interfejsu SPI do komunikacji z pamięcią EEPROM
Cel ćwiczenia:
Zapoznanie z szeregowym interfejsem komunikacji z urządzeniami peryferyjnymi SPI
(Serial Peripherial Interface). Wykorzystanie SPI do komunikacji z pamięcią EEPROM
M95040.
Wstęp
SPI jest to układ umożliwiający szeregową synchroniczną transmisję między
mikrokontrolerem, a urządzeniami peryferyjnymi (pamięci EEPROM, wyświetlacze LCD)
lub też między innym mikrokontrolerem lub mikrokontrolerami.
Interfejs ten wymaga jedynie trzech linii. Maksymalna prędkość transmisji dla
fOSC= 16 MHz wynosi 2 Mbity na sekundę i jest porównywalna z prędkością uzyskiwaną przy
transmisji równoległej. Przy takiej prędkości transmisji załadowanie danych do bufora
nadawczego trwa dłużej niż sama transmisja.
Przy połączeniu z peryferiami SPI pracuje jako urządzenie nadrzędne Master, w
przypadku połączenia z innym mikrokontrolerem może być zarówno urządzeniem
nadrzędnym, jak i podrzędnym Slave.
Dane między urządzeniami przesyłane są jednocześnie w obu kierunkach na dwóch
różnych liniach. Każde urządzenie posiada dodatkowe wejście SS pozwalające je aktywować
jeśli pracuje jako Slave. W przypadku urządzenia nadrzędnego na wejście SS powinien być
podany stan wysoki.
Rys. 1. Połączenie urządzania nadrzędnego i podrzędnego.
Rys. 2 Połączenie jednego urządzenia nadrzędnego i kilku urządzeń podrzędnych.
W przypadku połączenia urządzenia nadrzędnego z kilkoma urządzeniami podrzędnymi
konieczne jest aby wejścia SS poszczególnych urządzeń podrzędnych połączone były z
wyjściami urządzenia nadrzędnego, tak by można było w danej chwili aktywować tylko jedno
urządzenie podrzędne.
Można również zaprojektować system w którym dane urządzenie może być nadrzędne
lub podrzędne. Konieczne jest jednak zrealizowanie kontroli wyboru urządzenia nadrzędnego
poprzez linie I/O lub przesyłanie odpowiednich komend.
W SPI wykorzystywane są następujące linie:
MISO: Master In Slave Out – wejście urządzenie nadrzędnego wyjście urządzenie
podrzędnego
MOSI: Master Out Slave In – wyjście urządzenia nadrzędnego wejście urządzenia
podrzędnego
SCK: Serial Clock – wejście/wyjście sygnału zegarowego (synchronizującego)
SS : Slave select – wybór urządzenie podrzędnego.
Na rysunku 1 pokazano najprostsze połączenie urządzenie nadrzędnego i podrzędnego.
Linie MISO urządzenie nadrzędnego połączono z linią MISO urządzenia podrzędnego.
Podobnie linie MOSI i SCK. Kiedy urządzenie nadrzędne przesyła dane do podrzędnego
poprzez linie MOSI, urządzenie podrzędne przesyła dane do nadrzędnego przez linie MISO.
Przesyłanie danych jest synchronizowane poprzez sygnał zegarowy wytwarzany przez
urządzenie nadrzędne.
Rys. 3 Schemat blokowy interfejsu SPI.
Na rys. 3 pokazano schemat blokowy SPI. Interfejs ten posiada trzy dedykowane
rejestry:
− rejestr danych SPIDR
− rejestr konfiguracyjny SPICR
− rejestr statusowy SPISR
dodatkowo w rejestrze MISCR2 występują dwa bity pozwalające na programową
kontrolę wejścia SS . Bit SSM – włączający kontrolę programową oraz bit SSI – odpowiednik
wejścia SS przy ustawionym bicie SSM.
Podstawowe bity rejestru kontrolnego:
− SPIE – uaktywnienie przerwania od SPI
− SPE – uaktywnienie linii SPI
− MSTR – praca jako urządzenie nadrzędne.
− SPR2,SPR1,SPR0 – ustawienie prędkości transmisji:
Serial Clock
SPR2
SPR1
SPR0
fCPU/4
1
0
0
fCPU/8
0
0
0
fCPU/16
0
0
1
fCPU/32
1
1
0
fCPU/64
0
1
0
fCPU/128
0
1
1
− CPOL – polaryzacja sygnału zegarowego: 0 – aktywne zbocze opadające 1 –
aktywne zbocze narastające
− CPHA – faza sygnału zegarowego: 0 – dane zatrzaskiwane są przy pierwszym
zboczu, 1 – dane zatrzaskiwane są przy drugim zboczu.
W przypadku ustawienia CPHA = 0 urządzenie podrzędne „nie wie” kiedy rozpocząć
transmisję (w momencie wykrycie pierwszego zbocza zegarowego musi być przesłany
najbardziej znaczący bit), dlatego po przesłaniu każdego bajtu na wejściu SS powinien
pojawiać się stan wysoki. W przypadku CPHA = 1 omawiany problem nie występuje
ponieważ dane zatrzaskiwane są po wykryciu drugiego zbocza, więc wykrycie pierwszego
stanowi informację o rozpoczęciu transmisji. Wystawianie stanu wysokiego na wejście SS po
przesłaniu każdego bajta nie jest konieczne.
Praca jako urządzenie nadrzędne.
Należy ustawić bity SPE i MSTR. Bit MSTR można ustawić tylko wtedy gdy na
wejście SS podano stan wysoki lub gdy włączono programową kontrolę wejścia SS oraz
SSI=1. Należy wybrać prędkość transmisji oraz parametry sygnału zegarowego. Urządzenie
podrzędne musi mieć ustawione te same parametry sygnału zegarowego (CPOL i CPHA).
Po wpisaniu danej do rejestru SPIDR rozpoczyna się transmisja. Dane przesyłane są
szeregowo począwszy od bitu najbardziej znaczącego. Po zakończeniu transmisji ustawiany
jest bit SPIF, jednocześnie w rejestrze danych pojawia się dana wysłana przez urządzenie
podrzędne. Aby skasować bit SPIF informujący o zakończeniu transmisji należy odczytać
rejestr statusowy, a następnie rejestr danych.
Praca jako urządzenie podrzędne.
W przypadku urządzenia podrzędnego sygnał zegarowy odbierany jest z urządzenia
nadrzędnego, więc nie trzeba ustawiać prędkości transmisji. Należy ustawić tylko parametry
sygnału zegarowego oraz uaktywnić linie SPI. Na wejście SS musi być podany stan niski. Po
wpisaniu danej do rejestru SPIDR urządzenie oczekuje na sygnał zegarowy. Dopiero po
otrzymaniu sygnału zegarowego rozpoczyna się transmisja. Zakończenie transmisji jest
sygnalizowane ustawieniem bitu SPIF. W rejestrze danych pojawia się dana przesłana przez
urządzenie nadrzędne. Sekwencja kasowania bitu SPIF jest taka sama jak w przypadku pracy
jako urządzenie nadrzędne.
Pamięć EEPROM M95040
Układ M95040 to 4 Kbitowa pamięć EEPROM składająca się dwóch stron po 2 kbity
każda. Pamięć posiada jeden rejestr statusowy:
1
1
1
1
BP1
BP0
WEL
WIP
Bity BP1 i BP0 służą do zabezpieczenia boków pamięci przed zapisem. Bit WEL to
status lacha umożliwiającego zapis do pamięci. Bit WIP oznacza zajętość pamięci podczas
operacji zapisu.
Pamięć M95040 posiada bufor umożliwiający zapisanie 16 bajtów danych bez
oczekiwania na wyzerowania bitu WIP.
Jako pierwszy bajt przesłany do pamięci musi być przesłana jedna z sześciu instrukcji
przedstawionych w tabeli.
Instrukcja
Opis
Format
WREN
Odblokowanie zapisu do pamięci
0000 0110
WRDI
Zablokowanie zapisu do pamięci
0000 0100
RDSR
Odczyt rejestru statusowego
0000 0101
WRSR
Zapis rejestru statusowego
0000 0001
READ
Odczyt danych z pamięci
0000 A8011
WRITE
Zapis danych do pamięci
0000 A8010
A8- wybór strony pamięci: A8 = 0 strona dolna, A8 = 1 strona górna.
W przypadku odczytu lub zapisu do pamięci po komendzie (READ lub WRITE) należy
przesłać adres komórki którą chcemy odczytać lub do której chcemy zapisać dane.
Zadania do wykonania
1.
Zapoznać się z przykładowym programem eeprom_spi. W skład projektu
wchodzi moduł eeprom_spi.asm, w którym zdefiniowano podstawowe
procedury zapisu i odczytu danych.
2.
Napisać program umożliwiający odczytanie górnej strony pamięci i wysłanie
zapisanych tam danych poprzez port szeregowy. Do odczytania danych
wykorzystać
procedurę
SPI_buff_read
zdefiniowaną
w
module
eeprom_spi.asm (należy dołączyć ten moduł do swojego projektu).
3.
Napisać program zapisujący dane otrzymane poprzez port szeregowy w
pamięci
EEPROM
na
stronie
dolnej.
Wykorzystać
procedurę
SPI_Buff_write_up16 lub SPI_Buff_write. Program ma zapisywać
dane do momentu otrzymania znaku $ lub zapisania całej pamięci (255
bajtów).