How to reach maximum BLE throughput at 2M PHY with nRF5340DK (peripheral) and nRF52 Dongle (central)?

Hi everyone,

I'm developing a BLE application where I measure throughput between an nRF5340DK acting as peripheral and an nRF52 Dongle as the central (using a Python script with Blatann on PC), and I’m trying to understand how to maximize the notification bandwidth under optimal conditions.

The setup now is:

  • Peripheral: nRF5340DK (Zephyr SDK v2.7.0)
  • Central: nRF52 Dongle + PC (Blatann as central manager)
  • Connection interval: 7.5 ms
  • PHY: Trying to enable 2M PHY using bt_conn_le_phy_update()
  • MTU: 247 bytes
  • Total characteristics used: 1 (for notify)

I observed that the maximum measured throughput is ~54 kbps, this is much lower than expected for 2M PHY and these parameters. At 2M PHY, with a 7.5 ms connection interval and a max payload of 244 bytes per notification the theoretical max throughput is 156 kbps, even  with overhead and ACKs, 90–130 kbps should be possible under ideal conditions.

Why am I stuck at ~54 kbps? Could the nRF52 Dongle (central using Blatann) be the bottleneck?

What’s the best way to confirm that 2M PHY is active on both devices (Zephyr side and dongle)?

Is it better to use multiple characteristics to increase throughput?

Any known limitations in the SoftDevice controller on the nRF52840 Dongle that might prevent higher notification rate?

Any tips on how to optimize scheduling of notifications in Zephyr to avoid gaps between notifications?

I'd like to get as close as possible to the real throughput ceiling using Zephyr on the nRF5340 and a BLE central based on the nRF52 dongle. Open to suggestions—should I switch to a different central? Or buffer/send differently?

Thanks for the support! I’ll gladly share code or measurement setup if helpful.

Eva

Related