HI,
I am using the nRF54L15 + nRF21540 with SDK v3.2.1, and performing custom development based on the periodic_adv_conn sample.
issue Description
During runtime, I found that the TX_EN pin (nRF54L14 controlling nRF21540) is stuck HIGH at all times with no toggling, while the RX_EN and PDN pins toggle normally between high and low.
Troubleshooting Attempts
- Flashed the code to the nRF54L15 PDK — TX_EN remains constantly HIGH after power-on.
- Moved the identical FEM configuration into the DTM sample — TX_EN works normally after flashing DTM firmware.
What is causing this issue?
I have added the FEM configuration in the devicetree overlay file.
Overlay Configuration
&dppic10 {
status = "okay";
};
&dppic20 {
status = "okay";
};
&dppic30 {
status = "okay";
};
&ppib11 {
status = "okay";
};
&ppib21 {
status = "okay";
};
&ppib22 {
status = "okay";
};
&ppib30 {
status = "okay";
};
/ {
nrf_radio_fem: nrf21540_fem{
compatible="nordic,nrf21540-fem";
tx-en-gpios=<&gpio1 9 GPIO_ACTIVE_HIGH>;
rx-en-gpios=<&gpio1 11 GPIO_ACTIVE_HIGH>;
mode-gpios=<&gpio1 12 GPIO_ACTIVE_HIGH>;
ant-sel-gpios=<&gpio1 10 GPIO_ACTIVE_HIGH>;
pdn-gpios=<&gpio1 8 GPIO_ACTIVE_HIGH>;
supply-voltage-mv=<3000>;
trx-hold-time-us = <5>;
pdn-settle-time-us = <18>;
rx-en-settle-time-us = <12>;
tx-en-settle-time-us = <27>;
};
leds {
runled: runled {
gpios = <&gpio1 3 0>;
label = "Run_LED";
};
testpin: testpin {
gpios = <&gpio1 2 0>;
label = "Test_LED";
};
testpin2: testpin2 {
gpios = <&gpio0 4 0>;
label = "Test2_LED";
};
};
chosen {
zephyr,bt-c2h-uart = &uart30;
zephyr,bt-mon-uart = &uart30;
zephyr,console = &uart30;
zephyr,shell-uart = &uart30;
zephyr,uart-mcumgr = &uart30;
};
};
&uicr {
nfct-pins-as-gpios;
};
&radio {
status = "okay";
fem=<&nrf_radio_fem>;
};
prj.conf
CONFIG_BT=y
CONFIG_BT_BROADCASTER=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_PER_ADV=y
CONFIG_BT_DEVICE_NAME="CowEarTag"
CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER=y
CONFIG_BT_PER_ADV_RSP=y
CONFIG_BT_MAX_CONN=1
CONFIG_BT_CENTRAL=y
CONFIG_BT_PRIVACY=y
CONFIG_BT_SMP=y
#long range
CONFIG_BT_CTLR_PHY_CODED=y
CONFIG_BT_CTLR_ADV_EXT=y
# CONFIG_BT_USER_PHY_UPDATE=y
CONFIG_BT_EXT_ADV_CODING_SELECTION=y
CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=255
CONFIG_BT_CTLR_SDC_PERIODIC_ADV_RSP_TX_MAX_DATA_SIZE=249
CONFIG_LOG=y
CONFIG_SERIAL=y
CONFIG_UART_ASYNC_API=y
CONFIG_FLASH=y
CONFIG_FLASH_JESD216_API=y
CONFIG_EVENTS=y
#reboot
CONFIG_REBOOT=y
#watchdog
CONFIG_WATCHDOG=y
CONFIG_WDT_LOG_LEVEL_DBG=y
#spsc
CONFIG_SPSC_PBUF=y
#fem
CONFIG_MPSL_FEM_NRF21540_TX_GAIN_DB=20
CONFIG_MPSL_FEM_NRF21540_RUNTIME_PA_GAIN_CONTROL=y
CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
# CONFIG_NRFX_TIMER=y
# CONFIG_NRFX_GPPI=y
# CONFIG_CLOCK_CONTROL=y
# CONFIG_FEM_AL_LIB=y
Generated .config (MPSL Section)
#
# Multiprotocol service layer (MPSL)
#
# CONFIG_MPSL_FEM_ONLY is not set
CONFIG_MPSL_FEM_ANY_SUPPORT=y
CONFIG_MPSL_FEM_NRF21540_GPIO_SUPPORT=y
CONFIG_MPSL_FEM_NCS_SUPPORTED_FEM_USED=y
CONFIG_MPSL_FEM_API_AVAILABLE=y
CONFIG_MPSL_FEM=y
CONFIG_MPSL_FEM_NRF21540_GPIO=y
CONFIG_MPSL_FEM_NRF21540_TX_GAIN_DB=20
CONFIG_MPSL_FEM_NRF21540_TX_GAIN_DB_POUTA=20
CONFIG_MPSL_FEM_NRF21540_TX_GAIN_DB_POUTB=10
CONFIG_MPSL_FEM_NRF21540_RX_GAIN_DB=13
CONFIG_MPSL_FEM_NRF21540_RUNTIME_PA_GAIN_CONTROL=y
# CONFIG_MPSL_FEM_POWER_MODEL is not set
CONFIG_MPSL_FEM_DEVICE_CONFIG_254=y
CONFIG_MPSL_FEM_INIT_PRIORITY=50
# CONFIG_MPSL_FEM_LOG_LEVEL_OFF is not set
# CONFIG_MPSL_FEM_LOG_LEVEL_ERR is not set
# CONFIG_MPSL_FEM_LOG_LEVEL_WRN is not set
# CONFIG_MPSL_FEM_LOG_LEVEL_INF is not set
# CONFIG_MPSL_FEM_LOG_LEVEL_DBG is not set
CONFIG_MPSL_FEM_LOG_LEVEL_DEFAULT=y
CONFIG_MPSL_FEM_LOG_LEVEL=3
CONFIG_MPSL_THREAD_COOP_PRIO=6
CONFIG_MPSL_TIMESLOT_SESSION_COUNT=0
# CONFIG_MPSL_ASSERT_HANDLER is not set
CONFIG_MPSL_LOW_PRIO_IRQN=28
CONFIG_MPSL_HFCLK_LATENCY=1650
CONFIG_MPSL_CALIBRATION_PERIOD=60000
CONFIG_MPSL_INIT_PRIORITY=40
# CONFIG_MPSL_LOG_LEVEL_OFF is not set
# CONFIG_MPSL_LOG_LEVEL_ERR is not set
# CONFIG_MPSL_LOG_LEVEL_WRN is not set
# CONFIG_MPSL_LOG_LEVEL_INF is not set
# CONFIG_MPSL_LOG_LEVEL_DBG is not set
CONFIG_MPSL_LOG_LEVEL_DEFAULT=y
CONFIG_MPSL_LOG_LEVEL=3
# CONFIG_MPSL_PIN_DEBUG is not set
# CONFIG_MPSL_USE_EXTERNAL_CLOCK_CONTROL is not set
# end of Multiprotocol service layer (MPSL)