STM32 SPI kein Empfang trotz Daten

Gast #2683526
Lesenswert?

Hallo,

ich habe den SPI-Bus hier auf dem Oszi-Bildschirm. Alles verhält sich so 
wie es es sein muss. Ich sende Daten, kann Register beschreiben usw. 
Doch wenn ich nun versuch Daten aus dem Baustein zu lesen, so erhalte 
ich stets 0.
1
// Zieht CS auf LOW
2
CS_SELECT;
3
// Sendet die Adresse + READ
4
SPI_SendChar(READ_VALUE);
5
// Das zu lesende Register
6
SPI_SendChar(reg);
7
// Damit die Clock weiterläuft
8
SPI_SendChar(0x00);
9
// Wartet bis Daten vorhanden sind
10
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
11
// Daten auslesen
12
retvalue = SPI_I2S_ReceiveData(SPI2);
13
// Zieht CS auf HIGH
14
CS_UNSELECT;
15
return retvalue;

Warum lese ich ständig 0 aus? Auf dem Oszi werden die Daten vom Baustein 
bei meiner 0x00 auf die MISO Leitung geschrieben. Doch auslesen tu ich 
nichts. Die Funktion SPI_SendChar hält alle Timings ein und sendet 
einfach auf den Bus. Das klappt ja auch...
Weiß hier Jemand Rat?
Gast #2683545
Lesenswert?

holger schrieb:
>>Warum lese ich ständig 0 aus?
>
> Frag dein SPI_SendChar() das keiner hier kennt.

Eine Freundlichkeit wird hier heute wieder an den Tag gelegt... 
Unglaublich...
1
void SPI_SendChar(unsigned char d)
2
{
3
  SPI_I2S_SendData(SPI2, (uint16_t) d);
4
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
5
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
6
}

Der Controller ist ein STM32F415RGT6.
Gast #2683552
Lesenswert?

>Eine Freundlichkeit wird hier heute wieder an den Tag gelegt...
>Unglaublich...

Das geb ich dir gleich wieder zurück. Woher soll jemand wissen
wie dein Code aussieht? Das nächste mal lass ich dich einfach hängen
und sag gar nichts.

  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

Hier ist die Reihenfolge falsch, erst TXE und dann BSY.
Gast #2683581
Lesenswert?

Okay, alles klar - akzeptiert.
Aber gebracht hat das nichts. Bei der Reihenfolge habe ich mich an einem 
Beispiel orientiert, aber da kann man ja auch nichts trauen. Und da es 
ja funktioniert hat habe ich mir auch keine weiteren Gedanken gemacht.
Gast #2810485
Lesenswert?

Mein Hinweis kommt spät, hilft aber vielleicht anderen Programmierern, 
die hier reinlesen:
Vor dem Senden des Bytes zum Erzeugen des SPI-Taktes zum Antworten des 
SPI-Saves muss ein Dummy-Read gemacht werden, wenn bereits das RXNE-Flag 
gesetzt war:
// Zieht CS auf LOW
CS_SELECT;
// Sendet die Adresse + READ
SPI_SendChar(READ_VALUE);
// Das zu lesende Register
SPI_SendChar(reg);

//Dummy-Read zum Entleeren des Rxt-Buffers
if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == SET)
{ SPI_I2S_ReceiveData(SPI2);
}

// Damit die Clock weiterläuft
SPI_SendChar(0x00);
// Wartet bis Daten vorhanden sind
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
// Daten auslesen
retvalue = SPI_I2S_ReceiveData(SPI2);
// Zieht CS auf HIGH
CS_UNSELECT;
return retvalue;

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