STM32 SPI Daten sind zyklisch verschoben

Gast #4086048
Lesenswert?

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
#4086056
Lesenswert?

das problem mit dem verschobenen bit sehe ich bei dem fehlenden Chip 
Select.

Da (vermutlich) Rx zuerst initialisiert wird, empfängt die Hardware 
einen Clock-Strobe während der Initialisierung von Tx. Wäre hier der 
Chip Select auf "high", so würde die Hardware das ignorieren.
(man kann also sagen, dass der Chip Select den tatsächlichen Start der 
Übertragung festlegt)
Gast #4086568
Lesenswert?

Das ist es. Ich habe das Senden jetzt vor dem Empfangen gestartet und 
siehe da es läuft.

Auch mit den 16 Bit Übertragungen gibt es jetzt nur so viele Bytes 
Übertragung wie ich angebe.

Es wird jetzt so übertragen:
T TR TR TR TR TR TR TR TR TR R

Vielen Dank!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren