Hallo Leute,
ich dreh hier grad durch, weil ich mit dem STM32F0 Discovery-Board
simplen SPI-Datentransfer nicht zum Laufen bekomme.
Argh, ich hab doch Urlaub und wollt gemütlich weng basteln :).
Naja, vielleicht könnt ihr mir ja helfen - meine letzte Hoffnung:
Denn hier sind ja anscheinend ein paar Leute unterwegs, die sich mit den
ST-µCs auskennen - ich wäre euch sehr dankbar, wenn ihr kurz mal über
meinen Code schaut, und mir sagt was ich falsch gemacht habe.
Soviel zur Vorrede:
Ich habe gerade keine Ansprüche mehr. Ich will fürs erste nur das es
läuft.
Ich brauch kein nicht/halbfunktionierendes NSS-Signal und habe auch
mittlerweile meine Peripherie abgeklemmt und direkt SPI1 mit SPI2 auf
dem Discovery-Board verbunden um anderweitige Fehler möglichst
auszuschließen.
SPI1 ist mein Master und schickt ein Byte an den Slave.
SPI2 ist mein Slave.
MOSI ist mit MOSI verbunden.
MISO habe ich für den Versuch auch weggelassen
NSS von SPI2 ist direkt mit GND verbunden - also immer aktiv
Initialisierung von SPI1 (Master) und SPI2 (Slave):
1 | /*SPI1-Konfigurieren:
|
2 | SCK = PA5
|
3 | MISO = PA6
|
4 | MOSI = PA7
|
5 | */
|
6 |
|
7 | /*Clock für die Peripherie einschalten*/
|
8 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
|
9 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
|
10 |
|
11 | /* Benötigte PINS aktivieren */
|
12 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
13 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
14 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
|
15 | GPIO_Init(GPIOA, &GPIO_InitStructure);
|
16 |
|
17 | /*SPI1-Konfigurieren*/
|
18 | SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
19 | SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
|
20 | SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
|
21 | SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
|
22 | SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
|
23 | SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //Nicht verwendet
|
24 | SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
|
25 | SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
26 | SPI_InitStructure.SPI_CRCPolynomial = 7;
|
27 | SPI_Init(SPI1,&SPI_InitStructure);
|
28 |
|
29 | /*SPI1 aktivieren*/
|
30 | SPI_Cmd(SPI1, ENABLE);
|
31 |
|
32 |
|
33 | /*SPI2-Konfigurieren:
|
34 | NSS = PB12 //Pin direkt mit GND verbunden, damit SPI immer aktiv ist.
|
35 | SCK = PB13
|
36 | MISO = PB14
|
37 | MOSI = PB15
|
38 | */
|
39 |
|
40 | /*Clock für die Peripherie einschalten*/
|
41 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
|
42 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
|
43 |
|
44 | /* Benötigte PINS aktivieren */
|
45 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
|
46 | GPIO_Init(GPIOB, &GPIO_InitStructure);
|
47 |
|
48 |
|
49 | /*SPI2-Konfigurieren*/
|
50 | SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //Empfänger ist Slave
|
51 | /*SPI2 aktivieren*/
|
52 | SPI_Cmd(SPI2, ENABLE);
|
Meine Endlosschleife schaut dann so aus - da sind keine Interrupts mehr
- da ist eigentlich gar nichts mehr. Es geht trotzdem nicht.
Ich glaube ich habe einfach irgendwo einen dummen Denkfehler und checks
net :(.
1 | while (1)
|
2 | {
|
3 | c_daten=0;
|
4 |
|
5 | SPI_SendData8(SPI1,0xAA);
|
6 |
|
7 | /* 100 ms delay */
|
8 | Delay(100);
|
9 |
|
10 | c_daten = SPI_ReceiveData8(SPI2);
|
11 |
|
12 | /* 100 ms delay */
|
13 | Delay(100);
|
14 |
|
15 | }
|
In c_daten steht NACH dem ersten Durchlauf der Schleife weiterhin 0x00
und dann in allen weiteren Schleifen-Durchläufen 0xFF - unabhängig von
dem was von SPI1 gesendet wird...
Ich würd mich sehr sehr über Hilfe freuen, weil ich wie gesagt grad
ziemlich am Ende bin.