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
DMA neu initialisieren hat mir mal bei einem ähnlichen Problem geholfen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.