Czy istnieje różnica między używaniem wbudowanego modułu SPI a bittingiem?

25

Czy istnieje różnica między nimi, czy to tylko kwestia abstrakcji? Moja intuicja mówi, że nie ma różnicy, ale chciałbym się mylić.

Skaevola
źródło
1
Zależy, jak dobrze sobie radzisz w bitach. Zobacz code.google.com/p/fastspi i waitingforbigo.com :-)
Robert Atkins

Odpowiedzi:

33

Rzeczywiste urządzenie peryferyjne kontrolera SPI w MCU może często działać znacznie szybciej niż interfejs bitowy. Oczywiście zależy to od MCU, ale nie zdziwiłbym się, gdyby kontroler SPI działał z częstotliwością 30+ MHz, podczas gdy bitowanie może być ograniczone do około 1 MHz (jeśli masz szczęście).

Ale jest w tym coś więcej. Podczas bit-bitu, MCU jest zajęty. Przesuwa dane i kręci linie GPIO. Oznacza to, że nie może robić nic innego. Podczas korzystania z kontrolera SPI, kontroler jest zajęty robieniem tych wszystkich rzeczy, a MCU może robić inne rzeczy.

Tak więc w przypadku rzeczywistego kontrolera SPI faktyczny transfer SPI jest znacznie szybszy, a MCU odzyskuje niektóre cykle, które może wykorzystać do innych celów.

Dietrich Epp
źródło
11

Nie ma różnicy pod względem tego, że można osiągnąć ten sam wynik za pomocą obu metod, ale istnieje kilka powodów, dla których wybrałbyś jedną z nich.

Użycie urządzenia peryferyjnego SPI uwolni procesor od konieczności dbania o generowanie taktowania bitów w piny we / wy, umożliwiając mu wykonywanie innych zadań obliczeniowych i upraszczając programowanie procesora. Ponieważ urządzenie peryferyjne jest zaimplementowane w sprzęcie, będzie działać szybciej i zużywać będzie mniej energii niż we / wy bit banging. Mogą wystąpić sytuacje, w których chciałbyś Bit Bang I / O do interfejsu z SPI, jeśli Twoja aplikacja wymaga wybrania procesora bez urządzenia peryferyjnego SPI. Ze względów higienicznych zalecam unikanie tego, chyba że jest to absolutnie konieczne.

Amoch
źródło
Powodem rozsądku są śmieci. Często konfigurowanie sprzętu SPI dokładnie do wymaganej konfiguracji zajmuje więcej czasu na odczytanie arkusza danych peryferyjnych SPI niż tylko napisanie kodu głównego SPI, a tym samym jedynie odczytanie arkusza danych urządzenia podrzędnego.
Olin Lathrop
Przyznaję, że byłem trochę sensacyjny z moją uwagą o zdrowiu psychicznym, ale (co prawda niepisane) intencją było to, że wraz ze wzrostem złożoności aplikacji rośnie ciężar zapewnienia, że ​​system jako całość będzie działał w zamierzonym czasie. Wdrożyłem go w obie strony i wiem, że wolałbym korzystać z urządzeń peryferyjnych, nawet jeśli zajmie mi to dodatkowe kilka minut, aby przeczytać kartę danych.
Amoch
6

SPI jest interfejsem synchronicznym , a master kontroluje zegar. Oznacza to, że jeśli jesteś mistrzem, możesz wybrać prędkość zegara i czas. Urządzenia slave będą miały górną granicę częstotliwości zegara, którą mogą obsłużyć, ale zazwyczaj nie obchodzi ich, jak wolny jest zegar poniżej tej częstotliwości. Mówiąc dokładniej, zazwyczaj minimalny czas jest potrzebny każdemu urządzeniu podrzędnemu, aby zobaczyć zegar w stanie wysokim i niskim, zanim będzie mógł ponownie się przełączyć, a także pewne minimalne ustawienia danych i ograniczenia na linii danych otaczającej krawędź zegara, na której slave odczytuje linię danych.

Z tego powodu wdrożenie SPI master w oprogramowaniu układowym jest naprawdę dość łatwe. Robiłem to często dla wygody korzystania z niektórych pinów, gdy nie było wbudowanego sprzętu SPI lub nie było dostępne do tego celu z jakiegokolwiek powodu. Wykonanie SPI master w oprogramowaniu układowym jest tak proste, jak to możliwe.

Wiele urządzeń podrzędnych SPI jest dość szybkich, więc często minimalny czas zegara i ustawień jest spełniony po prostu upewniając się, że każde ma co najmniej jeden cykl instrukcji. W takim przypadku kod jest bardzo krótki i szybki. W niektórych przypadkach urządzenie podrzędne może wymagać dwóch lub trzech cykli instrukcji na fazę zegara, ale tak naprawdę nie jest to trudne do zagwarantowania. Pętla niskopoziomowa SPI wymaga przesunięcia następnego bitu wyjściowego na pozycję, złapania bitu wejściowego i sprawdzenia licznika pętli. Zazwyczaj można spełnić minimalne wymagania dotyczące cyklu dwóch lub trzech cykli, po prostu organizując podczas jazdy i próbkowania linii z niektórymi innymi napowietrznymi wstawionymi we właściwych miejscach. Jeśli prędkość jest ważna, możesz użyć preprocesora asemblera do napisania rozwiniętej pętli. Dzięki takim technikom

Jest kilka zalet robienia SPI master w oprogramowaniu. Sprzęt SPI jest czasem nieco trudny w konfiguracji. Zawsze pojawia się kwestia tego, co dokładnie ma się stać natychmiast po potwierdzeniu wyboru niewolnika. Czy pierwszy bit jest zapisywany w wierszach danych? Co się stanie, jeśli zegar zacznie się nisko, a linie danych mają zostać zablokowane na zboczu opadającym? Czasami to ma znaczenie, a czasem nie. Dzięki oprogramowaniu SPI master możesz być bardziej wyrozumiały i być może użyć tej samej procedury do komunikacji z różnymi urządzeniami slave. Na przykład możesz upewnić się, że linia danych MOSI (Master Out Slave In) jest stabilna na obu krawędziach zegara. Sprzęt SPI na ogół tego nie robi, więc taki sprzęt musiałby zostać ponownie skonfigurowany w zależności od tego, z którym urządzeniem slave komunikuje się w danym momencie.

Kolejną zaletą nadrzędnego SPI oprogramowania układowego jest to, że można wybrać dowolną liczbę bitów na sekwencję SPI. Sprzęt jest zwykle ograniczony do wielokrotności 8 bitów. Większość urządzeń jest zaprojektowana tak, aby umożliwić przesyłanie całego bajtu, ale często ich nie wymagają. Na przykład 10-bitowy A / D najprawdopodobniej najpierw wyśle ​​10 bitów danych, a następnie wyśle ​​0 lub śmieci, jeśli nadal będziesz taktował. Jeśli używasz sprzętowego interfejsu SPI, będziesz zmuszony przenieść 16 bitów i maskować śmieci. Wszystko będzie działało dobrze, ale w tym przypadku master SPI oprogramowania układowego może być szybszy niż sprzęt, ponieważ przesyła tylko wymagane minimum 10 bitów.

Główną zaletą sprzętowych wzorców SPI jest to, że oprogramowanie układowe może zainicjować transfer bajtów, a następnie przejść i zrobić coś innego. Czas taktowania może zwykle być szybszy niż nawet w przypadku rozwiniętej pętli oprogramowania układowego. Należy pamiętać, że chociaż obie te zalety mogą być ważne w pewnych okolicznościach, często są nieistotne. Większość kodu SPI, który używa sprzętu do przesłania bajtu, natychmiast przechodzi w pętlę oczekiwania, aż sprzęt zakończy przesyłanie. Sprawdź również dokładnie wymagania dotyczące czasu urządzenia podrzędnego. Urządzenia SPI są na ogół szybkie jako całość, ale zdarzają się przypadki, w których trzeba spowolnić sprzęt, aby dopasować się do maksymalnej prędkości, którą może obsługiwać urządzenie podrzędne.

To wszystko z głównego punktu widzenia. Krótko mówiąc, często nie ma żadnej przewagi w używaniu sprzętu SPI jako wzorca, a nawet kilka zalet w nieużywaniu go czasami. Wszystko to jednak różni się w przypadku niewolników. Ponieważ mistrz kontroluje zegar, niewolnicy muszą być gotowi na wszystko, co robi mistrz, ilekroć mistrz to robi. Wymagania czasowe są często dość krótkie w stosunku do czasów instrukcji, więc sprzęt, który implementuje urządzenie podrzędne SPI jest zwykle tym, czego potrzebujesz.

Możesz robić slave'y SPI w oprogramowaniu układowym, ale jest to trudne, musisz ostrożnie liczyć cykle i opóźnienia, i zwykle kończy się implementacja jakiegoś podzbioru protokołu, o którym wiesz, że używa twój konkretny master. Na przykład kiedyś musiałem zaprojektować cyfrowy odpowiednik starej płyty kontrolera analogowego (chcieli dodatkowych funkcji, których nie można racjonalnie wykonać w analogu, i chcieli czegoś mniejszego, tańszego w produkcji i bardziej stabilnego). Ta płyta łączy się z resztą systemu za pośrednictwem magistrali SPI. Stara płytka analogowa miała dwukanałowy przetwornik cyfrowo-analogowy do ustawiania wartości kontrolnych i dwukanałowy przetwornik cyfrowo-analogowy do odczytywania zmierzonych wartości. Wdrożenie obu w jednym procesorze było trudne i polegało na ustaleniu, jakiego podzbioru sprzętowego protokołu D / A i A / D SPI faktycznie używał istniejący master. Uwzględniono również procesor, który mógłby działać znacznie szybciej niż częstotliwość zegara SPI. Na koniec użyłem trzech przerwań, po jednym dla każdego wyboru slave i jeden dla rosnącego zbocza linii zegara. To ostatnie musiało być przerwaniem o najwyższym priorytecie w systemie, w przeciwnym razie wymaganie dotyczące opóźnienia nie byłoby spełnione.

W każdym razie chodzi o to, że master SPI oprogramowania układowego jest łatwy, mały, szybki i elastyczny, i nie ma powodu, aby się go unikać. Z drugiej strony, dla niewolnika naprawdę potrzebujesz sprzętu lub musisz się obudzić i bardzo dokładnie przemyśleć czas, opóźnienia i tym podobne.

Olin Lathrop
źródło
Czy znalazłeś jakieś implementacje mikrokontrolera slave, które mogłyby zachowywać się jak typowe sprzętowe urządzenia SPI (np. Pozwalając masterowi uzyskać przewagę nad CS i czytać status w dowolnym momencie, i używając CS do oznaczania granic poleceń? Większość implementacji, których widziałem, nie ma nawet zgłosić, czy istniała przewaga CS między bieżącym i poprzednim
bajtem
@ super: Tak, to jest problem. Sprzęt Slave SPI zwykle ignoruje zegar i dane wejściowe i utrzymuje linię danych wyjściowych z wysoką impedancją, gdy wybór chipa nie jest zapewniony, ale zwykle nie mówi, gdzie są granice wyboru chipa. Przynajmniej ze sprzętem PIC SPI, którego pamiętam, musiałbyś w tym celu ustawić własne przerwanie na chipsecie.
Olin Lathrop,
Zastanawiałem się, czy znasz jakieś przyzwoite wdrożenia. Nie sądzę. Problem z użyciem przerwania sprzętowego na przewodzie wyboru polega na tym, że jeśli przejście na przewodzie wyboru nastąpi bardzo szybko po wysłaniu bajtu, urządzenie podrzędne może mieć trudności z ustaleniem, czy nastąpiło to przed, czy po danym bajcie. Zastanawiające jest dla mnie, że prawie każdy układ ma implementację SPI slave, ale wydaje się, że żaden z nich nie może być używany tak jak typowe sprzętowe urządzenie slave SPI. Sytuacja jest trochę podobna do portu slave procesora na PIC w porównaniu do 8048.
supercat
Port podrzędny procesora 8048 ma pin adresowy; gdy dane są zewnętrznie zapisywane do 8048, 8048 przechwytuje stan tego pinu i udostępnia go swojemu kodowi (zazwyczaj pierwszy bajt polecenia zostanie zapisany pod jednym adresem, a parametry lub dane pod drugim). Odczyt jednego adresu da wszystko, co umieści tam kod 8048, ale niektóre bity odczytywane z drugiego adresu są generowane przez sprzęt 8048 w celu wskazania, czy „jest gotowy do odczytu lub zapisu danych.
supercat
+1 za zwrócenie uwagi na różnicę polegającą na bit-banging master (łatwy) i slave (znacznie trudniejszy).
tcrosley,
1

To zależy od tego, dla czego robisz SPI. Jeśli zależy Ci na uzyskaniu z tego najwyższych szybkości transmisji danych, sprzęt jest zawsze szybszy niż bitbanging (np. Chip kory mózgowej w teensy 3. Mogę wypychać dane z prędkością 22 Mb / s za pomocą sprzętowej obsługi SPI, w porównaniu z ~ 4,5 Mb / s z bitbangingiem (to może również obsługiwać dowolną liczbę bitów na przesył z 3-16 - przydatne przy wysyłaniu danych w 12-bitowych porcjach dla niektórych kontrolerów led!)). Na AVR 16 MHz różnica jest nieco mniej ekstremalna, najwyższa prędkość przesyłu danych ze sprzętem wydaje się być wysoka 4 / niska 5 Mb / s, a bitbanging wynosi około 2,3 Mb / s).

Ponadto, jeśli korzystasz ze wsparcia sprzętowego, ponownie, w zależności od danego mikrokontrolera, masz dostępne opcje używania kontrolerów DMA do przenoszenia danych, pozwalając kodowi wrócić do innych, potencjalnie bardziej interesujących rzeczy niż opieka nad danymi pisać.

Wszystko to zależy od tego, czy sprzętowy SPI jest w ogóle opcją.

RDD
źródło
0

Jeśli korzystasz z SPI bit-bang, nie możesz używać przerwań SSP do obsługi komunikacji. Dla wielu zastosowań nie jest to tak ważne dla SPI

Scott Seidman
źródło
1
Nie wspomniano o żadnym konkretnym procesorze, więc „przerwanie SSP” jest w tym kontekście bez znaczenia.
Olin Lathrop