www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 SPI Master Overrun


Autor: TSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen komischen Effekt beim STM32 SPI.
Dieser zeigt mir im Master Mode ein Overrun Flag.

Ich spreche mit dem STM einen LTC1960 an.
Dieser verlangt zwischen den Bytes einen Impuls auf der SS Leitung.
Das Overrun Flag wird beim Senden des 2. Bytes gesetzt
     SPI_Cmd(SPI1,ENABLE);

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,0b00000100);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != RESET);
    temp1=SPI_I2S_ReceiveData(SPI1);

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);
    SPI_Cmd(SPI1,DISABLE);
    for(temp3=10;temp3>0;temp3--)
    {
      asm("nop");
    }

    SPI_Cmd(SPI1,ENABLE);
    //temp2=SPI_I2S_ReceiveData(SPI1);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,0b00000101);    //Senden 2. Byte
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != RESET);
    temp2=SPI_I2S_ReceiveData(SPI1);    
    while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_OVR)==1)
    {
      temp3=SPI_I2S_ReceiveData(SPI1);
    }
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);


    SPI_NSSInternalSoftwareConfig(SPI1,DISABLE);
    SPI_Cmd(SPI1,DISABLE);

erst wenn ich diese Zeile mit hinzu nehme läuft der code fehlerfrei 
durch
temp2=SPI_I2S_ReceiveData(SPI1);

Zu meiner Frage:
Warum wird das Overrun Flag gesetzt?

Grüße TSE

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo findet denn dieser SS Puls statt? Im obigen Code jedenfalls nicht, 
denn eine automatische Abschaltung von SS gibt es beim STM32 nicht.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TSE schrieb:

> Warum wird das Overrun Flag gesetzt?

Wenn du die empfangenen Daten nicht abholst dann ist irgendwann der 
Empfangspuffer voll. Zu jedem gesendeten Byte/Wort wird auch immer eines 
empfangen, ob genutzt oder nicht.

Autor: TSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo  A. K.

1.
 SPI_Cmd(SPI1,DISABLE);
    for(temp3=10;temp3>0;temp3--)
    {
      asm("nop");
    }

  SPI_Cmd(SPI1,ENABLE);

hier wird der Impuls generiert

2. mit
temp2=SPI_I2S_ReceiveData(SPI1);

werden die Daten aus dem RX Register gelesen (STD_Lib funktion)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TSE schrieb:

> hier wird der Impuls generiert

Weiss du das oder hoffst du das?

Der STM32 mag SS zwar bei entsprechender Konfiguration automatisch 
aktivieren, aber deaktivieren tut er es hardwareseitig nicht. Ob es die 
Lib tut weiss ich nicht.

> werden die Daten aus dem RX Register gelesen (STD_Lib funktion)

So wie ich dich verstanden habe, wunderst du dich, weshalb ohne diese 
Zeile ein Fehler kommt. Wenn ich das missverstanden habe, dann zeig den 
Code mal entsprechend kommentiert ohne dass man raten muss wo du die 
Zeile einfügst.

Autor: TSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Oszi zeigt mir den Impuls.
der Impuls ist nicht das Problem der kommt ganz gut.

Die Zeile die ich mein ist in meinem 1. Post auskommentiert; kommt 
gleich nach dem 2. Enablen

ist die Zeile drausn dann gehts nicht
ist die Zeile drinnen dann gehts.

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Ursache steht doch schon in

Beitrag "Re: STM32 SPI Master Overrun"

Oder nicht?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es einen guten Grund das SPI Interface jedes Mal komplett 
abzuschalten? Mach es Dir doch leicht (wie in den Beispielen der FW 
Lib):
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
...
SPI_SSOutputCmd(SPI_MASTER, ENABLE);
...
SPI_SSOutputCmd(SPI_MASTER, DISABLE);
...
SPI_SSOutputCmd(SPI_MASTER, ENABLE);
...
Dann würdest Du das Interface jedenfalls ein wenig im Sinne des 
Erfinders benutzen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... schrieb:
> Gibt es einen guten Grund das SPI Interface jedes Mal komplett
> abzuschalten? Mach es Dir doch leicht (wie in den Beispielen der FW
> Lib):
> SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
> ...


so geht das nicht, wenn man den NSS Pin als Frame select nutzen möchte.
Der STM zieht den nämlich auch low und da bleibt der bis zum 
Weltuntergang... Oder eben Reset bzw. bei Abschaltung des SPI.
Ich setze den NSS bin daher selbst per Software.

Grüße,
Michael

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.