Forum: Mikrocontroller und Digitale Elektronik STM32 SPI TXE Flag wird nicht 0


von Neuling (Gast)


Lesenswert?

Hallo zusammen!

ich benutze einen STM32G484 und möchte einen SPI Slave ansteuern.
Folgender Code soll n-Bytes vom Slave lesen, hierbei muss ich als erstes 
die Adresse senden und anschließend den RX Buffer auslesen.
1
void bsp_radio_spi_read_blocking_addr(uint8_t address, uint8_t *data, uint8_t size) {
2
    uint8_t wr_ptr = 0;
3
    int8_t rd_ptr = -1;
4
5
    while((( hradio_spi.Instance->SR) & SPI_FLAG_TXE) != SPI_FLAG_TXE);
6
    *(uint8_t *)&hradio_spi.Instance->DR = address;
7
8
    do {
9
       //Hier bleibt TXE immer gesetzt.
10
        while(((( hradio_spi.Instance->SR) & SPI_FLAG_TXE) == SPI_FLAG_TXE) && (wr_ptr < size)){
11
            *(uint8_t *)&hradio_spi.Instance->DR = data[wr_ptr++];
12
        }
13
14
15
        while(((( hradio_spi.Instance->SR) & SPI_FLAG_RXNE) == SPI_FLAG_RXNE) && (rd_ptr < size)){
16
            if (rd_ptr >= 0) {
17
                data[rd_ptr] = (uint8_t) hradio_spi.Instance->DR;
18
            } 
19
            rd_ptr++;
20
        }
21
    } while (rd_ptr < size);
22
}

Das ganze funktioniert bis zu einer Datenmenge von 4 Bytes, sobald ich 5 
oder mehr verwende, bleibt die Funktion hängen.
Mit dem Logicanalyser und einigen Pin-Toggles hab ich nun rausgefunden, 
dass die Funktion beim befüllen des Sendebuffers hängt.
Der STM32G4 hat eine TX-Fifo mit 32 Bit, TXE sollte gelöscht werden, 
wenn 2 Byte im Sendebuffer stehen.

Ich prüfe also in Codezeile 10 ob TXE gesetzt, also der Buffer bereit 
ist, weiter Daten anzunehmen. Wenn ja, und ich noch nicht alle Daten in 
den Buffer geschrieben habe, schreibe ich das nächste Wort rein.
Mein Problem ist jetzt, dass TXE nie 0 wurde, somit wurden alle Daten 
reingeschriebe, und auch gesendet und ich bekomme einen Overflow im 
RXFIFO.

Sollte das TXE Flag nicht rückgesetzt werden, wenn die FIFO ein 
bestimmtes Level erreicht?
Ich glaube die Initialisierung des SPI/RCC ansich sollte passen, da bei 
weniger Daten alles einwandfrei funktioniert (Weils in die FIFO passt 
natürlich).
Ist der Schreibzugriff auf SPI->DR blocking?

Vielen Dank für eure Hilfe!

von Jim M. (turboj)


Lesenswert?

Problem: Du schreibst zuviel in den TX ohne den RX Teil rechtzeitig 
auszulesen. Das gibt einen RX overflow Fehler -> SPI hält an.

Abhilfe: Mach aus dem while() unter dem Kommentar ein if().

von Neuling (Gast)


Lesenswert?

Ja aber sollte nicht genau deswegen irgendwann das TXE gelöscht werden, 
so dass ich dann ja automatisch zum RX-Part komme?

Ist es möglich, dass der Schreibzugriff auf SPIx->DR blocking ist? Das 
würd's auch irgendwie erklären.

von Neuling (Gast)


Lesenswert?

Jim M. schrieb:
> Abhilfe: Mach aus dem while() unter dem Kommentar ein if().

Ich dachte mir, dass ich mit dem if wieder nur ein Byte jeweils 
schreibe, und so könnten, wenn die FIFO ganz leer ist, auch mal 2 Bytes 
gleichzeitig in das TX FIFO geschrieben werden

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.