Concurrent Mode with RAILtest#

This section assumes the EFR32FG25 is flashed with a RAILtest application image with a Wi-SUN concurrent PHY as described in the previous section.

Concurrent Mode Usage at the Rx Side#

With a concurrent PHY, the following steps are required at the receiver side:

  • All PA selected in the channel-based multi-PHY must be initialized (only required once at initialization, FSK PA first then OFDM PA).

  • Set up the PA configuration.

  • Set the recommended PA level (check the max level depending on the radio board, 16 dBm for EFR32FG25).

  • For IR calibration for OFDM PHY, call setchannel followed by “rx 1” for IR calibration.

The following is an example for NA concurrent mode using configindex 0 and setchannel 0 with the rail_config.c described in previous section:

rx 0
setconfigindex 0
setchannel 0
rx 1
# FSK and OFDM PA configuration + Calibration
rx 0
setpowerconfig RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE 3600 10
setpower 100
setchannel 0
rx 1
rx 0
setchannel 0
rx 1
rx 0
setpowerconfig RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE 3600 10
setpower 100
setchannel 0
rx 1

Concurrent Mode Usage at the Tx Side#

With a concurrent PHY, use the same initialization at the transmitter side as at the receiver side, with some additional configurations for Tx.

The following additional steps are required:

  • setTxdelay 10: Set 10 ms between data frames.

  • setTxLength 63: Set the data frame length. This could be another frame length value. Remember to call set802154Phr after a new setTxLength. Note that FSK frame length corresponds to setTxLength value -2 and that OFDM frame length corresponds to setTxLength value -4.

  • configTxOptions: Provides a way to select the base PHY or the alternate PHY in Tx through the concurrentPhyId field. Set to 0 to select the base PHY or 512 to select the alternate PHY.

  • set802154Phr: Uses different parameters between FSK and OFDM frame, as described in Getting Started with Wi-SUN PHY. For OFDM PHY, set802154Phr should be set with the selected MCS and the new PhyModeID.

The following is an example for NA using configindex 0:

rx 0
setconfigindex 0
setchannel 0
rx 1
rx 0
setpowerconfig RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE 3600 10
setpower 160
setchannel 0
rx 1
rx 0
setchannel 0
rx 1
rx 0
setpowerconfig RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE 3600 10
setpower 160
setchannel 0
rx 1
setTxDelay 10
setTxLength 63
# CCA : enable CSMA-CA
setLbtMode csma
setLbtParams 0 0 1 -80 0 160 0

#to Tx FSK frames
rx 0
configTxOptions 0
rx 1
set802154Phr 1 0 1
tx 1

#to Tx OFDM frames using MCS4
rx 0
configTxOptions 512
rx 1
set802154Phr 2 4 0
tx 1

Notes:

  • this previous script also allows receiving either FSK or OFDM frames.

  • For FSK 2b ECHONET Profile, the set802154Phr parameters are as shown below:

    set802154Phr 1 1 1

A Complete Example#

This section provides a complete Tx and Rx example, along with illustrations of diagnostic signals.

A Complete Tx and Rx Example#

This complete example shows how to transmit FSK and OFDM modulated packets with the EFR32FG25 radio using the RAILtest application on the concurrent PHY.

> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:79293671}}
> setconfigindex 0
{{(setconfigindex)}{configIndex:0}{firstAvailableChannel:0}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:79693550}}
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:79824401}}
> setpowerconfig RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE 3600 10
{{(setpowerconfig)}{success:true}{mode:RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE }{modeIndex:0}{voltage:3600}{rampTime:7}}
> setpower 160
{{(setpower)}{powerLevel:255}{power:160}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:80369403}}
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:80503536}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:80764283}}
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:80901650}}
> setpowerconfig RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE 3600 10
{{(setpowerconfig)}{success:true}{mode:RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE }{modeIndex:2}{voltage:3600}{rampTime:7}}
> setpower 160
{{(setpower)}{powerLevel:255}{power:160}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:81440368}}
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:81440855}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:81442897}}
> status
{{(status)}{UserTxCount:0}{AckTxCount:0}{UserTxAborted:0}{AckTxAborted:0}{UserTxBlocked:0}{AckTxBlocked:0}{UserTxUnderflow:0}{AckTxUnderflow:0}{RxCount:0}{RxCrcErrDrop:0}{SyncDetect:0}{NoRxBuffer:0}{TxRemainErrs:0}{RfSensed:0}{ackTimeout:0}{ackTxFpSet:0}{ackTxFpFail:0}{ackTxFpAddrFail:0}{RfState:Rx}{RAIL_state_active:0}{RAIL_state_rx:1}{RAIL_state_tx:0}{Channel:0}{AppMode:None}{TimingLost:0}{TimingDetect:0}{FrameErrors:0}{RxFifoFull:0}{RxOverflow:0}{AddrFilt:0}{Aborted:0}{RxBeams:0}{DataRequests:0}{Calibrations:1}{TxChannelBusy:0}{TxClear:0}{TxCca:0}{TxRetry:0}{UserTxStarted:1}{PaProtect:0}{SubPhy0:0}{SubPhy1:0}{SubPhy2:0}{SubPhy3:0}{rxRawSourceBytes:0x000000000}}
> setTxDelay 10
{{(setTxDelay)}{txDelay:10}}
> setTxLength 63
{{(setTxLength)}{TxLength:63}{TxLength Written:63}}

# CCA : enable CSMA-CA
> setLbtMode csma
{{(setLbtMode)}{LbtMode:CSMA}}
> setLbtParams 0 0 1 -80 0 160 0
{{(setLbtParams)}{MinBo:0}{MaxBo:0}{Tries:1}{Threshold:-80}{Backoff:0}{Duration:160}{Timeout:0}}

# Tx FSK frame
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:82890344}}
> configTxOptions 0
{{(configTxOptions)}{waitForAck:False}{removeCrc:False}{syncWordId:0}{txAntenna:Any}{altPreambleLen:False}{ccaPeakRssi:False}{ccaOnly:False}{resend:False}{concurrentPhyId:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:83181435}}
> set802154Phr 1 0 1
{{(set802154Phr)}{PhrSize:2}{PHR:0x8210}}
{{(set802154Phr)}{len:63}{payload: 0x10 0x82 0x11 0x22 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e}}
> tx 1
{{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:83480564}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:83507884}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:83507848}{timePos:6}{lastTxStart:83484458}{ccaSuccess:1}{failed:0}{lastTxStatus:0x000000000}{txRemain:0}{isAck:False}}
> status
{{(status)}{UserTxCount:1}{AckTxCount:0}{UserTxAborted:0}{AckTxAborted:0}{UserTxBlocked:0}{AckTxBlocked:0}{UserTxUnderflow:0}{AckTxUnderflow:0}{RxCount:0}{RxCrcErrDrop:0}{SyncDetect:0}{NoRxBuffer:0}{TxRemainErrs:0}{RfSensed:0}{ackTimeout:0}{ackTxFpSet:0}{ackTxFpFail:0}{ackTxFpAddrFail:0}{RfState:Rx}{RAIL_state_active:0}{RAIL_state_rx:1}{RAIL_state_tx:0}{Channel:0}{AppMode:None}{TimingLost:0}{TimingDetect:0}{FrameErrors:0}{RxFifoFull:0}{RxOverflow:0}{AddrFilt:0}{Aborted:0}{RxBeams:0}{DataRequests:0}{Calibrations:1}{TxChannelBusy:0}{TxClear:1}{TxCca:1}{TxRetry:0}{UserTxStarted:2}{PaProtect:0}{SubPhy0:0}{SubPhy1:0}{SubPhy2:0}{SubPhy3:0}{rxRawSourceBytes:0x000000000}}

# Tx OFDM frame using MCS4
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:83933827}}
> configTxOptions 512
{{(configTxOptions)}{waitForAck:False}{removeCrc:False}{syncWordId:0}{txAntenna:Any}{altPreambleLen:False}{ccaPeakRssi:False}{ccaOnly:False}{resend:False}{concurrentPhyId:1}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:84214833}}
> set802154Phr 2 4 0
{{(set802154Phr)}{PhrSize:4}{PHR:0x1b80400}}
{{(set802154Phr)}{len:63}{payload: 0x00 0x04 0xb8 0x01 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e}}
> tx 1
{{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:84518189}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:84523714}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:84523676}{timePos:6}{lastTxStart:84522105}{ccaSuccess:1}{failed:0}{lastTxStatus:0x000000000}{txRemain:0}{isAck:False}}
> status
{{(status)}{UserTxCount:2}{AckTxCount:0}{UserTxAborted:0}{AckTxAborted:0}{UserTxBlocked:0}{AckTxBlocked:0}{UserTxUnderflow:0}{AckTxUnderflow:0}{RxCount:0}{RxCrcErrDrop:0}{SyncDetect:0}{NoRxBuffer:0}{TxRemainErrs:0}{RfSensed:0}{ackTimeout:0}{ackTxFpSet:0}{ackTxFpFail:0}{ackTxFpAddrFail:0}{RfState:Rx}{RAIL_state_active:0}{RAIL_state_rx:1}{RAIL_state_tx:0}{Channel:0}{AppMode:None}{TimingLost:0}{TimingDetect:0}{FrameErrors:0}{RxFifoFull:0}{RxOverflow:0}{AddrFilt:0}{Aborted:0}{RxBeams:0}{DataRequests:0}{Calibrations:1}{TxChannelBusy:0}{TxClear:2}{TxCca:2}{TxRetry:0}{UserTxStarted:4}{PaProtect:0}{SubPhy0:0}{SubPhy1:0}{SubPhy2:0}{SubPhy3:0}{rxRawSourceBytes:0x000000000}}

The following example displays the reception of previous Tx FSK and OFDM modulated packets with the EFR32FG25 radio using the RAILtest application on the concurrent PHY:

> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:82699471}}
> setconfigindex 0
{{(setconfigindex)}{configIndex:0}{firstAvailableChannel:0}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:83088638}}

# FSK and OFDM PA configuration + Calibration
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:83346793}}
> setpowerconfig RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE 3600 10
{{(setpowerconfig)}{sucess:true}{mode:RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE}{modeIndex:0} {voltage:3600} {rampTime:7}}
> setpower 160
{{(setpower)}{powerLevel:255}{power:160}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:83892640}}
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:84020488}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:84278019}}
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:84408265}}
> setpowerconfig RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE 3600 10
{{(setpowerconfig)}{success:true}{mode:RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE} {modeIndex:2}{voltage:3600}{rampTime:7}}
> setpower 160
{{(setpower)}{powerLevel:255}{power:160}}
> setchannel 0
{{(setchannel)}{channel:0}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:84929530}}

> status
{{(status)}{UserTxCount:0}{AckTxCount:0}{UserTxAborted:0}{AckTxAborted:0}{UserTxBlocked:0}{AckTxBlocked:0}{UserTxUnderflow:0}{AckTxUnderflow:0}{RxCount:0}{RxCrcErrDrop:0}{SyncDetect:0}{NoRxBuffer:0}{TxRemainErrs:0}{RfSensed:0}{ackTimeout:0}{ackTxFpSet:0}{ackTxFpFail:0}{ackTxFpAddrFail:0}{RfState:Rx}{RAIL_state_active:0}{RAIL_state_rx:1}{RAIL_state_tx:0}{Channel:0}{AppMode:None}{TimingLost:0}{TimingDetect:0}{FrameErrors:0}{RxFifoFull:0}{RxOverflow:0}{AddrFilt:0}{Aborted:0}{RxBeams:0}{DataRequests:0}{Calibrations:1}{TxChannelBusy:0}{TxClear:0}{TxCca:0}{TxRetry:0}{UserTxStarted:1}{PaProtect:0}{SubPhy0:0}{SubPhy1:0}{SubPhy2:0}{SubPhy3:0}{rxRawSourceBytes:0x000000000}}

# **Rx event of one FSK frame** (with incorrect RSSI level see known issues)
{{(**rxPacket**)}{len:63}{timeUs:110705035}{timePos:5}{crc:Pass}{filterMask:0x0}{rssi:-86}{lqi:255}{phy:0}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:254}{channel:0}{payload: 0x10 0x82 0x11 0x22 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e}}

# **Rx event of one OFDM frame**
{{(**rxPacket**)}{len:59}{timeUs:111720745}{timePos:5}{crc:Pass}{filterMask:0x0}{rssi:-47}{lqi:235}{phy:4}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:254}{channel:0}{payload: 0x03 0x04 0xb8 0x01 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a }}
> status
{{(status)}{UserTxCount:0}{AckTxCount:0}{UserTxAborted:0}{AckTxAborted:0}{UserTxBlocked:0}{AckTxBlocked:0}{UserTxUnderflow:0}{AckTxUnderflow:0}{RxCount:2}{RxCrcErrDrop:0}{SyncDetect:2}{NoRxBuffer:0}{TxRemainErrs:0}{RfSensed:0}{ackTimeout:0}{ackTxFpSet:0}{ackTxFpFail:0}{ackTxFpAddrFail:0}{RfState:Rx}{RAIL_state_active:0}{RAIL_state_rx:1}{RAIL_state_tx:0}{Channel:0}{AppMode:None}{TimingLost:0}{TimingDetect:0}{FrameErrors:0}{RxFifoFull:0}{RxOverflow:0}{AddrFilt:0}{Aborted:0}{RxBeams:0}{DataRequests:0}{Calibrations:1}{TxChannelBusy:0}{TxClear:0}{TxCca:0}{TxRetry:0}{UserTxStarted:1}{PaProtect:0}{SubPhy0:1}{SubPhy1:0}{SubPhy2:0}{SubPhy3:0}{rxRawSourceBytes:0x000000000}}

Diagnostic Signals#

With concurrent PHY, both stream mode (PN9) and CW signal generation are supported. The selection between FSK or OFDM Tx path is done using configTxOptions with value 0 for FSK and 512 for OFDM.

As an example, the following CLI commands configure and enable the PN9 stream transmission mode on the radio using the Base FSK PHY using configindex 0.

> setconfigindex 0
> rx 0
> setpowerconfig RAIL_TX_POWER_MODE_SUBGIG_PA_POWERSETTING_TABLE 3600 10
> setpower 140
> rx 1
> configTxOptions 0
> set802154Phr 1 0 1
> setTxStream 1

Note with the FSK, the setTxStream is not running correctly so it is recommended to use the FSK PHY without the concurrent mode using OFDM (see the known issues in section 4).

For OFDM path, PN9 stream mode also requires setting up PHR (with the set802154PHR command) to select MCS Level. Before this it is also mandatory to configure the frame length field to 4 before the transmission, to set up the infinite stream needed for PN9.

As an example, the following CLI commands configure and enable the PN9 stream transmission mode on the radio in OFDM option 1 MCS4 at configindex 1.

> setconfigindex 1
> rx 0
> setpowerconfig RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE 3600 10
> setpower 140
> rx 1
> configTxOptions 512
> setTxLength 4
> set802154Phr 2 4 0
> setTxStream 1

Example:

> setconfigindex 1
{{(setconfigindex)}{configIndex:1}{firstAvailableChannel:0}}
> setpowerconfig RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE 3600 10
{{(setpowerconfig)}{success:true}{mode:RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE }{modeIndex:2}{voltage:3600}{rampTime:7}}
> setpower 140
{{(setpower)}{powerLevel:255}{power:140}}
> configTxOptions 512
{{(configTxOptions)}{waitForAck:False}{removeCrc:False}{syncWordId:0}{txAntenna:Any}
{altPreambleLen:False}{ccaPeakRssi:False}{ccaOnly:False}{resend:False}{concurrentPhyId:1}}
> setTxLength 4
{{(setTxLength)}{TxLength:4}{TxLength Written:4}}
> set802154Phr 2 4 0
{{(set802154Phr)}{PhrSize:4}{PHR:0x400}}
{{(set802154Phr)}{len:4}{payload: 0x00 0x04 0x00 0x00}}
> setTxStream 1
{{(setTxStream)}{Stream:Enabled}{None:Disabled}{StreamMode:PN9}{Time:1737513509}}

To send a tone at the carrier frequency, the following CLI command can be used:

> setTxTone 1

Examples:

# To Start the tone
> setTxTone 1
{{(setTxTone)}{Stream:Enabled}{None:Disabled}{StreamMode:Tone}{Time:1293513244}}
# To Stop the tone
> setTxTone 0
{{(setTxTone)}{None:Enabled}{Stream:Disabled}{Time:1298384979}}

It is equivalent to:

> setTxStream 1 0