Forum: Mikrocontroller und Digitale Elektronik STM32 SPI, fehlendes MOSI Signal


von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo,
ich verzweifle gerade dabei, einen STM32L151RE dazu zu bringen, als 
SPI-Master zu funktionieren. Die Verdrahtung ist soweit vorgegeben, dass 
ich SPI1 verwenden muss und das chip-select Signal nicht von der 
Hardware generieren lassen kann. MISO, MOSI und CLK sollen vom 
Peripheral verwendet werden. Mein Vorgehen:

1) IOs initialisieren
- GPIO port A clock enable setzen (dort hängen MISO und MOSI)
- GPIO port B clock enable setzen (CLK)
- SPI1 clock enable

2) Alternative Funktionen einschalten
- GPIOA/B->MODER für MISO, MOSI und CLK auf "Alternate function mode" 
setzen.
- GPIOA/B->AFR für MISO, MOSI und CLK auf 5u gesetzt. Dieser Wert 
entspricht laut datasheet dann SPI1_MISO, SPI1_MOSI und SPI1_SCK

3) SPI1 konfigurieren
- Softwareslavemanagement Enable + Internal slave select
- SPI enable
- SPI Master
- Baudrate select = 1; ergibt laut Messung ~500KBaud

Am Oszi, sehe ich die durch SW gesteuerte CS-Leitung regelmäßig auf 
aktiv (low) gehen. Innerhalb der Bereiche, sehe ich Clock in 5 8er 
Blöcken und auf MISO sehe ich plausibel aussehende Antworten vom Slave. 
Die Daten vom Slave sehe ich auch in der Software wieder.

Was mir fehlt ist MOSI! Ich sehe da einfach kein Signal. Ich habe auch 
schon versucht, das Signal mal auf einen anderen Pin auszugeben, da sehe 
ich leider auch nichts.

Erkennt jemand von euch an dem Vorgehen einen Fehler?

mfg und vielen Dank für's Draufgucken,

Torsten

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Wahrscheinlich machst du irgendeine Einstellung bei Port A falsch. Port 
B mit dem SCK scheint ja zu funktionieren. An welchem Port haengt dein 
SW-CS?

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Angehängte Dateien:

Lesenswert?

Christopher B. schrieb:
> Wahrscheinlich machst du irgendeine Einstellung bei Port A falsch. Port
> B mit dem SCK scheint ja zu funktionieren. An welchem Port haengt dein
> SW-CS?

Der hängt auch an Port A. Ich habe MOSI gerade auch mal an einen PA12 
gehängt, weil ich vermutet hatte, dass evtl. irgend eine Lötstelle etc. 
das Problem sein könnte. Das hat aber auch nichts gebracht.

Danke für die Idee!

Ich habe mal den Quellcode angehängt, falls jemand die Zeit hat, da mal 
rüber zu gucken.

Edit: Ich habe auch noch mal ein Bild von CS und Clock angehängt.

von Little B. (lil-b)


Lesenswert?

Tipp 1:
Setze das "Enable Bit" ganz zum schluss der Initialisierung als 
sepparate anweisung.
Manche Bits lassen sich nicht ändern, wenn SPI bereits eingeschaltet 
ist.

Tipp 2:
SPI->CR1 hat zwar 0x0000 als reset value, ich würde mich aber nicht 
darauf verlassen. Setze es evtl. zuvor explizit auf 0!

Tipp 3:
in mode():
"( 0x03 << 2 * pin )" wäre mir nicht explizit genug, ich würde
"( 0x03 << (2 * pin) )" schreiben
analog natürlich auch bei allen anderen rotations-anweisungen

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Vielen Dank an Alle. Ich habe den Fehler gefunden. Ich tatsächlich 
einfach nur 0en rausgeschoben, da die Abfrage, ob der Sendpuffer schon 
"alle" ist, flashc war.

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.