IEEE 802.15.4 Raw Mode + SKY66112 FEM not working in NCS 3.1.1 (worked in NCS 2.4)

Summary

I'm experiencing a regression where my SKY66112-11 FEM (on a Fanstel BT840X module) no longer activates when using IEEE 802.15.4 in raw mode with NCS 3.1.1. The same configuration worked correctly with NCS 2.4.x.

Hardware

  • Module: Fanstel BT840X (nRF52840 + SKY66112-11 FEM)
  • FEM Pins:
    • CTX (PA enable): P0.17
    • CRX (LNA enable): P0.19
    • CPS (Bypass): P0.06 (active low - LOW = FEM active)
    • CHL (Power mode): P0.08 (HIGH = max power)

Software

  • NCS Version: v3.1.1 (broken)
  • Previously working: NCS v2.4.x
  • Application: Custom wpanusb firmware (IEEE 802.15.4 raw mode over USB)

Symptoms

  • With CONFIG_MPSL_FEM=n: Radio works, weak signal (~-48dBm at 50cm) => expected without FEM
  • With CONFIG_MPSL_FEM=y: Radio works but signal remains weak (~-48 to -50dBm) => FEM not activating
  • Manual GPIO test (forcing CTX high, CPS low, CHL high in board.c with FEM disabled): ~-23dBm => confirms FEM hardware works

Configuration

Devicetree (myboard_bt840x_nrf52840.dts)

/ {
nrf_radio_fem: fem {
status = "okay";
compatible = "skyworks,sky66112-11", "generic-fem-two-ctrl-pins";
ctx-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
ctx-settle-time-us = <4>;
tx-gain-db = <22>;
crx-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>;
crx-settle-time-us = <4>;
rx-gain-db = <11>;
};
};


&radio {
fem = <&nrf_radio_fem>;
status = "okay";
};

Defconfig (myboard_bt840x_nrf52840_defconfig)

CONFIG_ARM_MPU=y
CONFIG_HW_STACK_PROTECTION=y
CONFIG_USE_SEGGER_RTT=n
CONFIG_GPIO=y
CONFIG_SERIAL=n
CONFIG_USB_MAX_POWER=250
CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y
CONFIG_MPSL=y
CONFIG_MPSL_FEM=y
CONFIG_PINCTRL=y

prj.conf

CONFIG_BOOTLOADER_MCUBOOT=n
CONFIG_TEST_RANDOM_GENERATOR=n

CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PID=0x000D
CONFIG_USB_MAX_NUM_TRANSFERS=4
CONFIG_USB_REQUEST_BUFFER_SIZE=4096
CONFIG_USB_DEVICE_MANUFACTURER="manufacturer"
CONFIG_USB_DEVICE_PRODUCT="BOARD-WPANUSB"
CONFIG_USB_DEVICE_SN="4D4F4E43554C"

CONFIG_NETWORKING=y
CONFIG_NET_CONFIG_SETTINGS=y
CONFIG_NET_CONFIG_AUTO_INIT=n
CONFIG_NET_BUF_DATA_SIZE=128
CONFIG_IEEE802154=y
CONFIG_IEEE802154_RAW_MODE=y
CONFIG_NET_CONFIG_IEEE802154_RADIO_TX_POWER=18

CONFIG_LOG=n
CONFIG_NET_LOG=n

 

board.c (CPS/CHL static control)

#include <zephyr/init.h>
#include <zephyr/drivers/gpio.h>

#define CPS_PIN 6 /* P0.06, FEM bypass (LOW = FEM active) */
#define CHL_PIN 8 /* P0.08, FEM power (HIGH = max power) */

static int myboard_fem_init(void)
{
const struct device *gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpio0));

if (!device_is_ready(gpio_dev)) {
return -ENODEV;
}

gpio_pin_configure(gpio_dev, CPS_PIN, GPIO_OUTPUT);
gpio_pin_set(gpio_dev, CPS_PIN, 0); /* FEM active */

gpio_pin_configure(gpio_dev, CHL_PIN, GPIO_OUTPUT);
gpio_pin_set(gpio_dev, CHL_PIN, 1); /* Max power mode */

return 0;
}

SYS_INIT(myboard_fem_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);

 

Relevant .config values (from build)

CONFIG_DT_HAS_GENERIC_FEM_TWO_CTRL_PINS_ENABLED=y
CONFIG_MPSL_FEM_ANY_SUPPORT=y
CONFIG_MPSL_FEM_GENERIC_TWO_CTRL_PINS_SUPPORT=y
CONFIG_MPSL_FEM_NCS_SUPPORTED_FEM_USED=y
CONFIG_MPSL_FEM_API_AVAILABLE=y
CONFIG_MPSL_FEM=y
CONFIG_MPSL_FEM_SIMPLE_GPIO=y
CONFIG_MPSL_FEM_DEVICE_CONFIG_254=y
CONFIG_MPSL_FEM_INIT_PRIORITY=50
CONFIG_MPSL_FEM_PIN_FORWARDER=n
CONFIG_NRF_802154_RADIO_DRIVER=y
CONFIG_NRF_802154_MULTIPROTOCOL_SUPPORT=y
CONFIG_NRF_802154_SL_OPENSOURCE=n
CONFIG_NRF_802154_SOURCE_NRFXLIB=y
CONFIG_NRF_802154_SL=y

What I've tried

  • Various compatible strings ("skyworks,sky66112-11", "generic-fem-two-ctrl-pins", both)
  • Different settle times (4µs, 23µs default, removing custom values)
  • CONFIG_MPSL_FEM_SIMPLE_GPIO=y explicitly
  • CONFIG_NRF_802154_SL_OPENSOURCE=y and =n
  • CONFIG_MPSL_FEM_PIN_FORWARDER=y (doesn't apply to nRF52840)
  • Different SYS_INIT priorities for board.c (PRE_KERNEL_1, POST_KERNEL, APPLICATION)
  • Direct nrf_gpio HAL calls instead of Zephyr GPIO driver
  • Verified FEM hardware works with manual GPIO control (CTX forced high = ~-23dBm)

Expected behavior

I should get ~-17-21dBm output power at close range depending on the power configuration (18 or 22dBm).

Actual behavior

Output power stays at ~-48dBm (same as FEM disabled).

Questions

  1. Is IEEE 802.15.4 raw mode + Simple GPIO FEM (SKY66112) supported in NCS 3.x?
  2. Was there a breaking change in the MPSL/802.15.4 FEM integration between NCS 2.4 and 3.x?
  3. Is there additional configuration required for FEM with 802.15.4 raw mode in NCS 3.1.1?

Thank you for any assistance.
Parents
  • Hi Carton,

    1. I do not see anywhere that IEEE 802.15.4 raw mode + Simple GPIO FEM as supported. FEM auto-control via MPSL is only listed for Thread, Zigbee, BLE controller, and multiprotocol. For other radio protocol implementations and applications that control the radio directly, you must use the MPSL FEM API yourself (which you most likely already know). See enabling fem support

    2. I do not see any documented breaking change in sources or readme files. But I doubt that we could have missed to document any breaking changes of an important module of MPSL, so my best educated guess is that there are no breaking changes.

    3. Additional configuration for raw mode: beyond CONFIG_MPSL, CONFIG_MPSL_FEM, and the FEM devicetree node you must integrate FEM control via the MPSL FEM API in your app/driver, because raw mode is direct radio control.
  • Thank you for your answer.

    I was asking because this is a setup that worked perfectly with NCS 2.4.x. At no point did I have the feeling that it was not supposed to work.

    As I do not have much time for this topic right now, I will stay with NCS 2.4.x. I was hoping for an easy and straightforward upgrade.

    I will inform the forum if I find a workaround to make my FEM work with raw 802.15.4 if I can find more time to work on it in the future.

  • That will be nice if you can come back with your finding or more questions here Carton, thanks for caring for the forum.

Reply Children
No Data
Related