nRF21540 FEM Not Improving Range in ESB Project (NCS 2.9 / 3.0.1)

We are currently working on a project based on Enhanced ShockBurst (ESB) and would like to use Front-End Module (FEM) support with the nRF21540.

In your Enhanced ShockBurst samples, you mention that there is support for the nRF21540 FEM. The Enhanced ShockBurst (ESB) documentation states:
“ESB requires the MPSL library for front-end module support. This library is always linked into the build, however, it is not initialized by default to provide your application and the ESB protocol with access to all hardware resources. See MPSL FEM-only configuration for more details.”

We have been testing the esb_ptx and esb_prx examples for a week now. We're evaluating the range of different setups using the nRF52840, the nRF21540-DK, and the nRF52840 with the nRF21540-EK.
We made a small modification to the esb_prx source code to read and log the RSSI value directly when a packet is received.

We are following the instructions provided in the Enhanced ShockBurst documentation. During build time, we can see confirmation that the FEM configuration is recognized. For example:

  • With the nRF21540-DK: -- Board: nrf21540dk, qualifiers: nrf52840

  • With the nRF52840 + nRF21540-EK: -- Shield(s): nrf21540ek

However, we are not observing any improvement in range when using the nRF21540, neither in transmission nor reception. In your blog and documentation, you mention that the FEM can significantly extend the range, even up to 8x.

We’ve reviewed various blogs and Q&A threads, but due to many recent changes in the SDK, we’ve lost track of the correct procedure. Most resources are based on older SDK versions and no longer apply.

We have a few specific questions:

Q1: We are only using ESB (not Bluetooth). Do we need to explicitly initialize MPSL in our code to enable FEM functionality?

Q2: Should I see additional log output at startup when MPSL is active? Right now, this is all we see:

*** Booting nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
[00:00:00.259,063] <inf> esb_prx: Enhanced ShockBurst prx sample
[00:00:00.266,052] <dbg> esb_prx: clocks_start: HF clock started
[00:00:00.272,857] <inf> esb_prx: Initialization complete
[00:00:00.278,930] <inf> esb_prx: Setting up for packet reception
[00:06:10.058,044] <dbg> esb_prx: event_handler: Packet received, 0xde, RSSI: 79 dBm
[00:06:14.964,416] <dbg> esb_prx: event_handler: Packet received, 0x0f, RSSI: 79 dBm
[00:06:15.164,001] <dbg> esb_prx: event_handler: Packet received, 0x11, RSSI: 78 dBm

Q3: How can we properly increase the TX output power? We’ve come across many examples, but are unsure which ones are correct for SDK v2.9 / 3.0.1.

Q4: How can we improve reception quality? Ideally, we want to use the nRF52840 + nRF21540-EK with an external antenna. Do we need to manually activate the LNA for this?

Q5: It would be very helpful if the ESB documentation or samples included more detailed instructions about FEM configuration, especially regarding what is required vs optional. A lot has changed in the SDK over the past years, and many online examples no longer work with SDK v2.9 / 3.0.1.

  • Hello,

    I am trying to answer your questions here. I am sorry for the late reply as we had easter vacation on last week.

    ''Q1: We are only using ESB (not Bluetooth). Do we need to explicitly initialize MPSL in our code to enable FEM functionality?''

    If you want to explicitly set MPSL then you need to set CONFIG_MPSL_FEM=y in the prj.conf file.

    Q2: Should I see additional log output at startup when MPSL is active? Right now, this is all we see:''

    Log does not show any indication of FEM activity.

    Q3: How can we properly increase the TX output power? We’ve come across many examples, but are unsure which ones are correct for SDK v2.9.

    You may need to enable runtime PA gain control for controlling TX power with the nRF21540 FEM.

    CONFIG_MPSL_FEM_NRF21540_RUNTIME_PA_GAIN_CONTROL=y
    Q4: How can we improve reception quality? Ideally, we want to use the nRF52840 + nRF21540-EK with an external antenna. Do we need to manually activate the LNA for this?
    You can go through this
    Q5: It would be very helpful if the ESB documentation or samples included more detailed instructions about FEM configuration, especially regarding what is required vs optional. A lot has changed in the SDK over the past years, and many online examples no longer work with SDK v2.9.
    I do agree with you. I will talk about this to the respective team.
    Thanks.
     
    BR
    Kazi

  • Hi Kazi,

    Thank you for your response, and no worries about the delay – I understand the Easter break may have caused that.

    Regarding your suggestions: I’ve already gone through all of the steps you mentioned, and I’ve been testing them extensively over the past few weeks. I have several Nordic boards here, including the nRF52840-DK, nRF5340-DK, and the nRF21540-DK kit. I've been struggling for quite some time to get FEM support working reliably with the ESB sample. At this point, I could probably recite most of the documentation by heart, including the link you provided.

    Unfortunately, despite all of that, I still don’t see any improvement in either transmit or receive range when using the nRF21540. To me, the FEM support still feels very opaque. Besides the build-time confirmation (which I already mentioned), there's no clear indication that the FEM is actually doing anything. It would be incredibly helpful if there were some visual confirmation – such as a log message or LED – that shows the FEM is active, but even with full debugging enabled, I get no feedback.

    My primary goal is to improve reception range, as I plan to integrate the nRF21540 FEM into a gateway device, while keeping the client devices battery-friendly by using a standard nRF52840 or nRF5340. However, right now it feels like the nRF21540 FEM (either with the nRF21540-DK or the nRF21540-EK) is doing absolutely nothing in ESB mode with NCS 2.9 – unless I’m missing something crucial?

    It really shouldn’t require rocket science to get improved signal strength out of the ESB sample using the nRF21540. Once I can get it working there, I plan to integrate it into our own software solution that we’re developing.

    Would it be possible for Nordic to run a few internal tests using some typical setups? For example:

    • PTX: nRF52840, PRX: nRF52840 + nRF21540-EK

    • PTX: nRF21540-DK, PRX: nRF52840 + nRF21540-EK

    If these setups work as expected on your side, maybe you could share your modified sample so I can test the same setup locally. That would be very helpful.

    Also, if you are planning to run internal tests anyway, I would strongly recommend using nRF Connect SDK v3.0.0 instead of 2.9. I've been testing on 2.9 myself, but if there’s going to be an updated blog or sample, it makes more sense to use the latest version so it remains future-proof for others.

    Thanks again in advance,
    H. Dekker

  • Hello,

    Enabling any FEM into the build by itself will not automagically cause that the greater output power is used. This is true for all protocols. If the protocol requested for example 0 dBm then with FEM it will be still 0dBm but achieved in a different way. The protocol driver needs to ask for more power.

  • Dear Kazi,

    I understand that if I don’t configure additional TX power, I shouldn’t expect significantly better performance.

    I’m not new to Nordic Semiconductor products. I’ve been working with them daily for over a year now. We've already built several interesting projects and even developed our own custom boards, so I believe I have a solid understanding of how things work.

    The only area I’m really struggling with is FEM support. I’ve tested everything again using the ESB samples with Nordic Connect SDK 3.0.1 (we’ve migrated all our internal projects to the latest SDK). However, I just can’t get it to work properly.

    As soon as I enable MPSL in my project (as described in the documentation, including your note about CONFIG_MPSL_FEM_NRF21540_RUNTIME_PA_GAIN_CONTROL=y) and correctly set the board target to something like the nRF52840 + nRF21540-EK (via the CMake flag -DSHIELD=nrf21540ek), the transmission range drops significantly. I’ve also tried adjusting the TX power settings, but the range remains very poor. I tested with the nRF21540-DK as well and encountered exactly the same problem.

    When I build the ESB-PTX sample with the default settings for the nRF52840-DK (without FEM), the transmission range is noticeably better.

    I should also mention that the documentation for FEM support in the ESB sample isn’t entirely accurate. If you're using a standard nRF21540 or any nRF device with the nRF21540-EK front-end module, there’s no need to manually create an overlay file—this is handled automatically unless you're using a custom board. The current documentation is a bit confusing in that regard. Additionally, there's no clear guidance on what project or code settings are required to actually enable FEM support and benefit from the increased TX and RX range.

    I’m seriously starting to doubt whether FEM support is working properly with the ESB protocol. Could you please test this yourself using the standard ESB sample, a nRF21540-DK, and an nRF device with the nRF21540-EK? I’d be very interested to hear whether it works correctly on your side.

    It’s possible I’m overlooking something small, but I’ve read nearly every Q&A thread on DevZone related to FEM support and ESB. If you do manage to get it working, could you please share your (modified) ESB sample with me and others on DevZone? Also, please consider updating the documentation to make this process clearer for everyone else. The many changes to the SDK over the past two years haven’t made things easier—especially when trying to follow older DevZone threads.

    I really hope this issue will now be taken more seriously and addressed more quickly. It’s been almost two months, and I still haven’t received a solid answer.

    Thanks in advance for your feedback and example.

  • Hello,

    I have feedback from team 

    Answering the questions:

    Q1: No, the FEM module in MPSL can work without the MPSL scheduler and this is how it is used in the ESB, so no separate initialization is required in the application code.

    Q2: This relates to Q1 a bit. Since no MPSL scheduler is started, there will be no specific log from MPSL if only the FEM module is used

    Q3: It should be done through the esb_set_tx_power() function: https://docs.nordicsemi.com/bundle/nrf-apis-latest/page/group_esb_ga63a3c3e672521b5d7646f45331395e95.html#ga63a3c3e672521b5d7646f45331395e95

    Q4: The FEM driver integrated sets up the LNA automatically. You just need to build the application with the nRF21540 EK as described in https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/app_dev/device_guides/fem/21540ek_dev_guide.html.

    Q5: FEM are supported in ESB through the integration with the FEM driver in MPSL however without running the MPSL scheduler. We don't have a dedicated sample to show such  setup. In theory the existing samples, when built for a configuration with FEM e.g. on nRF52840 DK + nRF21540 EK should work out of the box.

Related