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.