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

How to enable indication and get CCCD value to check

Hi All,

I want to use DFU to update the firmware from master to peripheral over BLE ,  both master and peripheral are nrf52840. My purpose is that the master sends a command to make the peripheral enter bootloader.Therefore I need enable indication and write 0x01 to peripheral. "nrf connect" can do it.

But the problem is that I don't kown if the indication is enable on peripheral.I referred to other answers but failed becuase I can't excuess sd_ble_gatts_value_get() and  sd_ble_gatts_hvx() correctly, my programs are below.

 

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//enable indication
static uint32_t cccd_configure(ble_hrs_c_t * p_ble_hrs_c, bool enable)
{
NRF_LOG_INFO("Configuring CCCD. CCCD Handle = %x, Connection Handle = %x",
p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle,
p_ble_hrs_c->conn_handle);
nrf_ble_gq_req_t hrs_c_req;
uint8_t cccd[BLE_CCCD_VALUE_LEN];
uint16_t cccd_val = enable ? BLE_GATT_HVX_INDICATION : 0;
cccd[0] = LSB_16(cccd_val);
cccd[1] = MSB_16(cccd_val);
memset(&hrs_c_req, 0, sizeof(hrs_c_req));
hrs_c_req.type = NRF_BLE_GQ_REQ_GATTC_WRITE;
hrs_c_req.error_handler.cb = gatt_error_handler;
hrs_c_req.error_handler.p_ctx = p_ble_hrs_c;
hrs_c_req.params.gattc_write.handle = p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle;
hrs_c_req.params.gattc_write.len = BLE_CCCD_VALUE_LEN;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ble_hrs_c_handles_assign

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uint32_t ble_hrs_c_handles_assign(ble_hrs_c_t * p_ble_hrs_c,
uint16_t conn_handle,
const hrs_db_t * p_peer_hrs_handles)
{
VERIFY_PARAM_NOT_NULL(p_ble_hrs_c);
p_ble_hrs_c->conn_handle = conn_handle;
if (p_peer_hrs_handles != NULL)
{
//p_ble_hrs_c->peer_hrs_db = *p_peer_hrs_handles;
NRF_LOG_INFO("In handles assign");
p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle = p_peer_hrs_handles->hrm_cccd_handle;
p_ble_hrs_c->peer_hrs_db.hrm_handle = p_peer_hrs_handles->hrm_handle;
}
return nrf_ble_gq_conn_handle_register(p_ble_hrs_c->p_gatt_queue, conn_handle);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

when find the service and characteristics

 

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void hrs_c_evt_handler(ble_hrs_c_t * p_hrs_c, ble_hrs_c_evt_t * p_hrs_c_evt)
{
ret_code_t err_code;
bool is_indication_enabled = true;
switch (p_hrs_c_evt->evt_type)
{
case BLE_HRS_C_EVT_DISCOVERY_COMPLETE:
{
NRF_LOG_INFO("dfu service discovered.");
err_code = ble_hrs_c_handles_assign(p_hrs_c,
p_hrs_c_evt->conn_handle,
&p_hrs_c_evt->params.peer_db);
APP_ERROR_CHECK(err_code);
err_code = cccd_configure(p_hrs_c,true);
APP_ERROR_CHECK(err_code);
ble_gatts_value_t gatt_value;
uint8_t cccd_value;
gatt_value.len = 2;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

connection handle : 0, characteristics handle:0x16, cccd handle:0x17

sd_ble_gatts_value_get() returned error 5 

I have no idea where is wrong , please give me some advice

Thanks,

Steven