Forum: Mikrocontroller und Digitale Elektronik STM32 SPI Daten sind zyklisch verschoben


von Holger (Gast)


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

von Little B. (lil-b)


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)

von Little B. (lil-b)


Lesenswert?

der fehler, dass 40 byte übertragen werden, wenn SPI_DATASIZE_16BIT 
gesetzt ist, kann ich mir damit erklären, dass HAL_SPI_Receive_IT und 
HAL_SPI_Transmit_IT ein uint16_t[20] erwartet, du aber einen uint8_t[20] 
übergibst.

von Holger (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.