Communicating with the nRF24L01+

Hello everyone!

I’m trying to get started with a pair of sparkfun breakout boards for the nRF24L01+, coupling them with NXP LPC2364 microcontrollers. My problem lies in attempting to transmit data with the chips, interrupts are never raised (or lowered, as the IRQ pin is active low).

What I’m attempting to do is probably the simplest possible scenario: Bring the chip up, write data to the transmission payload, raise CE for 10 us to actually send the data and finally monitor the STATUS memory and/or IRQ for any changes. Unfortunately the final step fails, the IRQ pin never goes to 0 and TX_DS in STATUS never budges.

I took a few quick and ugly photos of my oscilloscope monitoring the process. The yellow signal is always the SCK signal. Please note that the signals look noisy, this is because of the ground I used for the oscilloscope probe which was far removed from the PCBs with my microcontrollers and nRF24L01+. When using the ground on the boards the signals are properly nice and square.

http://hermes.csbnet.se/~nicke/Images/osc_CSN.png

This first photo shows the SCK and CSN signal. CSN goes low well in time before SCK starts, and properly returns to a high value when the instruction has been sent.

http://hermes.csbnet.se/~nicke/Images/o … ayload.png

The second photo depicts the writing of the transmission data. The byte 0b10100000 (0xA0) is first, which corresponds to the W_TX_PAYLOAD instruction. Immediately following this is the byte 0b00000101 (0x0A), which was randomly chosen as the payload.

http://hermes.csbnet.se/~nicke/Images/o … ayload.png

Here’s the MISO line during the W_TX_PAYLOAD instruction, STATUS is returned (0b00011111, 0x1F) on the instruction byte as expected and it’s dead silent when the payload is transmitted. For some reason the MISO pin normally floats around 2V whenever CSN isn’t low.

http://hermes.csbnet.se/~nicke/Images/osc_CE.png

Finally, the CE signal is raised. The data sheet calls for a minimum of 10 us in order to transmit the payload and as you can see it is raised for about 12 us. It is at this point that I’m expecting the IRQ pin to go low, and for TX_DS in STATUS to alert me that the payload has been sent.

http://hermes.csbnet.se/~nicke/Images/o … config.png

For good measure, here’s the CONFIG retrieval. The start of my program sets the CONFIG to 0b00001010 (0x0A), no interrupts are masked, CRC is enabled as it is a reset value, PWR_UP is high and PRIM_RX is low, so it should be ready to transmit.

I’m at a loss at this point. I’m not attempting to use any of the enhanced shockburst functionality just yet, all I currently want to do is transmit a byte and see the interrupt when it’s finished so that I can move on. The SPI communication appears to work fine as I’m able to write to the various registers as well as request any register I want and see the expected data. Would anyone care to point out exactly where I’m an idiot?

Problem sort-of-solved. It apperas that if I write 0x00 to the EN_AA register and then set the PWR_UP bit in the CONFIG register, the EN_AA resets to its default value. Writing 0x00 to the register again resolves the problem, although I see nothing in the data sheet that would explain why this particular register would reset.

Interrupts are now being received as expected.