Forum: Mikrocontroller und Digitale Elektronik STM32: SPI Empfang einschalten wenn Senden beendet


von Steffen H. (steffenh)


Lesenswert?

Hallo zusammen,

ich möchte eine SPI Verbindung (Vollduplex) zwischen zwei STM32F0 
aufbauen. Der Slave soll standardmäßig empfangen und nur, wenn er auf 
einen Befehl antworten muss, senden.

Der Slave erkennt anhand der Tx-Callback Routine (ich verwende HAL), 
dass er mit seinem Senden fertig ist und schaltet dann um:
1
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
2
{
3
  HAL_SPI_Receive_IT(&hspi1, pRecBuf_Dat, RecBuf_Len);
4
  return;
5
}


Das Problem: sobald der obige Callback beendet wurde, erkennt er, dass 
vermeintlich Rx Daten vorliegen. Er springt dann sofort in die 
Empfangs-ISR. Tatsächlich hat der Master aber nie Daten gesendet!

Wenn ich mir das Ganze im Debugger anschaue, sehe ich, dass das "RXNE" 
Flag gesetzt ist. Steppe ich dann im Einzelschritt weiter, verschwindet 
es auf (für mich) magische Weise von selbst, noch bevor die Empfangs-ISR 
erreicht wird.


Kann jemand mit diesem Phänomen etwas anfangen? Warum wird das "RXNE" 
Flag gesetzt, obwohl der Master nichts gesendet hat? Und warum 
verschwindet es im Debugger, nicht jedoch beim Release Build? Hat jemand 
eine Idee?

Grüße
Steffen?

von hp-freund (Gast)


Lesenswert?

Moin,
wäre es nicht besser es so wie fast alle zu machen?

Master sendet -> Slave empfängt -> Slave hat was zu sagen -> Int an 
Master -> Master holt Daten ab

Was Du beschreibst ist schon Multi Master.

von ui (Gast)


Lesenswert?

Steffen H. schrieb:
> Das Problem: sobald der obige Callback beendet wurde, erkennt er, dass
> vermeintlich Rx Daten vorliegen. Er springt dann sofort in die
> Empfangs-ISR. Tatsächlich hat der Master aber nie Daten gesendet!

Steht in den Daten immer 0x00 drin? Dann ist klar, woran es happert. Du 
hast den Receiver prinzipiell aktiviert (musst du ja) und da SPI ja 
immer (zumindest im Standardaufbau mit CLK/MOSI/MISO) immer gleichzeitig 
Daten in beide Richtungen sendet, hast du automatisch auch was 
empfangen. Wenn du keine Daten mim Master angelegt hast, halt 0x00 oder 
0xFF, je nachdem ob du noch Pull-Ups/Downs aktiviert hast.

von ui (Gast)


Lesenswert?

Steffen H. schrieb:
> Wenn ich mir das Ganze im Debugger anschaue, sehe ich, dass das "RXNE"
> Flag gesetzt ist. Steppe ich dann im Einzelschritt weiter, verschwindet
> es auf (für mich) magische Weise von selbst, noch bevor die Empfangs-ISR
> erreicht wird.

Könnten dann Timing-Problem sein. Während der Breakpoint erreicht wurde 
und der Debugger stoppt, vergehen ungefähr drölf Takte, da kann viel 
passieren. Wenn das Programm einfach durchläuft, kann es durchaus 
vorkommen, dass sowas passiert. Ist dann aber ein Konfigurationsproblem, 
das du dir mit deinem Aufbau eingefangen hast.

von ui (Gast)


Lesenswert?

hp-freund schrieb:
> Was Du beschreibst ist schon Multi Master.

Stimmt. Ist mir erst beim zweiten Mal durchlesen aufgefallen.
Sowas ist, mit wenig Erfahrung, keine gute Idee.

von Steffen H. (steffenh)


Lesenswert?

hp-freund schrieb:
> Moin,
> wäre es nicht besser es so wie fast alle zu machen?
>
> Master sendet -> Slave empfängt -> Slave hat was zu sagen -> Int an
> Master -> Master holt Daten ab
>
> Was Du beschreibst ist schon Multi Master.

Ich mache es so ähnlich, wie Du vorschlägst. Nur habe ich keinen 
expliziten Int, sondern Master und Slave wissen per Konvention, wann wer 
senden darf.

Das sieht dann so aus:

Master sendet Befehl -> Slave empfängt und berechnet Antwort -> Master 
holt Daten ab


Der Master bleibt aber immer Master und der Slave immer Slave.

von Steffen H. (steffenh)


Lesenswert?

Puh, ich habe mein Problem gefunden: Ich hatte Timing Probleme mit dem 
Software NSS!

Mein Master hat den NSS bereits ein paar Takte vor dem Ende der 
Übertragung weggenommen. Dadurch hat der Slave ein paar Bits, aber halt 
kein ganzes Byte in seinen Empfangspuffer getaktet. Und als er dann 
Senden sollte und wieder ein NSS gesehen hat, hat er zuerst den noch 
ausstehenden Empfang beendet und dann erst mit dem Senden angefangen. 
Den konnte er aufgrund des Versatzes aber nicht zuende bringen usw.

Puh, tricky.

Vielen herzlichen Dank für Eure Hilfe!

von Veit (Gast)


Lesenswert?

Steffen H. schrieb:
> Mein Master hat den NSS bereits ein paar Takte vor dem Ende der
> Übertragung weggenommen.
Auf's falsche Bit gewartet? TXNE zeigt an, wenn der Mini-Sende-FIFO 
wieder Platz hat. Erst BSY signalisiert, das die Daten tatsächlich raus 
sind...

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.