Forum: Mikrocontroller und Digitale Elektronik STM32 SPI Slave sendet falsche Daten


von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe hier zwei STM32F105RBT6

Diese sind mittels SPI zusammen verbunden.
Board-A ist Master
Board-B ist Slave.

Der Master sendet kontinuierlich vier gleiche Bytes an den Slave (zum 
testen) Dieser sollte immer mit 0xAA antworten.

Nun habe ich wohl irgendwo ein Problem.
Im Bild im Anhang sieht man, dass der Slave bei zwei von vier Bytes 
korrekt antwortet. Bei den anderen zwei sendet er merkwürdigen müll.

Hat jemand eine Idee, woran das liegen kann?

Ich verwende bei beiden SPI2.
Der MISO wurde nicht mit Board-A verbunden sondern ist nur am 
Logicanalyzer angeschlossen. Eine unbeabsichtigte Belastung wegen falsch 
konfiguriertem Pin auf Board-A ist somit ausgeschlossen.


Hier noch mein Code des Slave:
1
  //SPI2 MISO
2
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
4
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
5
  GPIO_Init(GPIOB, &GPIO_InitStructure);
6
7
  //SPI2 MOSI, SCK, NSS
8
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15 | GPIO_Pin_13 | GPIO_Pin_12;
9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
  GPIO_Init(GPIOB, &GPIO_InitStructure);
12
13
14
  SPI_InitTypeDef SPI_InitStructure;
15
16
  SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
17
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
18
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
19
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
20
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
21
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
22
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
23
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;  //Idle Status
24
  SPI_InitStructure.SPI_CRCPolynomial = 7;
25
  SPI_Init(SPI2,&SPI_InitStructure);
26
27
  SPI_CalculateCRC(SPI2,DISABLE);
28
29
  SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
30
31
  SPI_Cmd(SPI2,ENABLE);
32
33
34
35
void SPI2_IRQHandler(void)
36
{
37
  uint8_t cmd;
38
39
  if(SPI_I2S_GetITStatus(SPI2,SPI_I2S_IT_RXNE) == SET)
40
  {
41
42
    cmd = SPI_I2S_ReceiveData(SPI2);
43
    SPI2->DR = 0xAA;
44
  }
45
}



Danke schonmal

von Wolfgang (Gast)


Lesenswert?

Holger K. schrieb:
> Der Master sendet kontinuierlich vier gleiche Bytes an den Slave (zum
> testen) Dieser sollte immer mit 0xAA antworten.

Bei SPI findet ein Datenaustausch zwischen Master und Slave statt, 
angetrieben durch den Clock vom Master. Der Slave antwortet nicht von 
sich aus, sondern er stellt nur ein Byte für die nächste vom Master 
initierte Übertragung bereit. Bei deinem ersten Byteaustausch steht 
anscheinend irgendwelcher Müll im Slave Register (0x2A). Beim zweiten 
Austausch kommt auf MISO die Antwort auf das erste Byte (0xAA) raus. Bis 
dahin passt das also.

von Holger K. (holgerkraehe)


Lesenswert?

Das Problem war eine unsaubere GND Verbindung.

Ein Filter in die CLK Leitung und alles passt!

von Arduinoquäler (Gast)


Lesenswert?

Holger K. schrieb:
> Ein Filter in die CLK Leitung und alles passt!

Toll!

Macken in der Digitalschaltung werden mit analogen Mitteln
behoben. Weiter so! Das hat sich bei vielen Kurpfuschern
bewährt.

Das Timing der CLK-Leitung stellt man übrigens am besten
mit einen R/C-Glied ein. Gut funktionierende Erfahrungswerte
liegen bei 10KOhm Längswiderstand und 10nF Quer-C. Damit
funktioniert fast alles!

Trotzdem du schon geraume Zeit hier im Forum bist schaffst
du es immer noch nicht deinen C-Code anständig zu posten,
so wie es die Regeln hier fordern.

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.