Hallo ich habe Probleme mit einem SPI Ringpuffer für den STM32F103. Das
Senden und Empfangen funktioniert ohne Interrupt. Auch mit einem
Interrupt funktioniert es. In dieser Implementation mit Ringpuffer wird
der letzte Wert nicht empfangen. Also zum Beispiel sende ich 6 Zeichen
empfange aber nur 5. Wenn ich im nachhinein schaue, ist das
SPI_I2S_FLAG_RXNE Bit sogar gesetzt, ich bekomme jedoch keinen
Interrupt. Wieso nicht? Seltsam ist, dass wenn ich
1 | SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, DISABLE);
|
auskommentiere nichts mehr funktioniert.
Habt ihr eine Idee hier ist meine ISR, vielleicht sehr ihr ja was da
falsch läuft.
Danke
1 | void SPI2_IRQHandler(void){
|
2 |
|
3 | // Receive
|
4 | if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == SET){
|
5 |
|
6 | if(inCurrent != bufferPos){
|
7 | // Data in Receive Buffer
|
8 | inBuffer[inCurrent] = SPI2->DR; // save data
|
9 | inCurrent = (inCurrent + 1) % FLA_BUFFER_SIZE;
|
10 |
|
11 | }else{ // all data received disable RX Interrupt
|
12 | SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE | SPI_I2S_IT_RXNE, DISABLE);
|
13 | }
|
14 | SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_RXNE);
|
15 | DEBUG_YELLOW_OFF;
|
16 |
|
17 | // Transmit
|
18 | }else if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == SET){
|
19 |
|
20 | DEBUG_YELLOW_ON;
|
21 | if(outCurrent != bufferPos){ // Transmit buffer contains data to send
|
22 | SPI2->DR = outBuffer[outCurrent]; // send data
|
23 | outCurrent = (outCurrent + 1) % FLA_BUFFER_SIZE;
|
24 | }else{ // Transmit buffer empty
|
25 | SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, DISABLE);
|
26 | }
|
27 | SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_TXE);
|
28 | }
|
29 | }
|