With a protocol design in hand, the next step was to go and implement it. My goal was to produce a library which would work on the nrfusb, and also on the auxiliary stm32g4 on the mjbots pi3 hat. In this first implementation pass however, I only worked with the nrfusb as both transmitter and receiver.
While developing this, I had more than my share of “huh” moments working from the datasheet and with the components. To begin with, the initial nrf24l01+ modules I got were all Chinese clone ones. While I was having problems getting auto acknowledgement to work, I discovered that the clones at a minimum were not compatible with genuine Nordic devices. Thus I reworked genuine parts into the modules I had:
That didn’t solve any of my immediate problems, but the subsequent modules I got all had genuine chips so it was useful that they all were compatible.
The other more annoying problems are somewhat obvious in hindsight. For a transmitter to be able to successfully receive an automatic acknowledgment from a receiver, not only does the ID need to be configured in the appropriate RX_ADDR register, but EN_RXADDR also needs to have the correct bit set. I had assumed that was only required for slave devices as there was no mention of it in any of the Enhanced Shockburst flow charts or setup procedures for transmitters or auto acknowledgment.
The second annoyance, was that when in receiver mode, switching channels seems to kinda work a little bit for some channels even with CE held high, but to be reliable you have to pull CE low and put the unit in standby mode while changing channels.
With those problems (and some others) resolved, I have a reliable bidirectional link that is ultimately tweakable. Next I’ll integrate this into the quad A1 to actually control the robot and monitor its telemetry.