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 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
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