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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.