Hallo,
ich versuche mich gerade daran mit Hilfe der STM Cube Software eine
Hardwarerealisierung mit SPI hinzubekommen.
Da ich nur einen Rechner und Debugger zur Verfügung habe kommunizieren
der SPI2 als Master under der SPI3 als Slave auf einem Board.
Die beiden MISO-Leitungen, MOSI-Leitungen und CLK habe ich jeweils
verbunden.
Mikroprozessor ist ein STM32F407.
Folgenden Code verwende ich zum initialisieren:
1 | /* SPI2 init function */
|
2 | void MX_SPI2_Init(void)
|
3 | {
|
4 |
|
5 | hspi2.Instance = SPI2;
|
6 | hspi2.Init.Mode = SPI_MODE_MASTER;
|
7 | hspi2.Init.Direction = SPI_DIRECTION_2LINES;
|
8 | hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
|
9 | hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
|
10 | hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
|
11 | hspi2.Init.NSS = SPI_NSS_SOFT;
|
12 | hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
|
13 | hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
14 | hspi2.Init.TIMode = SPI_TIMODE_DISABLED;
|
15 | hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
|
16 | hspi2.Init.CRCPolynomial = 7;
|
17 | HAL_SPI_Init(&hspi2);
|
18 |
|
19 | }
|
20 | /* SPI3 init function */
|
21 | void MX_SPI3_Init(void)
|
22 | {
|
23 |
|
24 | hspi3.Instance = SPI3;
|
25 | hspi3.Init.Mode = SPI_MODE_SLAVE;
|
26 | hspi3.Init.Direction = SPI_DIRECTION_2LINES;
|
27 | hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
|
28 | hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
|
29 | hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
|
30 | hspi3.Init.NSS = SPI_NSS_SOFT;
|
31 | hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
|
32 | hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
33 | hspi3.Init.TIMode = SPI_TIMODE_DISABLED;
|
34 | hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
|
35 | hspi3.Init.CRCPolynomial = 7;
|
36 | HAL_SPI_Init(&hspi3);
|
37 |
|
38 | }
|
Danach lasse ich SPI3 empfangen und dann SPI2 senden.
1 | HAL_SPI_Receive_IT(&hspi3, &RxBuffer, 20);
|
2 | HAL_SPI_Transmit_IT(&hspi2, &TxBuffer, 20);
|
Konfiguriere ich eine DataSize von 8 Bit so wird zwei mal der
Tx-Interrupt aufgerufen und einmal der Rx-Interrupt. Das so lange bis Tx
21 mal gemacht wurde und Rx 10 mal. Die ankommenden Daten ergeben keinen
Sinn.
Konfiguriere ich eine DataSize von 16 Bit so wird jeweils der Tx
Interrupt ausgelöst, gefolgt vom Rx Interrupt. Das ganze 20 mal, obwohl
ich eigentlich mit 10 mal gerechnet habe (10x16bit=20Byte).
Die Daten die ich dann empfange sind zyklisch verschoben. Bei den 16 Bit
die ich empfange sind alle Bits eins nach rechts verschoben und das Bit
ganz rechts steht im Empfangsbuffer ganz links.
Wie kann das kommen? Ich finde den Fehler einfach nicht.
Vielen Dank im Vorraus,
Holger