variants/nrf52840/diy/xiao_ble/README.md
A step-by-step guide for macOS and Linux.
This guide will walk you through everything needed to get the XIAO nrf52840 (or XIAO nrf52840 Sense) running Meshtastic using an Ebyte E22-900M30S LoRa module. The combination of the E22 with an nRF52840 MCU is desirable because it allows for both very low idle (Rx) power draw and high transmit power.
The XIAO nrf52840 is a small but surprisingly well-appointed nRF52840 board, with enough GPIO for most Meshtastic applications and a built-in LiPo charger.
The E22, on the other hand, is a famously inscrutable and mysterious beast. It is one of the more readily available LoRa modules capable of transmitting at 30 dBm, and includes an LNA to boost its Rx sensitivity a few dB beyond that of the SX1262.
However, its documentation is relatively sparse overall, and seems to merely hint at (or completely omit) several key details regarding its functionality. Thus, much of what follows is a synthesis of my observations and inferences over the course of many hours of trial and error.
Huge thanks to those in the community who have forged the way with the E22, without whose hard work none of this would have been possible! (thebentern, riddick, rainer_vie, beegee-tokyo, geeksville, caveman99, Der_Bear, PlumRugOfDoom, BigCorvus, and many others.)
Please take the conclusions here as a tentative work in progress, representing my current (and fairly limited) understanding of the E22 when paired with this particular MCU. It is my hope that this guide will be helpful to others who are interested in trying a DIY Meshtastic build, and also be subject to revision by folks with more experience and better test equipment.
This guide and all associated content is for informational purposes only. The information presented is intended for consumption only by persons having appropriate technical skill and judgement, to be used entirely at their own discretion and risk. The authors of this guide in no way provide any warranty, express or implied, toward the content herein, nor its correctness, safety, or suitability to any particular purpose. By following the instructions in this guide in part or in full, you assume all responsibility for all potential risks, including but not limited to fire, property damage, bodily injury, and death.
Connecting the E22 to the XIAO nrf52840 is straightforward, but there are a few gotchas to be mindful of.
PIN_WIRE_SDA and PIN_WIRE_SCL, respectively. If you are not using I²C and would like to free up pins D4 and D5 for use as GPIO, PIN_WIRE_SDA and PIN_WIRE_SCL can be reassigned to any two other unused pin numbers.PIN_SERIAL1_RX and PIN_SERIAL1_TX) but are currently set to -1 in variant.h. If you need to expose a serial interface, you can restore these pins and move e.g. SX126X_RXEN to pin 4 or 5 (the opposite should work too).TXEN pin:
SX126X_TXEN in variant.h. In this configuration, the MCU will control Tx/Rx switching "manually". As long as SX126X_TXEN and SX126X_RXEN are both defined in variant.h (and neither is set to RADIOLIB_NC), SX126xInterface.cpp will initialize the E22 correctly for this mode.DIO2 pin only, with neither TXEN nor DIO2 being connected to the MCU. In this configuration, the E22 will control Tx/Rx switching automatically. In variant.h, as long as SX126X_TXEN is defined as RADIOLIB_NC, and SX126X_RXEN is defined and connected to the E22's RXEN pin, and E22_TXEN_CONNECTED_TO_DIO2 is defined, SX126xInterface.cpp will initialize the E22 correctly for this mode. This configuration frees up a GPIO, and presents no drawbacks that I have found.RXEN pin must always be connected to the MCU on the pin defined as SX126X_RXEN in variant.h.The default pin mapping in variant.h uses "Automatic Tx/Rx switching" mode.
If you wire your board for Manual Tx/Rx Switching Mode, SX126X_TXEN must be defined (#define #define SX126X_TXEN D6) in variants/seeed_xiao_nrf52840_kit/variant.h in the code block following:
#ifdef XIAO_BLE_LEGACY_PINOUT
// Legacy xiao_ble variant pinout for third-party SX126x modules e.g. EBYTE E22
| XIAO nrf52840 pin | variant.h definition | E22 pin | Notes |
|---|---|---|---|
| D0 | SX126X_CS | 19 (NSS) | |
| D1 | SX126X_DIO1 | 13 (DIO1) | |
| D2 | SX126X_BUSY | 14 (BUSY) | |
| D3 | SX126X_RESET | 15 (NRST) | |
| D7 | SX126X_RXEN | 6 (RXEN) | These pins must still be connected, and SX126X_RXEN defined in variant.h, otherwise Rx sensitivity will be poor. |
| D8 | PIN_SPI_SCK | 18 (SCK) | |
| D9 | PIN_SPI_MISO | 16 (MISO) | |
| D10 | PIN_SPI_MOSI | 17 (MOSI) |
| E22 pin | E22 pin | Notes |
|---|---|---|
| TXEN | DIO2 | These must be physically connected for automatic Tx/Rx switching to work. |
The schematic (xiao-ble-e22-schematic.png) in the eagle-project directory uses this wiring.
| XIAO nrf52840 pin | variant.h definition | E22 pin | Notes |
|---|---|---|---|
| D0 | SX126X_CS | 19 (NSS) | |
| D1 | SX126X_DIO1 | 13 (DIO1) | |
| D2 | SX126X_BUSY | 14 (BUSY) | |
| D3 | SX126X_RESET | 15 (NRST) | |
| D6 | SX126X_TXEN | 7 (TXEN) | |
| D7 | SX126X_RXEN | 6 (RXEN) | |
| D8 | PIN_SPI_SCK | 18 (SCK) | |
| D9 | PIN_SPI_MISO | 16 (MISO) | |
| D10 | PIN_SPI_MOSI | 17 (MOSI) |
(none)
xiao_ble as your targetvariants/diy/platformio.ini[env:xiao_ble]build_flags within this section, change -DEBYTE_E22_900M30S to -DEBYTE_E22_900M33Sfirmware.uf2 binary can be found in the folder .pio/build/xiao_ble/firmware.uf2 (relative to where you cloned the Git repository to), we will need it for flashing the firmware (manually)reset button to put it in bootloader mode, and a USB volume named XIAO SENSE will appearfirmware.uf2 file to the XIAO SENSE volume (refer to the last step of Build Meshtastic)meshtastic --noproto with the device connected to your computer via USB).
variant.h.variant.h. If you have made any changes to the pin mapping, ensure they do not result in a conflict. If all else fails, try reverting your changes and using the known-good configuration included here.During what became a fairly long trial-and-error process, I did a lot of careful testing of Tx power and Rx sensitivity. My methodology in these tests was as follows: