Obsługa SPI
Podobnie jak w przypadku interfejsu I²C, w MicroPythonie mamy do dyspozycji sprzętową oraz programową implementację SPI. Implementacja programowa opiera się na zwyczajnej obsłudze pinów GPIO, dzięki czemu można wykorzystać dowolne piny, a mikrokontroler wcale nie musi mieć sprzętowego bloku SPI (co w obecnych czasach jest jednak rzadko spotykane). Interfejs SPI zrealizowany programowo działa bardzo wolno.
Implementacja sprzętowa korzysta z interfejsu, który razem z DMA pracuje niezależnie od rdzenia. Dzięki temu przesyłanie danych odbywa się w tle, a procesor może w tym czasie wykonywać jakieś inne zadania. W wielu mikrokontrolerach musimy użyć ściśle określonych pinów jako sygnałów MISO, MOSI i SCK, ale w przypadku ESP32 mamy pełną dowolność w tym zakresie. W układach z omawianej rodziny znajduje się programowalna matryca połączeniowa, dzięki której wejścia i wyjścia bloku SPI możemy połączyć z dowolnymi pinami GPIO. W takiej sytuacji programowa implementacja SPI traci sens i nie będziemy jej omawiać, a więc w tym i kolejnych odcinkach kursu będziemy korzystać wyłącznie ze sprzętowego SPI.
Aby mieć dostęp do SPI, najpierw musimy zaimportować klasy SPI oraz Pin z modułu machine.
Interfejs SPI można zastosować do komunikacji z wieloma układami slave. Każdy z nich ma wejście CS, które sygnalizuje urządzeniu podrzędnemu, że ma odebrać lub zignorować bieżącą transmisję. W stanie spoczynkowym na tym wejściu musi panować stan wysoki. Wówczas slave będzie ignorował wszelkie zmiany na liniach SCK, MISO i MOSI. Zmiana stanu pinu CS z 1 na 0 powoduje aktywację układu slave. W takiej sytuacji będzie on odczytywał dane z wejścia MOSI i będzie wysyłał odpowiedź wyjściem MISO.
W MicroPythonie musimy ręcznie obsługiwać pin CS dla każdego układu slave. Najpierw dla każdego z nich musimy utworzyć instancję klasy, która ma sterować tym pinem. Robimy to tak, jak w przypadku zwykłych pinów wyjściowych.
Możemy odczytywać dane przy pomocy metody read. W poniższym przykładzie odczytujemy 4 słowa. Należy jednak pamiętać, że SPI jest interfejsem full-duplex, który przesyła informacje jednocześnie w obu kierunkach. Zatem aby coś odczytać, trzeba jednocześnie coś wysyłać. W drugim argumencie definiujemy, jaki bajt ma być wysyłany podczas odczytywania. Zwykle jest to 0x00 lub 0xFF.