Part Number:CC2540
I'm working on an existing product that transmits roughly 1500 bytes/sec over BLE to an iOS device (iOS 11). We recently added a new sensor which bumps the throughput requirement up to ~2000 bytes/sec. With the increased throughput, I've started getting blePending (0x16) errors from GATT_Notification(). The Bluetooth sniffer reveals that I'm only sending three 20-byte packets per connection interval (30mS connection interval, slave latency = 0).
In troubleshooting this issue, I created a very simple, bare minimum project that attempts to send four 20-byte packets per connection interval. It's using 1.4.2.2 version of the BLE stack. It waits for a notification that a connection interval has ended then runs a loop that sends four 20-byte packets consecutively via GATT_Notification(). It too suffers from the same issue. Three packets go just fine then the fourth returns a blePending error. I also tried using GATTServApp_ProcessCharCfg() instead of GATT_Notification() and got the same results. I also tried setting up a periodic timer and submitting packets at more regular intervals (as opposed to all at once after connection interval event) but got the same results.
After some research, I found this post which has me a little worried: https://e2e.ti.com/support/wireless_connectivity/bluetooth_low_energy/f/538/t/266578
The TI Employee stated that when going from peripheral to central, only 60 bytes per connection interval can be sent. I did try reducing my packet size to 16 bytes (as mentioned in that post) instead of 20. In that case, I was able to successfully send four packets per connection interval but unfortunately the throughput was less than my project called for. So far I have not found any corroborating information to back up the answer in that post. I'm also left with the question, if the BLE protocol works in such a way that it doesn't acknowledge the last frame from a slave in a connection event, then shouldn't I run into the same problem with 16-byte packets?
Should I be able to achieve a maximum throughput of ~2667 bytes/sec (four 20-byte packets every 30mS connection interval) with my setup (CC2540 peripheral sending notifications to iPhone central)? Hopefully it's just something I missed. Can anyone shed more light on the response that states a max of 60 bytes per connection interval when going from peripheral to central?
Thanks!
- Carson