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...