Hallo,
ich habe ein Bluepill Board und versuche gerade beide SPI Busse zu
benutzen. Ich habe die Seiten von Stefan Frings und seine CMSIS Dateien
als Start benutzt:
http://stefanfrings.de/stm32/stm32f1.html
Das gefällt mir ganz gut, das Setzen der Registerwerte funktioniert
ähnlich wie ich das vom AVR mega gewohnt bin. Jetzt bin ich aber auf ein
Problem gestoßen bei dem mir das Rference Manual und Beispiele im
Internet nicht weiter helfen. Ich versuche beide SPI Busse zu benutzen,
aber es gelingt mit nur beim SPI1. Der SPI2 schiebt keine Daten raus,
und sein "TXE" (TX buffer empty) Bit geht nach dem ersten schreiben auf
Null und wird nie wieder high.
SPI2 hängt auf dem APB1 Bus, währen die Peripherie die ich erfolgreich
benutzt habe (SPI1 und USART1) am APB2 hängen. Vielleicht ist das ein
Hinweis? In allen Beispielen im Internet hat auch bei APB1 Peripherie
ein Aktivieren gereicht:
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN); // Enable SPI2
Im Reference Manual habe ich keinen Hinweis gefunden dass mehr als das
nötig ist. Am CPU Clock wird nichts verändert, es sollten also alle
Clocks bei 8MHz liegen.
Ich hänge mal den kompletten Code hier rein. Am Anfang von main wird
direkt in die Funktion "test_spi2" gesprungen, dort nur die beiden SPI
initialisiert (nur "init_gpio();" wird angespungen, alle anderen
Funktionen werden in diesem Beispiel nicht benutzt)
Vielleicht sieht einer der ARM-Freaks gleich das Register das ich noch
setzen müsste...
/* Configure MISO as Input with internal pull-up */
60
GPIO_InitStruct.GPIO_Pin=SPI_MISO_PIN;
61
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
62
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
63
GPIO_Init(GPIOA,&GPIO_InitStruct);
64
65
SPI_Cmd(SPI1,ENABLE);
66
67
}/* --- SPI_Init --- */
Für das andere SPI muss man halt darauf achten das richtige
RCC_APBxPeriphClockCmd und RCC_APB2Periph_SPIx zu verwenden,
das gilt auch für die entsprechenden Ports und Alternate
Functions.
Meiner Meinung nach sehr übersichtlich, und es gibt kein
Gefrickel mit Bits im Register setzen oder clearen ....
asd schrieb:> Der SPI2 schiebt keine Daten raus,> und sein "TXE" (TX buffer empty) Bit geht nach dem ersten schreiben auf> Null und wird nie wieder high.
Mit dem Problem bist du offenbar nicht alleine, schau:
Beitrag "Stm32f103 Problem mit Spi2"
Leider habe ich keine Lösung. Hast du den MISO Pin als Eingang
konfiguriert? Das ist im Master Modus wichtig.
Dort gibt's noch ein anderes Beispiel mir ausführlicher Erklärung:
https://learnbuildshare.wordpress.com/about/stm32/using-spi-as-master/