At the time of publishing, one of the easiest ways of prototyping or evaluating a 802.11ah HaLow client without having to spin your own PCB is using the commonly available Wi-Fi HaLow Transceiver for Seeed Studio XIAO (SKU: 109100041). This board is available from suppliers such as SeeedStudio, Aliexpress and DigiKey.
The PCB is populated with a Quectel FGH100M-H HaLow module. This module operates in the 915MHz ISM band and according to the latest Product Brochure (V8.6) from Quectel has FCC (United States), RCM (Australia & New Zealand) and Anatel (Brazil) regulatory certification.
The FGH100M-H is based on the Morse Micro MM6108 first generation silicon. Quectel has launched the FGH200M using the MM8108 second generation silicon and while documentation is available, it is not yet in mass manufacture.
ESP32
While I regularly use the ESP32-S3 and ESP32-C6, and have a developed a lot of code with the Espressif esp-idf, the ESP32 target was not my first choice for a low power client. My first preference is normally Zephyr and an ARM MCU target. The good news is Morse has an Alpha port for Zephyr, but the esp-idf is a very good and easy stepping stone to better understand the module, the SDK framework, and test BCF and general interoperability. I assume, as Expressif already has robust wireless and a robust esp-idf, porting 802.11ah to this platform was easier.
Pinout
The Seeed Studio module is designed to connect to the rest of their XIAO ecosystem. Hence, the labelling of the I/O is D0 to D10 rather than a MM6108 function name. Below shows the function of the data pins.

Seeed Studio make available the schematics for the breakout PCB on their wiki page. From close examination, you will notice with modules from the factory come with:
- The Busy line is not connected (R17 is DNF), but pulled down to GND via R15.
- The WakeUp line is not connected (R10 is DNF), but pulled up to 3.3V via R9.

Firmware
There are two ways to integrate Morse Micro’s HaLow WiFi driver into your project.
The preferred way is using the morsemicro/halow component in esp-idf.
The other method is cloning the github.com/MorseMicro/mm-iot-esp repository. This method is deprecated.
ESP-IDF Toolchain
Regardless of your chosen path, if you don’t already, you will need the espressif software development environment installed. This can be installed on different platforms (Windows., Linux, Mac) and operated via the command line or within an IDE such as Visual Studio Code. Your best option is to follow the Getting Started Guide from espressif.
For morsemicro/halow 2.10.4-esp32-2 you will need a ESP-IDF SDK version 5.4.2 or greater, but under 6.0, i.e the 6.x SDK is not yet supported.
I used Ubuntu as my development platform and installed the ESP-IDF toolchain using the instructions below.
First we need to install any dependencies:
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
Next, install the esp-idf:
mkdir ~/esp cd ~/esp git clone -b v5.5.4 --recursive https://github.com/espressif/esp-idf.git esp-idf-v5.5.4 cd ~/esp/esp-idf-v5.5.4 ./install.sh esp32s3,esp32c6
The last command installs support for both ESP32-S3 and ESP32-C6 targets.
The esp flash tool and monitor program will want to communicate to the target over a serial port. Add yourself to the dialout group and then reboot:
sudo usermod -aG dialout your-username
Every time you start a new shell and want to compile using the esp-idf you will need to run:
. $HOME/esp/esp-idf-v5.5.4/export.sh
Morsemicro/halow ESP-IDF component
As highlighted earlier, this is the preferred option – and the easiest option. It also includes the board configuration files (BCF) needed for the module.
If your hardware connection is untested, the first application you will want to try is the Porting Assistant. It will test your GPIO and determine if it can communicate with the HaLow radio. If this is successful, you can proceed and test or develop other applications.
Within your active esp-idf environment execute the following:
idf.py create-project-from-example "morsemicro/halow=2.10.4-esp32-2:porting_assistant"
To configure your project (GPIO & BCF) run menuconfig:
idf.py set-target esp32s3 idf.py menuconfig
Upon the first build, the build tools will pull in any dependencies (sdk, firmware). These dependencies will reside in the managed_components folder, within your project.

The GPIO settings are found under Component config -> Morse Micro Shim Configuration and can be changed to suit your development board:

The Morse Micro Board Configuration File (BCF) should default to the same part we are using (FGH100M-HAAMD), however it is worth checking that it is set correctly. Under Component config -> Morse Micro Firmware Configuration ensure Morse Micro Board Configuration File is set to bcf_fgh100mhaamd.mbin

While not required for the porting assistance (but is mandatory for the other examples), you need to set your Country code under Component config -> Morse Micro Halow Connection Manager:

And if you are in Australia, check and set the frequency plan under Component config -> Regulatory Database – Australian channelisation configuration:

Make any additional changes required, then save and quit.
Now you can build the project:
idf.py build
Now flash your target and open the monitor:
idf.py flash monitor
If your GPIO connections and hardware is good, you should get an output similar to the following:

If successful, you can move on and try some of the other examples. If not, you need to work though any connectivity errors.
A common error for the Seeed Studio Halow Transceiver Module is an error relating to the busy pin being set high (see below). As mentioned earlier, the busy pin on this module is not connected. To overcome this error, I soldered in place a 0 ohm 0402 resistor for R17. This is so I can test the busy line ready for future development.

It is noted the newer morsemicro/halow components do not require the busy pin to be connected. The older code in the mm-iot-esp32 repository normally didn’t work correctly. Hence, you can proceed.
Scan Example Output
The scan example can be fetched using:
idf.py create-project-from-example "morsemicro/halow=2.10.4-esp32-2:scan"

STA_Connect
The WiFi Station (STA) connect example can be fetched using
idf.py create-project-from-example "morsemicro/halow=2.10.4-esp32-2:sta_connect"

MM-IoT-ESP32 Repository
This method is deprecated. Clone the repository:
git clone https://github.com/MorseMicro/mm-iot-esp32.git
Every time you start a new shell and want to compile using the esp-idf and MM-IoT-ESP32 framework, you will need to run:
. $HOME/esp/esp-idf/export.sh export MMIOT_ROOT=~/mm-iot-esp32
The examples can be found in the example folder and can be configured as per the managed components method above (using the menuconfig). However, the BCF file will most likely be set to bcf_mf08651_us.mbin and require changing to bcf_fgh100mhaamd.mbin.
The mm-iot-esp32 mm6108 BCF folder doesn’t have a configuration file for the FGH100MHAAMD. Morse Micro does have a copy in their https://github.com/MorseMicro/morse-firmware repo, but it is in an elf binary format. This needs to be converted into the Morse TLV binary format (mbin) for use with the MM-IoT-ESP32 SDK.
Morse provide a python script (convert-bin-to-mbin.py) to perform this task in the MM-IoT-SDK. If Python returns an error indicating no module named ‘elftools’, then you will need to install elftools.
sudo apt install python3-pyelftools git clone https://github.com/MorseMicro/morse-firmware.git git clone https://github.com/MorseMicro/mm-iot-sdk.git ~/mm-iot-sdk/framework/tools/buildsystem/convert-bin-to-mbin.py -o ~/mm-iot-esp32/framework/morsefirmware/mm6108/bcfs/bcf_fgh100mhaamd.mbin ~/morse-firmware/bcf/quectel/bcf_fgh100mhaamd.bin

Be the first to comment