Hallo Forum,
ich habe ein Problem mit meinem aktuellen Projekt. Ein Sensor ist per
SPI an meinen STM32H523 angeschlossen. Zyklisch werden Daten eingelesen.
Dazu verwende ich die DMA mit einer linked List (CubeIDE 1.18.1,
HAL_SPI_TransmitReceive_DMA(..)). Ein Timer arbeitet als Watchdog, falls
mal keine neuen Daten ankommen. Das ganze funktioniert prima bis auf
eine Stelle, an der die Kommunikation durch 'was auch immer' gestört
wird (Mein Test: kann der Sensor bei einem Fehler neu initialisiert
werden). Dann schlägt der Watchdog zu und ich versuche ein reinit der
SPI-DMA mit HAL_SPI_Abort(...).
Aber genau hier kommt es zum Problem, indem die HAL-Schicht hier klemmt:
1 | HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi)
|
2 | {
|
3 | ...
|
4 | /* Request a Suspend transfer */
|
5 | SET_BIT(hspi->Instance->CR1, SPI_CR1_CSUSP);
|
6 | do
|
7 | {
|
8 | count--;
|
9 | if (count == 0UL)
|
10 | {
|
11 | SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);
|
12 | break;
|
13 | }
|
14 | } while (HAL_IS_BIT_SET(hspi->Instance->CR1, SPI_CR1_CSTART));
|
15 | ...
|
16 | }
|
Das CSTART-Flag wird nicht gelöscht und die while-Schleife wird erst bei
count == 0 abgebrochen. Das Datenblatt sagt dazu:
"A transfer can be suspended at any time by setting the CSUSP bit of the
SPI_CR1 register, which clears the CSTART bit. This software suspension
control ensures the completion of any ongoing data frame."
Lt. meinem Oszi ist aber in dem Moment kein Frame unterwegs, die SPI
clockt nicht und tut auch sonst nichts.
Ich vermute es liegt an der DMA. Und tatsächlich wird die DMA auch
weiter unten in der HAL_SPI_Abort() abgeschaltet. Aber eben erst danach.
Kann mir hier jemand weiterhelfen?
Danke