This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Windows 10 throughput / connection window clashes

I'm facing a problem with a product I'm developing. The problematic setup is as follows:

  • Two nRF52832 peripherals (S132 v6.0.0), each notifying on two characteristics in two separate services (~100 Hz).
  • A Windows 10 central using native C++ SDK bindings to discover and connect to the peripherals.
  • The connection interval is configured to min 7ms and max 15ms on the peripheral. I can monitor that the negotiated interval is 15ms.
  • GATT MTU: 64 bytes
  • GAP data length: 27 bytes (just tried updating to 64 to match the MTU but that didn't change anything).

The problem is that I can connect one peripheral and receive notifications at the correct rate. As soon as I connect another peripheral, the first one starts failing to send notifications (sd_ble_gatts_hvx returns with NRF_ERROR_RESOURCES due to too many notifications queued). This happens even when the other peripheral is not sending anything, just connected to the central. The newly connected peripheral has no problem with sending notifications at a correct rate.

We don't observe this problem on other platforms (tested on macOS and Android), so I don't think it's an OTA throughput issue. Could it have something to do with how the Windows central spaces out the connection intervals/windows? Can the newly connected peripheral just be "stealing" the windows from the other peripheral? Is there something we can do on the peripheral side to prevent this from happening?

And just to make it extra special, on some rare occasions it just seems to work fine. Maybe once in every 100 connection attempts or so.

Open to any and all ideas...

  • Duly noted!

    One other thing I'm wondering if it might have some say in this matter is the GAP data length parameter. When connecting to my peripheral on macOS, the rx/tx octets are updated according to what I set `NRF_SDH_BLE_GAP_DATA_LENGTH` to (64). But when connecting to the Windows side, it just stays at 27. Could this have some significance?

  • Absolutely, I would take this as supporting the hypothesis that the firmware patches are different for the mac OS vs the windows PC.
    As a final test  you can setup a sniffer and capture the traces from the Windows and the mac OS. Look for the VERSION_IND packet from the CSR, this will also have an identifier for the firmware levels. The caveat is that the CSR firmware may not send the VERSION_IND but its worth a try as well. However do look at the hypotheses i have stated earlier as well.

    Please give my answer an upvote if this has been helpful.

Related