Hallo,
Ich habe gerade den STM32L100RB auf dem Tisch. Meine Zielstellung ist
die Übertragung von größeren Datenmengen zwischen den Peripherien. Darum
schreibe ich an einem DMA-Treiber, der universell alle Transfers
abhandelt.
Speziell bin ich gerade bei SPI bis 16 MBit (dh prescaler = 2).
Bereits gelöste Probleme:
- DMA-Channels sind immer Peripherien fest zugeordnet! Das Ganze steht
im R(TF)M.
- Wird nur TX benötigt, kommt der abschließende Interrupt viel zu früh;
für SPI mit manuellem CS-Handling nicht tauglich.
- Wird nur RX benötigt, funktioniert es gleich gar nicht.
Ich benutze daher immer RX und TX und lasse den einen oder anderen
DMA-Kanal als Dummy mitlaufen
Zu lösende Probleme / Bugs:
- Der DMA-Interrupt kommt nicht, wenn die Geschwindigkeit zu hoch
eingestellt ist. Bei Prescaler 16 funktioniert es, bei 8 funktioniert es
nicht.
- Bei der Einstellung CPHA = SPI_CPHA_1Edge und CPOL = SPI_CPOL_Low ist
die Übertragung defekt (siehe Bild): Es werden nur 23 Bit übertragen
statt 24! Der Inhalt stimmt ebenfalls nicht, es müsste 0x81, 0x42, 0x24
sein.
Alle anderen Modi, d.h. 2Edge und/oder CPOL_High, funktionieren.
Und ja, der ganze Code wird noch schön gemacht und dokumentiert.