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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren