NRF24L01 - Channel Hopping (FHSS)

I am working on a simplex design for data transfer using the NRF24L01 I have sussed a very simple pairing technique too

  • It is a single transmitter, multi receiver network
  • I do a full channel scan when the transmitter powers up and it selects the quietest channel for broadcast
  • Channel 80 is the control channel
  • The transmitter broadcasts its 40bit and quiet channel every 2 seconds
  • The receivers sit and listen on 80 for the information
  • The system works very well

But now I want to try and do channel hopping (FHSS) - I have read what I can on the internet but the actual application of it eludes me as I still need to keep the following in my software

  • No acking
  • Payload of a max of 18 bytes
  • 250kbps only (best for distance)

I dont really want to use shockburst or start acking as this will interrupt the data flow, which ultimately will give data glitches which could be visible. The data is used for stage lighting, DMX512

Does anyone have a link or any morsel of information on Channel Hopping that could help me here ?

Thanks in Advance


Hey there. I have been testing lighting rigs using this library for the radio chip:

He has a streaming audio code base for these radios too!

I have bumped into these libraries before, they are brilliant work albeit a little beyond me at the moment :slight_smile:

There is some really good information here, no code but a technical walk through:

And of course, this is a great resource:

Thanks for the info flamdraggus :)

If it still interests you and if it's not too late, I would have created something that you will probably find interesting.


I have implemented FHSS in a way that seems to work very well. No timer is used. Only packet counting. Acks are not needed, but I use them anyway for other stuff. Establishing and re-establishing a link takes only about one second. I wonder if anyone else does it this way? It can run for days without any lost packets. I’m building a RC model flight control system.

My FHSS ‘the simple way’ works like this:

Five extra bytes are added to all sent data packets. These are :

1 - the number of data packets per hop. (<=255)
2 - the number of this packet.
3 - the channel number to hop to next.
4 - the top channel of current hopping range
5 - the lowest channel of current hopping range.

The receiver thus always knows what channel to hop to, and when, without a timer.
Channel numbers are randomly generated by the transmitter code.
If the receiver loses contact the range it must hunt is limited and known so reconnection is quick.

mmessiter: 3 - the channel number to hop to next. 4 - the top channel of current hopping range 5 - the lowest channel of current hopping range.

Doesn't that defeat the whole purpose of channel hopping ?