Hello all,
I'm currently working on a project with a due date coming up soon. I'm using two (2) nRF24L01's with a nRF24L01+PA+LNA shield.
Right now I have my micro controller (PYNQ) with a single nRF and then an Arduino running Tmrh20's nRF code. The Arduino is able to write/receive from another Arduino, but the problem is with my PYNQ.
My issue right now is that while my PYNQ nRF24L01 is able to receive a message and print the message out, the FIFO buffer isn't being emptied. As well, when I try and transmit a message from the nRF24, the TX buffer fills up with the message, but the message is never sent.
I've read a lot of community support forums on the web but it doesn't look like anyone is having similar issues to what I'm having right now. Here's a quick snapshot of my read code:
void startListening() { setRegister(NRF_CONFIG, getRegister(NRF_CONFIG) | BV(PRIM_RX)); setRegister(NRF_STATUS, BV(RX_DR) | BV(TX_DS) | BV(MAX_RT)); gpio_write(gpio_device, 1); // CE = 1 if(pipe0_reading_address[0] > 0) { setRegisterMulti(RX_ADDR_P0, pipe0_reading_address, addr_width); } else { closeReadingPipe(0); } if(getRegister(FEATURE) & BV(EN_ACK_PAY)) { flushTX(); } } void stopListening() { gpio_write(gpio_device, 0); // CE = 0 delay_us(200); if(getRegister(FEATURE) & BV(EN_ACK_PAY)) { delay_us(200); flushTX(); } setRegister(NRF_CONFIG, getRegister(NRF_CONFIG) & ~BV(PRIM_RX)); setRegister(EN_RXADDR, getRegister(EN_RXADDR) | BV(child_pipe_enable[0])); } void readMessage_payload(u8* buf) { u8 readFromBuffer[33]; readFromBuffer[0] = R_RX_PAYLOAD; for(int i = 1; i < 33; ++i) { readFromBuffer[i] = NOP; } spi_transfer(spi_device, (const char*)readFromBuffer, (char*)buf, 33); // readBuffer now has all data } u8* readMessage(u8* buf) { stopListening(); while(hasMessages()) { readMessage_payload(buf); if(buf[1] != RXpacketCounters[buf[0]]) { // NOT Duplicate RXpacketCounters[buf[0]] = ((RXpacketCounters[buf[0]] + 1) & (PACKET_CNTER - 1)); startListening(); return buf; } } startListening(); setRegister(NRF_STATUS, BV(RX_DR) | BV(TX_DS) | BV(MAX_RT)); returnBuff[0] = 15; returnBuff[1] = 15; return returnBuff; }
Essentially what I am doing is having the nRF always in RX mode, and then when a message is available, the nRF switches PRIM_RX = 1, CE = 0 to move into StandBy-I mode, and then the nRF reads from the RX FIFO buffer, and then the nRF sets PRIM_RX = 0, CE = 1 to move back into RX mode.
However, the RX FIFO is never emptied after reading from it. I am able to successfully read a transmission, but I just keep reading that same transmission over and over again.
As well, similar things are happening on the TX side:
bool writePayload(u8* messageToSend) { u8 messageToSendFinal[33]; messageToSendFinal[0] = W_TX_PAYLOAD; for(int i = 0; i < 32; ++i) { messageToSendFinal[i + 1] = messageToSend[i]; } spi_transfer(spi_device, (const char*)messageToSendFinal, (char*)NULL, 33); delay_us(450); gpio_write(gpio_device, 1); delay_us(450); gpio_write(gpio_device, 0); setRegister(NRF_STATUS, BV(RX_DR) | BV(TX_DS) | BV(MAX_RT)); if(getRegister(NRF_STATUS) & BV(MAX_RT)) { flushTX(); return false; } return true; } bool writeMessage(u8 sendAddress, u8* message, u8 len) { stopListening(); bool success; if(myAddress == sendAddress) { return false; } packetToSend[0] = myAddress; packetToSend[1] = TXpacketCounters[sendAddress]; for(int i = 0; i < len; i = i + 1) { packetToSend[i + 2] = message[i]; } u8 spaceLeft = 30 - len; for(int i = 0; i < spaceLeft; i = i + 1) { packetToSend[i + len + 2] = 0; } openWritingPipe((BASE_ADDRESS + ((myAddress + ((MAX_NODES + 1) * sendAddress))))); success = writePayload(packetToSend); if(success == false) { startListening(); delay_ms(TIMEOUT * sendAddress); stopListening(); success = writePayload(packetToSend); } TXpacketCounters[sendAddress] = ((TXpacketCounters[sendAddress] + 1) & (PACKET_CNTER - 1) ); startListening(); return success; }
I have the register values printed out on my console as soon as the nRF starts up, and before it issues a read or write. The registers look like this:
0x0 : 0b1111 0x1 : 0b111111 0x2 : 0b111110 0x3 : 0b11 0x4 : 0b1101111 0x5 : 0b1101100 0x6 : 0b111 0x7 : 0b1110 0x8 : 0b1111 0x9 : 0b0 0xa : 0b11101 0xb : 0b111 0xc : 0b1001 0xd : 0b1010 0xe : 0b1011 0xf : 0b1100 0x10 : 0b11101 0x11 : 0b100000 0x12 : 0b100000 0x13 : 0b100000 0x14 : 0b100000 0x15 : 0b100000 0x16 : 0b100000 0x17 : 0b10001
If anyone has any idea / thoughts for why the buffers aren't emptying even though I am reading/writing to them, I would love to know!
Best,
Bryan