Spaß mit STM32F7 + SPI + DMA

Gast #5136282
Lesenswert?
• ▲
▼
Hallo!

Ich habe hier Code von einem STM32F4 zu einem STM32F7 portiert.
Die HAL suggeriert ja, das das problemlos möglich wäre.
Bis zu einem gewissen Grad (z.B. bei GPIO) mag das funktionieren, aber 
die restliche Peripherie hat dann doch den einen oder anderen 
Unterschied :-/

Wo ich einige Stunden mit der Fehlersuche zugebracht habe, war das 
Versenden eines größeren Datenblock über SPI mittels DMA.
Auf dem F4 lief der Code problemlos. Auf dem F7 wurden nur ein paar 
Bytes geschickt und dann blieb die DMA stecken.

So sah die Konfiguration für den DMA aus:
1
        __HAL_RCC_DMA2_CLK_ENABLE();
2
        DMA_SPI_tx_Handle.Instance                      = DMA2_Stream5;
3
        DMA_SPI_tx_Handle.Init.Channel                  = DMA_CHANNEL_3;
4
        DMA_SPI_tx_Handle.Init.Direction                = DMA_MEMORY_TO_PERIPH;
5
        DMA_SPI_tx_Handle.Init.PeriphInc                = DMA_PINC_DISABLE;
6
        DMA_SPI_tx_Handle.Init.MemInc                   = DMA_MINC_ENABLE;
7
        DMA_SPI_tx_Handle.Init.MemDataAlignment         = DMA_MDATAALIGN_HALFWORD;
8
        DMA_SPI_tx_Handle.Init.PeriphDataAlignment      = DMA_PDATAALIGN_HALFWORD;
9
        DMA_SPI_tx_Handle.Init.Mode                     = DMA_NORMAL;
10
        DMA_SPI_tx_Handle.Init.Priority                 = DMA_PRIORITY_LOW;
11
        DMA_SPI_tx_Handle.Init.FIFOMode                 = DMA_FIFOMODE_DISABLE;

Nach vielen verschiedenen Versuchen, kam ich auf die Idee doch mal den 
FIFO im DMA zu aktivieren:
1
        DMA_SPI_tx_Handle.Init.FIFOMode                 = DMA_FIFOMODE_ENABLE;
2
        DMA_SPI_tx_Handle.Init.FIFOThreshold            = DMA_FIFO_THRESHOLD_HALFFULL;
3
        DMA_SPI_tx_Handle.Init.MemBurst                 = DMA_MBURST_SINGLE;
4
        DMA_SPI_tx_Handle.Init.PeriphBurst              = DMA_PBURST_SINGLE;
Auf einmal funktionierte die ganze Chose. Offenbar wird im 
Nicht-DMA-FIFO-Modus der Zustand des SPI-FIFOs nicht richtig 
ausgewertet. Für mich sieht es so aus, als hätte STM da im F7 einen 
kleinen Bug verbaut.
Wie gesagt: Im F4 funktioniert es auch ohne DMA FIFO...

Udo

P.S.: Manchmal wünscht man sich die Dinger wären so übersichtlich wie 
ein ATMega8.
Angehängte Dateien:
Gast #5136386
Lesenswert?
• ▲
▼
Genau damit habe ich in den letzten Tagen auch gekämpft. Die 
STM32F7-Reihe hat eine geänderte DMA gegenüber den F4. Schau mal nach 
"Peripheral Flow Controller". Wenn die SPI den DMA-Takt vorgeben soll, 
muss das Bit PFCTRL im CR-Register des Streams gesetzt werden.
Gast #5143533
Lesenswert?
• ▲
▼
und wenn caches aktiv sind aufpassen in welchem bereich der 
speicherblock ist

manche SPeicherereiche werden gecached....
damit kommt die DMA nicht klar.

da hilft nur speicher neu ordnen und MPU richtig setzen
Gast #5143612
Lesenswert?
• ▲
▼
>Manchmal wünscht man sich die Dinger wären so übersichtlich wie
>ein ATMega8.


Ich habe zuerst mit einem STM32F1 gearbeitet (mehrere Monate 
durchgängig), dann habe ich mich mal an einen ATmega aus Neugier 
probiert. Wie einfach die Dinger doch gestrickt sind :-)

Zwei Bits in insgesamt zwei Register setzen und ein Interrupt ist 
konfiguriert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.