SPI auf STM32f1: BSY-Bit wird nicht gelöscht

Gast #5320585
Lesenswert?

Hallo,

ich versuche gerade, einen der SPI auf einem STM32F103RB 
(Nucleo-Evalboard) in Betrieb zu kriegen.

Dabei bleibe ich in folgender Warteschleife stecken
1
while ( !(SPI1->SR & SPI_SR_TXE) || (SPI1->SR & SPI_SR_BSY) );
Eigentlich wollte ich damit warten, bis der SPI mit der letzten 
Übertragung fertig ist, d.h. bis das letzte Byte vom DR ins 
Schieberegister geladen wurde (TXE) und ganz herausgeschoben wurde 
(BSY). Das entspricht also dem Verfahren, das auch im erbärmlichen 
Datenblatt auf Seite 718 beschrieben ist.

Im Bebugger (openocd und Eclipse) sehe ich folgenden Zustand des SPI:
- es ist Master (MSTR = 1)
- es darf auch Master sein (SSM = 1 und SSI = 1)
- es ist eingeschaltet (SPE = 1)
- keine DMA aktiv

Außerdem:
- nichts zu übertragen (TXE = 1)
- nichts zu empfangen (RXNE = 0)

Aber:
- BSY = 1.

Was soll ich jetzt davon halten?!

Für Anregungen bin ich dankbar.

Grüße,
N
Beitrag #5320591 wurde von einem Moderator gelöscht.
Gast #5320601
Lesenswert?

Es ist "alles richtig eingestellt", denn wenn ich Zeile für Zeile 
durchsteppe, läuft alles korrekt.

Damit hat sich das Problem aber auch gerade herausgestellt.
Ich habe bei der Initialisierung den Vorteiler des SPI umgeschaltet, und 
zwar erst SPI deaktivieren, Teiler einstellen und SPI wieder aktivieren.

Wenn dabei noch was im Schieberegister war, wird das BSY-Bit natürlich 
nicht gelöscht, weil ich der SPI ja quasi vorher die Schuhe ausgezogen 
habe.
Deaktivieren der SPI löscht das BSY-Bit nicht. Man muss also entweder 
ein Byte senden oder vorher warten.

Erkenntnis hieraus: Die SPI bricht eine Übertragung offenbar tatsächlich 
mittendrin ab, wenn man sie deaktiviert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren