Odpowiedzi:
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.
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.
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.
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ą.
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