Forum: Mikrocontroller und Digitale Elektronik SPI Slave RX Byte versetzt


von Thomas I. (thomas_i298)


Lesenswert?

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?

von A. S. (Gast)


Lesenswert?

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

von kenny (Gast)


Lesenswert?

Schon mal mit nem Oszilloskop die Übertragung angeschaut ?

von Thomas I. (thomas_i298)


Lesenswert?

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.
von Thomas I. (thomas_i298)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

Thomas I. schrieb:
> Es verschiebt sich BYTE weise

Viele SPI haben noch einen Empfangspuffer, den mußt Du leeren bei /CS = 
high.

von Thomas I. (thomas_i298)


Lesenswert?

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.

von Thomas I. (thomas_i298)


Lesenswert?

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.

von Jdhdiebdkx (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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.

von Thomas I. (thomas_i298)


Lesenswert?

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.

von Thomas I. (thomas_i298)


Lesenswert?

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.

von my2ct (Gast)


Lesenswert?

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

von Knallharter Nachrechner (Gast)


Lesenswert?

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