USB nrf24L01

I bought a cheap USB stick to nrf24l01 adapter on aliexpress.

An alternative is to use a arduino nano or something with the

Would be much more flexible too.

However the convenience of just being able to pop in the little man is nice.

They module plugs in pointing away from the usb port. Red and Blue LEDs turn on.

Documentation is very poor. But apparently takes AT commands

I found this on a french ebay site.

Seems to be accurate. The actual seller I got it from suggested AT+ADD to set address which does not work

AT Commands
Baudrate : AT+BAUD=n where n =  1-6 (1:4800,2:9600,3:14400,4:19200,5:38400,6:115200) (default 9600Kbps)
NRF Rate : AT+RATE=n where n =  1-3 (1:250K, 2:1M, 3:2M ) (default 2Mbps)
Local Address : AT+RXA=0Xnn,0Xnn,0Xnn,0Xnn,0Xnn where nn are the local receiving address (default 0xff,0xff,0xff,0xff,0xff)
Target Address  : AT+TXA=0Xnn,0Xnn,0Xnn,0Xnn,0Xnn where nn are the target address
Operating Freq. : AT+FREQ=2.nnnG where nnn = 400 / 525 (default 2.400G)
Checksum mode : AT+CRC=n where n = 8 /16 (default : 16 bit)
System info : AT?

AT? gets

Ŀ��Է���ַ�� 0xFF,0xFF,0xFF,0xFF,0xFF

Probably that is Chinese. But we can get some guesses. What each of those means. The second address is RX, the first is TX. I checked by changing them with AT+RXA= commands

It has an STC chip on it STC11L04E. They’ve included source that does not accept AT commands, so is there a way to reprogram the chip? after looking at the datasheet seems plausible, but not worth the energy.

And the usb to serial chip is the ubiquitous CH340.

Put it on two computers. Or on the same comp.

In two windows type

screen /dev/cu.wchblah blah blah 9600

where the blah blah blah can be found using ls/dev and finding the full device name

Typing in just pipes it right over to the other man (9600baud). Pretty good.

Edit: Check out Pete’s post below for more info. Apparently there are version differences between boards


5 thoughts on “USB nrf24L01”

  1. Phillip…

    Your USB-nRF24l01 web page is very much appreciated…!
    I really wanted those AT Commands. Be forewarned…
    STC11L04E firmware differs between vendors and releases…
    Especially as the cheaper chinese send obsoleted inventory…
    You can see variations between the yellow/black block boards…
    In any event, I could not cut and paste the english descriptions…
    SO, I copied and typed into my device RTF document…
    Feel free to add these 2 paragraphs to your post…
    Note: Made very minor re-wording changes.

    Also post the vendor / revision NOTE differences to the post.

    USB-UART adapter for nRF24L01 modules and compatibles. This module makes possible communication between any computer and nRF24L01 network or devices. It is made from a USB-UART bridge, namely the CH340 from WCH, which is compatible with all platforms, and am MCU, the STC11L04E, in charge of nRF24L01 driving and UART communication interfacing, it also handles the AT configuration.

    The STC is a powerful MCU fitted with a simple yet efficient firmware providing transparent UART communication with zero-configuration as well as an AT command set for configuration. These configuration commands give control over UART baudrate, nRF24 communication rate, local and target address, working band, parity check mode, and to get configuration system information. For information source of a simple STC firmware are provided (Keil MDK, 51 edition), it is very easy to rewrite a firmware for most adventurous or those with specific needs. The nRF24L01 module has to be mounted as shown on the last picture.


  2. I have same freq ,rx & tx address,baudrate and CRC configuration on my device and nrf usb module and im sure all systems work correctly.
    But i cant make communication between pc and my device. I cant see any movement on uart software port on my pc

  3. Some hard-won knowledge that might help someone trying to navigate these AT commands. The modules I purchased differ in two ways from the command set documented above:

    AT+BAUD=n where n=1-7 (not 1-6), and 6:57600, 7:115200. Lower values map as documented above.

    AT+RXA / AT+TXA the hex values must be specified with a lowercase ‘x’ like 0x56, not like 0X57. Using uppercase will cause the command to fail.

    Also, I have a Python 3 routine to parse out the ‘payload’ from the Chinese unicode byte-strings returned by the module. My program also auto-reconfigured the baud rate to any desired value regardless of what it starts out as. It does a lot of other good stuff too, but those aspects may have some broader appeal.

    Finally, in communicating from an Arduino using raw SPI, I have to ‘fire and forget’ and not rely on any kind of retry or acknowledgement from the USB-interfaced radio. That was also confusing!

    1. Here is the python 3 logic to send AT commands and collect responses (stripping off the Chinese Unicode cruft). Apologies in advance for any formatting issues, not sure how to tell this system this is a code fragment:

      # The nRF24L01+ module responds in Chinese unicode with an nearly
      # inscrutable format, which we receive as a raw byte stream. The
      # actual ascii payload of each response follows an arbitrary mix of
      # unicode and ascii, but is (with one exception) always the last
      # run of ascii characters on the line. The exception is the CRC
      # length, which is returned as two distinct strings which must be
      # concatenated. We also discard trailing cr and lf characters.

      def GetPayload(RawBytes):
      State = ‘ascii’
      Payload = ”
      for Byte in RawBytes:
      if Byte 32:
      Payload += chr(Byte)
      if State == ‘ascii’:
      State = ‘unicode’
      if Payload != ‘CRC’:
      Extra = Payload
      Payload = ”
      if Payload == ‘CRC’:
      Payload += Extra
      return Payload

      # Send an AT command to the radio return any response, which may be
      # multiple lines.

      def RadioCommand(PortHandle, Command, Trace=False):
      Response = []
      PortHandle.write(b’AT’ + Command.encode(‘utf-8’))
      while True:
      Line = PortHandle.readline(80)
      if not Line:
      Line = GetPayload(Line)
      if Line:
      if (len(Response) > 8) and (Response[0] == ‘OK’):
      Response = Response[:8]
      if Trace:
      print(‘Command: [AT%s]’ % (Command))
      print(‘ %s’ % (Response))
      return Response

Leave a Reply

Your email address will not be published. Required fields are marked *