Forum: Mikrocontroller und Digitale Elektronik STM32F429 - kein Takt am SPI


von AntVor (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche nun schon seit 7 Stunden, einen wohl kleinen, aber gemeinen 
Fehler zu finden:
Obwohl ich bereits sämtliche Tutorials und Beispiele durchprobiert habe, 
konnte ich das SPI (1, 4, 5, 6) auf meinem STM32F429-Discovery nicht 
richtig konfigurieren.
Es wird kein Clocksignal ausgegeben und keine Daten gesendet. Zwar 
schaltet der MOSI Pin entsprechend dem ersten zu sendendem Bit, dennoch 
passiert weiter nichts. Das TX Empty Flag bleibt dauerhaft gesetzt, das 
RX Not Empty Flag wird beim Schreiben ins DR-Register kurz gesetzt und 
erlischt sofort wieder.
Ich habe folgendes versucht zu machen:
- GPIO Takt aktiviert
- SPI Takt aktiviert
- GPIO Pins konfiguriert
- SPI konfiguriert
- Alternate Function der Pins konfiguriert
- SPI enabled
- Daten gesendet

Trotzdem komme ich einfach auf keine Lösung. Selbst Programmcode, den 
ich direkt aus dem Internet kopiere, wie z.B. die SPI-LoLevel-Library 
von http://mikrocontroller.bplaced.net/wordpress/?page_id=2751 zeigt 
dieses Fehlverhalten. Die Clocks habe ich mit SystemInit() konfiguriert 
(Projektdatei von genannter Seite heruntergeladen) und mit
1
 RCC_GetClocksFreq(&clocks);
 überprüft:
1
 // SYSCLK 180MHz, AHB1 180MHz, APB1 45MHz, APB2 90MHz

Mein gesamter derzeitiger Code ist im Anhang.
Vielen Dank bereits für wertvolle Tipps.

von Grundschüler (Gast)


Lesenswert?

ich würde den Fehler am ehesten bei der Warteroutine vermuten.

Ersetz die mal durch ein kurzes for-delay. Wenn das dann funktioniert 
hast du den Fehler eingegrenzt bzw wenn nicht, ausgeschlossen.

von AntVor (Gast)


Lesenswert?

Ich habe vor den zwei while-Schleifen schon einen for-Zähler eingebaut.
Wie gesagt, TX Empty ist die ganze Zeit gesetzt, RX not empty wird beim 
Schreiben vom Data Register gesetzt, dann sofort wieder gelöscht.

von derKer (Gast)


Lesenswert?

Ich sehe nicht wo du die Chipselect Leitung betätigst. Es steht zwar

// hier Code einfügen und
// ChipSelect-Pin auf LO legen

aber tun musst es noch...
Wenn das gegenüber nicht über den Chipselect ausgewählt wird, fühlt es 
sich nicht angesprochen, empfängt nichts und sendet auch nichts zurück. 
Somit bleibst du wahrscheinlich hier

// warte bis empfang fertig
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

hängen, weil nichts zurück kommt.

Gruss
derKer

von ARMdran (Gast)


Lesenswert?

"SPI_I2S_GetFlagStatus" deutet ein wenig auf eine Konfiguration der SPI 
als I²S hin, da würde ich nochmal nachschauen.

von AntVor (Gast)


Lesenswert?

Die SPI_I2S_*-Funktionen sind meines Wissens für beide 
Konfigurationsmodi gleich. Eine Chip-Select-Leitung brauche ich nicht, 
das dürfte ja das SPI nicht berühren.

von Uwe B. (derexponent)


Lesenswert?

derKer schrieb:
> aber tun musst es noch...
> Wenn das gegenüber nicht über den Chipselect ausgewählt wird, fühlt es
> sich nicht angesprochen, empfängt nichts und sendet auch nichts zurück.
> Somit bleibst du wahrscheinlich hier
>
> // warte bis empfang fertig
> while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
>
> hängen, weil nichts zurück kommt.
>


nein, tut er nicht

Anmerkung 1. der SPI-LoLevel-Code ist getestet und funktioniert

Anmerkung 2.
das senden per SPI von einem Master aus funktioniert
auch ohne das ein Slave angeschlossen ist

Hinweise :
ich würde mal per Debugger nachsehen wo die CPU nach dem SPI_SEND steht

A. entweder in einer ISR die nicht ausprogramiert ist
(typischerweise die Systick-ISR) oder
B. in einem Error-Handler

C. versuch mal das fertig compilierte HEX-File (von 
mikrocontroller.bplaced),
das MUSS laufen...ansonsten liegt es an der Hardware
(was ich mir aber nicht vorstellen kann)

von AntVor (Gast)


Lesenswert?

Die CPU wartet in einer Endlosschleife auf RX not Empty, dieses Bit 
bleibt (nach einem kurzen Impuls direkt beim DR schreiben) auf 0.

von Uwe B. (derexponent)


Lesenswert?

AntVor schrieb:
> Die CPU wartet in einer Endlosschleife auf RX not Empty, dieses Bit
> bleibt (nach einem kurzen Impuls direkt beim DR schreiben) auf 0.

sehr sonderbar,
ich benutze die Library bei mir auf dem STM32F429-Disco-Board
in vielen Projekten ohne Probleme

klingt wie wenn der Clock der "RCC_APB2Periph_SPI1" nicht aktiviert wäre

versuch mal (wie schon geschrieben) das fertig compilierte HEX-File
das ist getestet und benutzt SPI5 an PF7, PF8, PF9

von Grundschüler (Gast)


Lesenswert?

AntVor schrieb:
> Die CPU wartet in einer Endlosschleife auf RX not Empty, dieses Bit
> bleibt (nach einem kurzen Impuls direkt beim DR schreiben) auf 0.

das hört sich korrekt an:
RXnotEmpty =false bedeutet wohl der rxFifo ist leer. Worauf soll er dann 
noch warten?

Ersetz die Abfrage des Rxnotempty-flags durch die Abfrage des 
busy-Flags.

von Markus H. (haniham) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ohne jetzt Genau deinen Code angeschaut zu haben:
Das BSY flag soll man wirklich nur zum herausfinden des Endes benutzen - 
zum Feststellen wann das nächste Byte Geschrieben werden kann ist TXE 
besser

von Uwe B. (derexponent)


Lesenswert?

@AntVor,

ich habe mit deinen 3 Files gerade ein neues Projekt erstellt
und auf mein STM32F429-Disco programmiert
(CoIDE 1.7.4, GCC 4.7 2012q4)
ohne deine include Files, sondern die von ST
(vom STM32F429 für GPIO, RCC, SPI)

und alles funktioniert wie es soll,
(eine Warning wird angezeigt, weil die Variable "wert" nicht benutzt 
wird)

aber die CPU bleibt nicht hängen und sendet das was sie soll.

Gruss Uwe

von Uwe B. (derexponent)


Lesenswert?

Grundschüler schrieb:
> RXnotEmpty =false bedeutet wohl der rxFifo ist leer. Worauf soll er dann
> noch warten?

auf den Empfang von einem Byte !
wenn ein Byte gesendet wurde, wird bei SPI auch automatisch eines 
empfangen

Markus H. schrieb:
> zum Feststellen wann das nächste Byte Geschrieben werden kann ist TXE
> besser

es soll aber kein "zweites" Byte geschrieben werden,
es soll gewartet werden, bis man das SPI-RX Byte auslesen kann
und erst DANACH kann (event.) ein zweites Byte gesendet werden

scheinbar funktioniert ja schon das senden nicht :

AntVor schrieb:
> s wird kein Clocksignal ausgegeben und keine Daten gesendet.

dann kann logischerweise auch das empfangen nicht funktionieren

der Grund bleibt mir allerdings schleierhaft
(aber ohne Glaskugel ist da nicht weiter beizukommen)

Gruss Uwe

von holger (Gast)


Lesenswert?

>der Grund bleibt mir allerdings schleierhaft

Vieleicht denkt er ja das der SPI Clock ständig
anliegt wenn er das SPI Modul aktiviert. Der ist
aber nur da wenn man etwas sendet.

Einfach mal
1
//    wert=spi_send(0x45);
2
3
4
  while(1) {
5
    wert=spi_send(0x45);
6
    i++;
7
  }

dann kommt da auch Dauerfeuer raus.

von AntVor (Gast)


Lesenswert?

Hey,
könntest du bitte gesamten Projekt-Ordner hochladen? Es kann gut sein, 
dass es an den Includes liegt. Da haben wir einiges angepasst (Das 
Projekt-Team).
Wäre dir sehr dankbar!

mfg AntVor

von AntVor (Gast)


Lesenswert?

Das Busy-Flag bleibt die ganze Zeit auf 0.
Das TX empty Flag bleibt die ganze Zeit auf 1,
daher kann ich auch sofort ein zweites Byte senden.

von Uwe B. (derexponent)


Lesenswert?

die Version 1.0.1 gibts hier, wenn dein Google nicht funktioniert

http://www.st.com/web/en/catalog/tools/PF259429#

Hinweis :
einen Thread starten mit bitte um Hilfe
(und passendem Quellcode)
und dann nach 14 Posts zu schreiben "ihr" habt was
an den Bibliotheken geändert, ist mal wieder typisch

ich bin drausen

von AntVor (Gast)


Lesenswert?

Entschuldigung, mein Kollege hat vorhin Mist erzählt.

Selbstverständlich haben wir NICHTS an den Bibliotheken geändert, das 
wäre ja vollkommener Schwachsinn.

Soweit ich das beurteilen kann, haben wir die Originale aus der 
ST-Firmware verwendet, ich habe gerade noch mal das Änderungsdatum 
kontrolliert.

Wir werden das Projekt im August weiterführen und uns bei Bedarf dann 
nochmal melden.

Vielen Dank für alle Antworten bisher!.

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.