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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.