Der SPI-Slave in der letzten Version kann bis zu 32 Byte übertragen.
Mehr sollte allerdings möglich sein.
Denn beide PIOs verfügen über einen Gesamtspeicher von 8 * 8 Words =
256 Byte.
Die galt es nun zur Mitarbeit zu bewegen.
Im ersten Schritt wurde der SPI-Slave optimiert, so dass er in eine
einzige
Statemachine passte:
spi_slave_4.py
Benötigt nur noch 1 Statemachine, kann dafür auch nur max. 4 * 4 Bytes
übertragen.
spi_slave_8.py
Das ist der "alten" SPI-Slave, aber mit den Optimierungen des
spi_slave_4.py.
Benötigt 2 Statemachines (getrennt für Receiver und Transmitter) und
kann bis zu 8 x 4 Bytes übertragen.
spi_slave_16.py
Hier wird versucht, auf bis zu 8 Statemachines den (leicht erweiterten)
Code
des spi_slave_4.py auszuführen.
Die Statemachines werden jeweils mit einem "zeitlichen" Versatz von 128
Bit
gestartet, arbeiten also nacheinander und stellen für den Empfang und
das Senden
bis zu 8 * 4 Words (= 128 Byte) je Übertragungsrichtung bereit.
Das hätte auch fast funktioniert.
Leider zeigte sich bei den Tests, dass, sofern Statemachines auf beiden
PIO-Blöcken ausgeführt werden, die Statemachines auf dem ersten Block
den Output-Pin nicht mehr bedienen.
Alles andere funktionierte wie erwartet.
Bug, Feature oder Unkenntnis der Interna ?
Ich habe zumindest keinen Workaround gefunden - und so kann nur 1
PIO-Block
genutzt werden und anstelle der erwarteten 128 Byte sind nur 64 Byte
übertragbar.
Wichtig ist in allen Varianten, dass der SPI-Master genau die Anzahl an
Bytes sendet, die der Slave erwartet / für die er konfiguriert wurde.
Die Decorator "@micropython.native" sind auskommentiert.
Micropython wird mit aktiviertem Decorator zwar etwas schneller, dafür
wird aber das Debuggen lästig.
Michael S.