STM32 SPI Slave sendet falsche Daten

OP #4696551
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
Angehängte Dateien:
Gast #4696566
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.
Gast #4696841
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.

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