Forum: Mikrocontroller und Digitale Elektronik STM32 SPI kein Empfang trotz Daten


von Dennis X. (Gast)


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?

von holger (Gast)


Lesenswert?

>Warum lese ich ständig 0 aus?

Frag dein SPI_SendChar() das keiner hier kennt.

von Tier (Gast)


Lesenswert?

Schön, dass du den STM32 Typ und den kompletten Code gepostet hast.

von Dennis X. (Gast)


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.

von holger (Gast)


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.

von Dennis X. (Gast)


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.

von Tier (Gast)


Lesenswert?

Dennis X. schrieb:
> Aber gebracht hat das nichts.
LOL, ohne den gesamten Code zu posten, bringts eben nüscht.

von olaf (Gast)


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;

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.