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!