Forum: Mikrocontroller und Digitale Elektronik STM32 L471 SPI3 komplett resetten


von Volker K. (vokuit00)


Lesenswert?

Hallo,

ich hätte mal ne Frage zu einem "kompletten" SPI-Reset.

Ich nutze bei einem STM32L471 die SPI3 im Full-Duplex mit Hardwaree NSS 
Signal "disabled".

Die SPI-Kommunikation zum Master läuft via DMA. Daten werden alle 6 ms 
vom Master gesendet.

Ein CS-Signal geht an einen Ausgangspin und wird dort via IRQ 
ausgewertet.

Wenn am Ende der Kommunikation der IRQ am CS ausgelöst wird, dann werden 
die empfangenen Daten ausgewertet (z.B. CRC-Prüfung), dann in ein 
anderes Array kopiert und mit der SPI1 als Full-Duplex-Master zu einem 
Feldbus-Prozessor geschickt. Dieser setzt diese Daten dann auf den 
Feldbus um bzw. liefert Ausgangsdaten vom Feldbus (über API-Funktionen 
die vom Feldbus-Prozessor-Hersteller kommen).

Gibt es auf dem Feldbus keine Probleme, dann läuft das alles problemlos. 
Gibt es auf dem Feldbus Probleme, dann haben die aufgerufenen Funktionen 
Timeouts, die länger sind als die "Wartezeit" für die nächste 
SPI-Kommunikation zu meinem SPI-Master aus SPI3.

Dort werden dann die empfangenen Daten "versetzt"  im Empfangsarray 
angezeigt.

Wenn es beim Feldbus-Prozessor keine Probleme mehr gibt, dann 
"verschwindet" dieser Versatz nicht mehr, obwohl ich bei erkannten 
Fehlern im CS-IRQ folgendes ausführe:

    if (hspi3.ErrorCode != HAL_SPI_ERROR_NONE)
    {
        __HAL_SPI_CLEAR_OVRFLAG(&hspi3);
        __HAL_SPI_CLEAR_MODFFLAG(&hspi3);
        __HAL_SPI_CLEAR_FREFLAG(&hspi3);
    }
    HAL_DMA_Abort(&hdma_spi3_rx);
    HAL_DMA_Abort(&hdma_spi3_tx);
    HAL_DMA_Abort_IT(&hdma_spi3_rx);
    HAL_DMA_Abort_IT(&hdma_spi3_tx);

    HAL_SPI_Abort_IT(&hspi3);
    HAL_SPI_Abort(&hspi3);
    HAL_SPI_AbortCpltCallback(&hspi3);
    HAL_SPIEx_FlushRxFifo(&hspi3);
    HAL_SPI_DeInit(&hspi3);
    MX_SPI3_Init();

Jetzt hab ich schon gelesen, dass bei Nutzung des HW-NSS eine steigende 
Flanke an diesem PIN dis SPI komplett zurück setzt. Ich habe aber noch 
nicht raus gefunden, wie ich das machen kann, wenn ich die HW-NSS nicht 
nutze.

Ich arbeite mit der HAL von STM, vielleicht könnt Ihr mir hier noch 
einen Tip geben?

Grüße
Volker

von Jan (Gast)


Lesenswert?

DMA neu initialisieren hat mir mal bei einem ähnlichen Problem geholfen.

von Volker K. (vokuit00)


Lesenswert?

Danke,

probier ich aus.

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