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).