Forum: Mikrocontroller und Digitale Elektronik SPI auf STM32f1: BSY-Bit wird nicht gelöscht


von Nase (Gast)


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

von Nase (Gast)


Lesenswert?

Nachtrag: Der SPI ist mit Takt versorgt (SPI1EN = 1 in APB2ENR) und auf 
dem Oszilloskop macht es tatsächlich nichts, also kein Takt zu sehen.

Beitrag #5320591 wurde von einem Moderator gelöscht.
von Rene K. (xdraconix)


Lesenswert?

Ich gehe davon aus, das der Fehler in Zeile 42 liegt!

Im übrigen sprichst du nicht vom Datenblatt, sondern vom Reference 
Manual. Das Datenblatt ist ein anderes.

Dein AFIO ist auch richtig gestellt?

von Nase (Gast)


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.

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.