mikrocontroller.net

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


Autor: Holger Krähenbühl (holgerkraehe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:

  //SPI2 MISO
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //SPI2 MOSI, SCK, NSS
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15 | GPIO_Pin_13 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);


  SPI_InitTypeDef SPI_InitStructure;

  SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;  //Idle Status
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2,&SPI_InitStructure);

  SPI_CalculateCRC(SPI2,DISABLE);

  SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);

  SPI_Cmd(SPI2,ENABLE);



void SPI2_IRQHandler(void)
{
  uint8_t cmd;

  if(SPI_I2S_GetITStatus(SPI2,SPI_I2S_IT_RXNE) == SET)
  {

    cmd = SPI_I2S_ReceiveData(SPI2);
    SPI2->DR = 0xAA;
  }
}







Danke schonmal

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Holger Krähenbühl (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem war eine unsaubere GND Verbindung.

Ein Filter in die CLK Leitung und alles passt!

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.