Skip to content

Radio validation tool

The purpose of this tool is to evaluate RF performance. It can be used to certify for both the ETSI and FCC standards. The tool is also helpful during hardware development to verify the RF behaviour.

The firmware has a CLI interface to send commands to.

Common use cases

Below is procedures for common use cases of this tool. For more information regarding the tool, see the command section.

Configure the frontend

This should be done before any of the other procedures if a frontend module is present. Configure the frontend, either with a predefined module or with a custom configuration. See frontend command section regarding frontend configuration for appropriate commands to run.

Measure RF output power

Set the output power to the maximum designated operating power.

Run transmit single <channel> for non hopping measurement or transmit hopping <start channel> <end channel> for measuring during hopping.

Measure hopping frequency separation

Set the output power to the maximum designated operating power.

Run transmit hopping <channel n> <channel n+1>

Measure adaptivity

Set the output power to the maximum designated operating power.

Run transmit single <channel>. When a CCA hit is detected a c will be printed instead of a #

Measure occupied channel bandwidth

Set the output power to the maximum designated operating power.

Run transmit single <channel>

Measure TX spurious emissions

Set the output power to the maximum designated operating power.

Run carrier transmit <channel>.

Measure RX spurious emissions

Run receive sweep.

Test receiver blocking

Set up two devices A and B with the radio validation tool. Device A should run transmit hopping <start channel> <end channel>. Device B should run receive scan <channel>, where channel is in the set of channels defined by start channel and end channel.

Automatic command sequences

It is possible to flash command sequences to the device that will be run when it starts.

A command sequence starts with commands that are always executed, then follows a mode definition and commands to run in that mode. Modes start with a number followed by a colon.

An example:

frontend module set 1
mode set button 0 13
mode set led 0 17
mode set leds 0 17 0 18 0 19
1:
transmit hopping 2 80
2:
receive status set 0 20
receive connect 40

Here the first four commands are always executed, then either the transmit command or the receive commands are executed.

When the "mode set button" command is run, it checks the provided port+pin. If that pin is low, the card will switch to the next higher mode (or wrap around to 1), then wait for the pin to be high again. If a button is connected to the pin, hold it down and reset the card to switch modes.

The "mode set led" command will blink the given port+pin as many times as the mode's number.

The "mode set leds" command will set the given ports+pins to the binary value of the mode.

Use the provided config2hex.py program to create a hex file with the command sequence:

./config2hex.py -f commands.config -o commands.hex -m nrf52840

then flash the hex file to the device together with the radio-test firmware.

Commands

The commands are divided into subgroups depending on what actions they perform.

Subgroup Group description
frontend Commands for settting and gettting configuration for frontend control
transmit Commands for transmitting radio packets
receive Commands for listening for radio packets
measure Commands for measuring RSSI
carrier Commands for transmitting carrier waves

frontend

The frontend command subgroup is used for either setting one of the predefined configurations for LumenRadio modules or for providing a custom frontend configuration.

Getting and setting the frontend configuration

Get one parameter of the frontend config.

fronted config get <param>
Set one parameter of the frontend config.
frontend config set <param>
Description of param:

param Description
gain_cb_bypass_tx Gain for passive frontend when transmitting
gain_cb_active_tx Gain for active frontend when transmitting
gain_cb_bypass_rx Gain for passive frontend when receiving
gain_cb_active_rx Gain for active frontend when receiving
gpio_mode_controlX (X = 0..3, value = 256+pin for P1.pin) Pins used to send control signals to frontend, for GPIO port P1 use 256+\<pin> for P1.\<pin>
gpio_antsel (value = 256+pin for P1.pin) Pin for selecting different antennas
pin_values_bypass_rx Values of GPIO pins for active frontend when receiving
pin_values_active_rx Values of GPIO pins for passive frontend when receiving
pin_values_active_tx Values of GPIO pins for active frontend when transmitting
pin_values_bypass_tx Values of GPIO pins for passive frontend when transmitting
pin_values_idle Values of GPIO pins when frontend is in idle
pin_values_antselX (X = 0 or 1) Value for antenna select pin
pin_values_antsel_idle Value for default antenna

Note

Formatting for pin_values_* param is an integer where the 4 least significant bits are the values used for the pins provided by the gpio_mode_controlX param.
For example: If gpio_mode_control0 = 1, gpio_mode_control1 = 2, gpio_mode_control2 = 257, gpio_mode_control3 = 258 and pin_values_active_rx = 11. 11 is 1011 in binary which then will translate into port0.pin1, port0.pin2, port1.pin2 being active and port1.pin1 being inactive when the frontend is in active RX mode.

Get the entire frontend config as a json that is compatible with mira_factory_configuration.py.

frontend json get

Set and get RF output power

Set desired output power. The radio has discrete steps in the output so not all powers can be exactly matched. If the power level can't be matched then the closest value that is less than the provided is set. The value is in centibel-milliwats (cBm) which is one tenth of decibel-milliwats (dBm).

frontend power set <power in cBm>
Get the current configured output power.
frontend power get

Select antenna

If multiple antennas are available via an antenna switch, then antennas can be switched with:

frontend antenna set <antenna>
Get current configured antenna.
frontend antenna get

Select a predefined module

Select predefined module.

frontend module set <type id>
Where type id is one of the following:

type id Module
5 MWA_N2
6 MWA_N3

Get current active frontend module.

frontend module get

transmit

Transmit on either one channel or a set of channels with channel hopping. The device will report the status of each transmission with a character aligned by channel, see description below:

Letter Description
# Succesful transmission
c Channel busy
. Internal error
f Internal fatal error

Transmit on a single channel

Transmit continuously on a single channel

transmit single <channel>

Transmit on a set of channels with channel hopping

Continuously transmit and does channel hopping in the provided span set of channels.

transmit hopping <start channel> <end channel>

receive

Receive packets from another device running a transmit command or do RX sweeps in the 2.4GHz band.

Connect to and receive packets from another device

Connects to another device running the transmit commands and continuously receives packets.

Note

Works both with transmit single and transmit hopping as long as the channel is equal or in the provided set of channels. If receiving from a device that does channel hopping, the hopping is followed when receiving.

receive connect <channel>
Receive sweep in the entire 2.4GHz band. This is a useful command to run for measuring spurious emissions and for doing EMC measurements.
receive sweep

measure

Measure receive signal strength indicator (RSSI)

Single measurement

To get a single RSSI measurement on a channel. If channel is not provided, all channels will be swept and the max value is returned.

measure rssi single <channel>

Continuous measurement

To do a continuos RSSI measurement on a channel. If channel is not provided, all channels will be swept and the max value is returned.

measure rssi cont <channel>

carrier

Transmit different carrier waves at given channel.

Modulated or unmodulated carrier

Transmit a modulated or unmodulated constant carrier.

carrier run <mod|unmod> <2..80>

Back to top