Hallo zusammen Ich habe einen STM32 F0. Ich habe eine Vollduplex SPI Kommunikation zwischen zwei Boards. Grundsätzlich funktioniert die Kommunikation über die SPI Schnittstelle. Aber nach einigen Minuten betrieb habe ich auf einmal einen Versatz im RX Empfangsregister. Einzig und alleine hilft ein Reboot des Mikrokontrollers. Immer wenn das CS HIGH wird durchlaufe ich einmal die Funktion HAL_SPI_TransmitReceive_IT(); Wenn das CS auf LOW wird löse ich einen HAL_SPI_Abort_IT() und HAL_SPI_DeInit(ptrHspi) aus. Wie kann ich am einfachsten die SPI Schnittstelle reseten?
Thomas I. schrieb: > habe ich auf einmal einen Versatz im RX Empfangsregister. Ein Bit? Ein Byte? Mehrere? Thomas I. schrieb: > Einzig und alleine hilft ein Reboot des Mikrokontrollers. Wozu? Was läuft denn und was nicht. Thomas I. schrieb: > Wie kann ich am einfachsten die SPI Schnittstelle reseten? CS œ disablen
A. S. schrieb: > Thomas I. schrieb: >> habe ich auf einmal einen Versatz im RX Empfangsregister. > > Ein Bit? Ein Byte? Mehrere? Es verschiebt sich BYTE weise > > Thomas I. schrieb: >> Einzig und alleine hilft ein Reboot des Mikrokontrollers. > > Wozu? Was läuft denn und was nicht. Die neuen Daten starten nicht auf RX Register Pos 0 sondern irgendwo > > Thomas I. schrieb: >> Wie kann ich am einfachsten die SPI Schnittstelle reseten? > CS > œ disablen muss ich testen
Beitrag #5881239 wurde vom Autor gelöscht.
kenny schrieb: > Schon mal mit nem Oszilloskop die Übertragung angeschaut ? Ja sieht so soweit gut aus. Kann mit dem Oszilloskop auch die Daten decodieren das passt soweit.
Thomas I. schrieb: > Grundsätzlich funktioniert die Kommunikation über die SPI Schnittstelle. > Aber nach einigen Minuten betrieb habe ich auf einmal einen Versatz im > RX Empfangsregister. Dann geht in der Software vermutlich etwas schief. Fehlt ein Byte oder hast du eins zu viel? ;-) > Einzig und alleine hilft ein Reboot des Mikrokontrollers. Das ist unwahrscheinlich. "Alles neu" hilft natürlich erstmal, aber damit korrigierst du nur die Symptome. Du hast das eigentliche Problem nur noch nicht verstanden. Also hilft z.B. der Debugger, denn du vernünftig auf die Fehlerbedingung ansetzen musst, um zu verfolgen, warum da etwas schief geht. Laufen noch höher priorisierte Prozesse, die den Prozessor zeitweise länger blockieren?
Thomas I. schrieb: > Es verschiebt sich BYTE weise Viele SPI haben noch einen Empfangspuffer, den mußt Du leeren bei /CS = high.
Wolfgang schrieb: > Thomas I. schrieb: >> Grundsätzlich funktioniert die Kommunikation über die SPI Schnittstelle. >> Aber nach einigen Minuten betrieb habe ich auf einmal einen Versatz im >> RX Empfangsregister. > > Dann geht in der Software vermutlich etwas schief. Fehlt ein Byte oder > hast du eins zu viel? ;-) > >> Einzig und alleine hilft ein Reboot des Mikrokontrollers. > Das ist unwahrscheinlich. "Alles neu" hilft natürlich erstmal, aber > damit korrigierst du nur die Symptome. Du hast das eigentliche Problem > nur noch nicht verstanden. Also hilft z.B. der Debugger, denn du > vernünftig auf die Fehlerbedingung ansetzen musst, um zu verfolgen, > warum da etwas schief geht. Laufen noch höher priorisierte Prozesse, die > den Prozessor zeitweise länger blockieren? Die Feststellung ist, dass ich besonders schnell einen Abriss erhalte wenn ich mit dem Debuger verbunden bin. Es läuft schon noch einen Interrupt für die UART Schnittstelle sowie zwei Timer. Ich habe die SPI Kommunikation auf ca. 17 kBit/s heruntergenommen. Ich habe schon das Gefühl, dass der Mikrokontroller in gewissen Situationen nicht hinterher kommt. Ich habe eine Zykluszeit im Durchschnitt von ca 1.5ms auf dem Main Loop.
Peter D. schrieb: > Thomas I. schrieb: >> Es verschiebt sich BYTE weise > > Viele SPI haben noch einen Empfangspuffer, den mußt Du leeren bei /CS = > high. Wenn CS Hith wird leere ich den RX Buffer in der HAL Bibliothek gibt es eine solche Funktion.
Thomas I. schrieb: > Ich habe eine Zykluszeit im Durchschnitt von ca 1.5ms auf dem > Main Loop. Das heißt deine main wird nur alle 1.5ms durchlaufen?! Falls ja, was machst du in der ganzen restlichen Zeit?
SPI-Slave auf nem MC ist immer pain in the ass. Der SPI-Slave muß im Interrupt mit höchster Priorität laufen, sonst gehen Daten verloren. Sendet der Master direkt nach /CS = low, hat der Slave keine Zeit, Daten in das SPI zu schreiben, d.h. das erste Byte vom Slave ist Müll. Typisch baut man ein SPI-Protokoll so auf, daß der Master erst ein Befehlsbyte und dann ein Dummybyte sendet. Während des Dummybytes kann dann der Slave den Befehl parsen und gültige Daten in das SPI schreiben. D.h. ab dem 3.Byte liegen gültige Daten an. Falls DMA möglich ist, sollte man DMA verwenden.
Peter D. schrieb: > SPI-Slave auf nem MC ist immer pain in the ass. > Der SPI-Slave muß im Interrupt mit höchster Priorität laufen, sonst > gehen Daten verloren. > Sendet der Master direkt nach /CS = low, hat der Slave keine Zeit, Daten > in das SPI zu schreiben, d.h. das erste Byte vom Slave ist Müll. > > Typisch baut man ein SPI-Protokoll so auf, daß der Master erst ein > Befehlsbyte und dann ein Dummybyte sendet. Während des Dummybytes kann > dann der Slave den Befehl parsen und gültige Daten in das SPI schreiben. > D.h. ab dem 3.Byte liegen gültige Daten an. > Falls DMA möglich ist, sollte man DMA verwenden. Danke für die Hinweise. Das ganze habe ich mit Interrupt funktionen aufgebaut. Der Master beginnt nach ca. 3ms nach CS LOW zu senden. DMA sollte auch möglich sein, muss ich mir genauer anschauen.
Jdhdiebdkx schrieb: > Thomas I. schrieb: >> Ich habe eine Zykluszeit im Durchschnitt von ca 1.5ms auf dem >> Main Loop. > > Das heißt deine main wird nur alle 1.5ms durchlaufen?! Falls ja, was > machst du in der ganzen restlichen Zeit? Es sind sicherlich mehrere Effekte. Der uP läuft mit 8mHz und bedient ziemlich viel Peripherie. Timer Uart, SPI, PWM und der Main Code ist schon ca 40kB. Ich kann sicherlich die Taktfrequenz hoch setzen damit die themen besser abgearbeitet werden.
Thomas I. schrieb: > Der uP läuft mit 8mHz und bedient ziemlich viel Peripherie. Das wäre ziemlich untypisch für einen µC. https://de.wikipedia.org/wiki/Vors%C3%A4tze_f%C3%BCr_Ma%C3%9Feinheiten#SI-Pr%C3%A4fixe
Thomas I. schrieb: > Der uP läuft mit 8mHz Dann wirds auch schwierig mit der im Vergleich immer noch superschnellen SPI. Thomas I. schrieb: > Ich habe die SPI Kommunikation auf ca. 17 kBit/s heruntergenommen.
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.