Tengo un problema con mi NRF24l01. Yo uso STM32F103 para leer datos o enviar datos con NRF24l01. La primera vez, mi código es trabajo. Puedo enviar mis datos y leerlos. Pero después de varias veces, cuando no hay datos que envío, mi NRF24l01 me da un problema. Mi receptor no obtendrá ningún dato después de eso.
Este es mi código para recibir datos:
enum eStatus ReceiveData2(void)
{
unsigned char statusNRF, addr, temp, cmd;
unsigned char *pdat, mydata, *stat;
//AccessSPI(R_REGISTER|STATUS, &temp, &statusNRF, 1, kReadSPI);
//AccessSPI(R_REGISTER|CONFIG, &temp, &statusNRF, 1 , kReadSPI);
// read FIFO status register
AccessSPI(R_REGISTER|FIFO_STATUS, &temp, &statusNRF, 1, kReadSPI);
// give 0x11 and 0x1C if no data send from another NRF
// give 0x12 and 0x1C if get data from another NRF
SendUSART(USART1, &statusNRF); // send to serial terminal
if ((statusNRF & (1<<RX_EMPTY))==0)
{
// read STATUS register from NRF
// read data pipe number
AccessSPI(R_REGISTER|STATUS, &temp, &statusNRF, 1, kReadSPI);
addr=(statusNRF >> 1) & 0x07;
//SendUSART(USART1, &statusNRF);
if (addr<6)
{
pdat=&(RXnrf[0]);
// read data which receive from NRF
AccessSPI(R_RX_PAYLOAD, &temp, pdat, 32, kReadSPI);
//if(pushStat==kFALSE) SendUSART(USART1, &(RXnrf[0]));
//pushStat=kTRUE;
//SendUSART(USART1, pdat);
if(RXnrf[0]=='m'&&RXnrf[1]=='s'&&RXnrf[2]=='g'&&RXnrf[6]=='e'&&RXnrf[7]=='n'&&RXnrf[8]=='d'&& empty==kTRUE)
{
mydata = RXnrf[4];
if(mydata >= 0x61 || mydata <= 0x6C)
{
SendUSART(USART1, &mydata);
empty=kFALSE;
}
}
// flush rx fifo status
FlushRXFIFO();
DelaymS(1000);
return(kDataExist);
}
cmd=(1<<RX_DR);
AccessSPI(W_REGISTER|STATUS, &statusNRF, &cmd, 1 , kWriteSPI);
return(kNoData);
}else
{
if(empty == kFALSE)
{
SendUSART(USART1, " ");
empty=kTRUE;
}
}
return(kNoData);
}
Y este es mi código para enviar mis datos:
void SendData2(unsigned char *pDat)
{
unsigned char statusNRF, cmd;
// stand by 1
AccessSPI(R_REGISTER|FIFO_STATUS, &cmd, &statusNRF, 1, kReadSPI);
if(statusNRF==0x11) // if TX FIFO is empty
{
CE1_HI;
// access stand by 2 mode
AccessSPI(W_TX_PAYLOAD, &statusNRF, pDat, 32 , kWriteSPI);
// tx-mode
CE1_HI;
DelayuS(kWaitBurst); // wait for 80 uS, read in oscilloscope
AccessSPI(R_REGISTER|FIFO_STATUS, &cmd, &statusNRF, 1, kReadSPI);
if(statusNRF==0x11) // if TX FIFO is empty
{
CE1_LO;
}
}
else if(statusNRF==0x01) // if TX FIFO is not empty
{
// tx-mode
CE1_HI;
AccessSPI(R_REGISTER|FIFO_STATUS, &cmd, &statusNRF, 1, kReadSPI);
if(statusNRF==0x11) // if TX FIFO is empty
{
CE1_LO;
FlushTXFIFO();
}
}
}
¿Por qué sucede? ¿Tiene NRF alguna regla para recibir o enviar? Acabo de seguir esta instrucción:
Además, el estado FIFO en mi receptor proporciona los datos 0x11 y 0x1C. Así que se ve como una condición normal. Pero no hay datos que obtengo de mi transmisor. Antes de que mi receptor no reciba ningún dato del transmisor, mi receptor recibe un ruido y los envía al terminal serie 0xFF y 0x1C. Después de varios, vuelve a su estado normal. Da 0x11 y 0x1C, pero no hay datos que obtengo del transmisor.
NOTA: los datos 0x11, 0xFF o 0x1C se leen desde el terminal serial.