This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2640R2F: BLE Connection Interval / Connection Parameter Update Requests with Android

Part Number: CC2640R2F
Other Parts Discussed in Thread: CC2541, CC2650

Hello E2E Team,

we have implemented a BLE project based on the SimplePeripheral example for CC2640R2.

Due to strict power consumption requirements we have enabled the Connection Update Request with the following parameters:

MIN Conn Interval = 400ms

MAX Conn Interval = 1000ms

Slave Latency = 0

When using a Bluetooth USB Dongle (Bluegiga), after connecting we can see that the Peripheral is initiating the Connection Parameter Update Request (Slave to Master) which is then Accepted by the Host (Interval = 400ms).

When using different Android Smartphones with different Android versions, we see quite high frequent Connection Intervals and some quite random behavior (sometimes interval is put to 100ms, sometimes it will stay at 10ms...)

Despite the fact that this seems to be an Android problem and not an issue of the CC2640R2, do you have any hint or advise on how we can "force" the Android to higher connection intervals ?

On Android side - the only thing we found so far are  3 different BLE "settings" (CONNECTION_PRIORITY_BALANCED, CONNECTION_PRIORITY_HIGH, CONNECTION_PRIORITY_LOW_POWER) but none of them describe on how they accept / reject Connection Update requests from the slave.

Attached there is a log of the BLE transaction after connection with BluegigaDongle (UpdateRequest is happening) and 2 different Android systems (no Update Request, only LL transactions).

Thanks a lot in advance,

Dominik

  • Hello Dominik,

    In BLE, the connection parameters are ultimately determined by the master, in this case the Android handset, while the slave can only request a change. Your Bluegiga dongle, like ours, is likely a little more lax when it comes to accepting slave requests to change the connection interval.

    The only thing you can do as a slave is request a different interval or send a REJECT to the LL_CONNECTION_PARAM_REQ but the master may decide to change the conn params unilaterally (it's allowed to do so under the Bluetooth specification). Note that the behaviour of the Androids will vary based on OS and vendor implementations as you have seen.

    To send a reject, you can configure the Multi_Param_Update_Options Parameter GAPROLE_LINK_PARAM_UPDATE_REJECT_REQUEST or one of the other options listed in peripheral.h for GAPROLE_PARAM_UPDATE_ENABLE.

    Best wishes
  • We tested this and reject packet is being sent from our device

    But still using android app connection interval only which is ~50ms

    We want to set the connection interval of peripheral device to be used during connection

    attaching reject packet capture and without reject packet (normal flow)

    - Suganya

  • Hi,

    Your second capture does not show a request from the slave (you) requesting a slower CI. All it shows is you sending a REJECT but it's not clear if the master changed the CI later on - this is why sniffer screen shots are of lesser value to us in our analysis.

    Best wishes

  • Hi,

    Did you solve your problem?

    I'm getting exactly the same problem with the Android handset setting the connection interval to 50 ms and other gateway device setting it to 15 ms!

    Adding a reject request gives me an error 59 (Connection parameters update failed with status 59), that is BLE_HCI_CONN_INTERVAL_UNACCEPTABLE.

    Hence, it cannot update the connection parameters.

    Using the BLE cc2541 dongle with BTool works fine. 

    I was using the CC2650 before and never had this problem. 

    Any Hints?

  • Yes with Android phones, connection interval of phone is being used. Issue was still there. We couldnt able to change it

    Only for the first time of app connection, it uses phone interval. From 2nd connection (disconnect & again connect), it started using local requested interval

    So we are sending connection interval as part of BLE payload itself.

    After request procedure is completed and updated with app value, disconnect and re-connect from app side to get new values