Forum: Mikrocontroller und Digitale Elektronik STM32L1xx DMA+SPI: 2 Bugs


von Phantomix X. (phantomix)


Angehängte Dateien:

Lesenswert?

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.

von Phantomix X. (phantomix)


Angehängte Dateien:

Lesenswert?

Hier noch das Bild für "funktionierende Kommunikation". Was ich geändert 
habe ist:
spi_slave.slave_cpol = SPI_CPOL_High;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.