Hallo,
ich versuche grade die SPI Schnittstelle von dem STM32F407 zum laufen zu
bringen. Eig. möchte ich dann eine SD Karte ansteuern. Nur leider kommt
noch nicht mal ein Takt Signal heraus. Vielleicht könnt ihr euch mal den
Code ansehen.
> for(uint16_t i = 0; i < 100; i++); // min. 74 Takte an SCK warten
Das wird sicher keine 74 SCK warten. Es kommt kein SCK
ohne das man Bytes schreibt. Die Schleife optimiert dir
sowieso der Compiler weg weil sie nichts tut.
> SPI_I2S_SendData(SPI1, CMD0[i]);
Schau dir mal an was die Routine macht. Die prügelt Daten
ins Dataregister, mehr nicht. Du schreibst also sechs mal
schnell hintereinander Daten ohne zu warten ob die schon
gesendet wurden.
Hallo,
vielen Dank für die Antwort. Selbst wenn ich immer nur ein Byte senden
will und warte bis SPI_I2S_FLAG_BSY gelöscht ist, kommt kein Takt raus.
> Ich glaube du musst noch die AFIO-Geschichte mit einem Takt versorgen
Bei den F4ern gibt es das nicht.
Moritz
Auf den ersten Blick sieht für mich fast alles OK aus.
Ich würde aber den CS-Pin nicht als AF-Pin initialisieren, sondern als
OUT (bei NSS-Soft).
Wenn es wirklich nicht funktionieren will, kannst du ja mal alles exakt
so wie in den Beispielen von ST machen, d.h. z.B. Pull-Down und nicht
Up.
Oder du versuchst gleich das Beispiel von ST zum laufen zu bringen.
Hallo,
ja das mit AF ist mir schon aufgefallen. Macht aber auch keinen
Unterschied für SPI. Wenn ich UP in Down ändere passiert auch nichts
anderes
Moritz
Hallo nochmal.
Könnte es sein, das der SCK Prescaler vielleicht falsch eingestellt ist.
(SCK = APB2 / Prescaler)? Ich hab HCLK = 168MHz APB1 = 42MHz APB2 =
84MHz
Also müsste doch SCK eig. 84MHz / 256 = 328,8125kHz sein oder?
Moritz
>vielen Dank für die Antwort. Selbst wenn ich immer nur ein Byte senden>will und warte bis SPI_I2S_FLAG_BSY gelöscht ist, kommt kein Takt raus.
Woher weisst du das da kein Takt rauskommt?
Hoffentlich hast du da ein Osci dran. Aus SCK kommt kein
Takt wenn du nicht sendest. Also senden, senden, senden, senden...
Nicht nur ein popeliges Byte.
Hallo,
ja ich hab nen Oszi dran. Und ich sende immer 100x 0b10101010 direkt
hintereinander.
Ich hab das ganze mal auf SPI2 umgeändert. Das Problem ist jetzt, dass
wenn ich den MISO Pin(PB14) auf SPI2 mittels GPIO_PinAFConfig() remappen
möchte, in der Funktion GPIO_PinAFConfig() an der Stelle:
Es gibt im www ein deutsches Tutorial wo alles beschrieben wird. Is
total genial, nur leider hab ich den Link nicht zur Hand. SPI is da auch
beschrieben!
Ingo
>Hier nochmal mein Code mit SPI2:
Hör auf im dunkeln rumzustochern.
In der StandardPeripheralLib zum STM32F4 ist ein Beispiel
für ein SPI Flash. Da ist alles drin was du brauchst.
Vergiss das hier:
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
RXNE ist das was du abfragen musst. SPI_I2S_FLAG_BSY kommt in dem
Code überhaupt nicht vor. Im Datenblatt steht warum.
>ja den Code hab ich mir schon x-mal angesehn und nichts gefunden.
Nicht ansehen, benutzen.
Im Anhang mal meine Routinen für SPI1.
Die funktionieren, sind also über jeden Zweifel erhaben;)
Deine CS Leitung musst du noch selber initialisieren.
Ich habe es mal kurz mit meinem Code verglichen und auf die Schnelle
folgende Unterschiede gefunden:
- GPIO_Speed_100MHz und GPIO_PuPd_UP
- SPI_BaudRatePrescaler_256
- beim Senden teste ich auf:
while (SET != SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE));
- ganz am Anfang der Initialisierung:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); //sck
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); //mosi