[SPI i I2C] Analiza protokołów szeregowych oscyloskopami Rohde&Schwarz, część 2
Badanie protokołów komunikacyjnych jest już obowiązkową funkcją oscyloskopów cyfrowych co najmniej średniej klasy. Nadal jednak jest ona udostępniana najczęściej jako opcjonalne rozszerzenie oprogramowania firmowego. Zwykle w cenie oscyloskopu mieści się tylko kilka najbardziej popularnych protokołów, np. SPI i UART. W cyklu artykułów przedstawiono rozwiązania dotyczące analizy protokołów zastosowane w oscyloskopach Rohde&Schwarz. W tej części artykułu omówiono badanie interfejsów SPI i I2C, a w części pierwszej przedstawiliśmy analizy protokołów transmisyjnych bazujących na RS232.
SPI, to obecnie jeden z najczęściej stosownych w sprzęcie elektronicznym interfejsów komunikacyjnych. Jest wykorzystywany przede wszystkim do wymiany danych pomiędzy różnymi blokami funkcjonalnymi urządzenia, między procesorem a podzespołami z zaszytą inteligencją, wszelkiego rodzaju czujnikami, wyświetlaczami itd. Podobne przeznaczenie ma też interfejs I2C, można więc uznać, że w pewnym stopniu oba rozwiązania są dla siebie konkurencyjne. Można też spotykać podzespoły komunikujące się zarówno przez I2C, jak i SPI. Lansowany niegdyś przez firmę Dallas interfejs 1-wire, który też miał służyć do wewnętrznej wymiany danych w urządzeniach elektronicznych, nie przyjął się u innych producentów. Dzisiaj jest już prawie zapomniany, nawet trudno znaleźć analizator przystosowany do stosowanego w nim protokołu.
Protokół SPI
Wracamy zatem do interfejsu SPI (Serial Peripheral Interface), którego popularność jest bardzo mocna i nic nie wskazuje na to, by miał on być w najbliższym czasie zastąpiony innym, lub co gorsze, by miano go wycofać z użytku.
W odróżnieniu od opisywanego w pierwszej części interfejsu UART/RS232, w SPI zastosowano transmisję synchroniczną. Konsekwencją takiej koncepcji jest dołożenie linii zegarowej SCLK taktującej przesyłaniem znaków. Przyjęto również, że w połączeniu via SPI zawsze jest jedno urządzenie (Master) pełniące funkcję nadrzędną w stosunku do wielu urządzeń Slave, z którymi może się komunikować. Jak widać, nie ma możliwości bezpośredniego przekazywania danych pomiędzy urządzeniami Slave (rys. 1). Oprócz linii SCLK interfejs SPI zawiera jeszcze dwie linie: MOSI (Master Output Slave Input) – linia, którą Master wysyła dane do Slave’a i MISO (Master Input Slave Output), którą Master odbiera dane od Slave’a. W większości zastosowań układy Slave są wybierane liniami SS. Master musi mieć ich tyle, ile jest urządzeń Slave, aby móc je jednoznacznie adresować.
Rys. 1. Typowa konfiguracja urządzeń komunikujących się ze sobą przez interfejs SPI
Analiza protokołu SPI oscyloskopami Rohde&Schwarz
Tak, jak zawsze, analizę należy rozpocząć od wybrania typu interfejsu i zdefiniowania wszystkich jego parametrów. Czynności te wykonuje się na przykład po naciśnięciu przycisku PROTOCOL znajdującego się na płycie czołowej oscyloskopu. Na ekranie zostaje wyświetlona zakładka zawierająca wszystkie parametry badanego interfejsu (rys. 2). Ramka protokołu SPI jest prostsza niż ramka UART/RS232 – składa się z samych bitów danych, których może być od 4 do 32. Nie ma w niej bitu parzystości, ani bitów startu i stopu (transmisja synchroniczna). Jeśli jednak uwzględnimy różne powiązania linii danych (MOSI i MISO) z linią zegarową SCLK, to powstaje więcej kombinacji konfiguracyjnych. Najważniejsze parametry, to poziom linii SCLK w stanie Idle, kiedy nie są nadawane dane (niski lub wysoki), a także określenie zbocza, wskazującego ważność danych na liniach MOSI i MISO. Może to być pierwsze lub drugie zbocze sygnału SCLK po wyjściu ze stanu Idle. Wymienione kombinacje są często opisywane parametrami CPOL (CPOL=1 dla SCLK=1 w stanie Idle) i CPHA (CPHA=1 dla drugiego zbocza na linii SCLK). Poszczególne kombinacje kojarzone są też z trybami pracy interfejsu SPI (od 0 do 3). Pozostaje jeszcze kwestia uaktywniania układu Slave przez Mastera. Jak wiemy, służy do tego linia SS, należy więc określić, który stan tej linii jest aktywny (niski czy wysoki). Podanie aktywnego stanu na linię SS powoduje wyzerowanie logiki realizującej transmisję i przejście w stan gotowości do wymiany danych. Dane są przesyłane w takt impulsów zegarowych generowanych przez urządzenie Master. W ogólnym przypadku, jeśli linia SS przejdzie do stanu nieaktywnego bez generacji impulsów zegarowych, do transmisji nie dochodzi. W oscyloskopach R&S przewidziano też badanie przypadków, w których inicjowanie transmisji następuje bez uaktywniania linii SS. Kolejne transmisje są wówczas oddzielane odpowiednią przerwą czasową (timeoutem), w czasie której interfejs pozostaje w stanie Idle. Tryby pracy interfejsu SPI przedstawiono na rys. 3.
Rys. 2. Zakładka z parametrami protokołu SPI
Rys. 3. Tryby pracy interfejsu SPI
Trochę to skomplikowane, pora więc na trochę praktyki. Na rys. 2. przedstawiono przykładową konfigurację interfejsu SPI. Na szczęście grafika wyświetlana na tej zakładce bardzo pomaga w prawidłowym ustawieniu parametrów. W przykładzie wybrano:
- niski poziom na linii SCLK w stanie Idle,
- pierwsze zbocze na linii SCLK odczytujące dane,
- aktywny stan wysoki na liniach MISO i MOSI,
- aktywny stan niski na linii SS,
- kierunek transmisji od najstarszego bitu (MSB) do najmłodszego, dana 8-bitowa,
- uaktywnianie urządzeń Slave niskim stanem sygnału SS.
W ustawionym trybie pracy interfejsu SPI dane na liniach MOSI i MISO zmieniają się na opadającym zboczu sygnału SCLK, a odczytywane/zapisywane są na zboczu narastającym (rys. 4). Analizator dekoduje dane i wyświetla je na ekranie w jednym z wybranych formatów (np. hex). Prawidłowo zdekodowana dana jest wyświetlana w kolorze żółtym. Ostatnia, czwarta dana widoczna na rys. 4 nie została zdekodowana, gdyż w trakcie jej nadawania stan linii SS jest już wysoki, a więc nieaktywny. Możliwe, że dana ta jest wysyłana do innego układu Slave, którego linia wyboru SS nie jest śledzona przez analizator protokołów.
Rys. 4. Przykładowa transmisja realizowana interfejsem SPI