Hi,
I am trying to update the firmware from ble_center to ble_peripheral via BLE DFU(SDK version is "nRF5_SDK_17.0.2_d674dde"),
On the ble_peripheral side I can successfully update using the app(nRF Connect),but I have a problem when I want to update with the ble_center
first I created ble_dfu_c, after BLE_DFU_C_EVT_DISCOVERY_COMPLETE, I enable indication as follows
static uint32_t cccd_configure(ble_dfu_c_t * p_ble_dfu_c, bool enable)
{
NRF_LOG_INFO("Configuring CCCD. CCCD Handle = %d, Connection Handle = %d",
p_ble_dfu_c->peer_dfu_db.hrm_cccd_handle,
p_ble_dfu_c->conn_handle);
nrf_ble_gq_req_t dfu_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(&dfu_c_req, 0, sizeof(dfu_c_req));
dfu_c_req.type = NRF_BLE_GQ_REQ_GATTC_WRITE;
dfu_c_req.error_handler.cb = gatt_error_handler;
dfu_c_req.error_handler.p_ctx = p_ble_dfu_c;
dfu_c_req.params.gattc_write.handle = p_ble_dfu_c->peer_dfu_db.hrm_cccd_handle;
dfu_c_req.params.gattc_write.len = BLE_CCCD_VALUE_LEN;
dfu_c_req.params.gattc_write.p_value = cccd;
dfu_c_req.params.gattc_write.write_op = BLE_GATT_OP_WRITE_REQ;
return nrf_ble_gq_item_add(p_ble_dfu_c->p_gatt_queue, &dfu_c_req, p_ble_dfu_c->conn_handle);
}
uint32_t ble_dfu_c_hrm_notif_enable(ble_dfu_c_t * p_ble_dfu_c)
{
VERIFY_PARAM_NOT_NULL(p_ble_dfu_c);
return cccd_configure(p_ble_dfu_c, true);
}
At present, no errors info are returned, and the value of reading cccd is 0x002,
Then I send 0x01 to let the ble_peripheral into dfu mode, it doesn't work.
//ble_dfu_c.c
uint32_t ble_dfu_c_string_send(ble_dfu_c_t * p_ble_dfu_c, uint8_t * p_string, uint16_t length)
{
VERIFY_PARAM_NOT_NULL(p_ble_dfu_c);
nrf_ble_gq_req_t write_req;
memset(&write_req, 0, sizeof(nrf_ble_gq_req_t));
if (length > NRF_SDH_BLE_GATT_MAX_MTU_SIZE - 3)
{
NRF_LOG_WARNING("Content too long.");
return NRF_ERROR_INVALID_PARAM;
}
if (p_ble_dfu_c->conn_handle == BLE_CONN_HANDLE_INVALID)
{
NRF_LOG_WARNING("Connection handle invalid.");
return NRF_ERROR_INVALID_STATE;
}
write_req.type = NRF_BLE_GQ_REQ_GATTC_WRITE;
write_req.error_handler.cb = gatt_error_handler;
write_req.error_handler.p_ctx = p_ble_dfu_c;
write_req.params.gattc_write.handle = p_ble_dfu_c->peer_dfu_db.hrm_handle;
write_req.params.gattc_write.len = length;
write_req.params.gattc_write.offset = 0;
write_req.params.gattc_write.p_value = p_string;
write_req.params.gattc_write.write_op = BLE_GATT_OP_WRITE_CMD;
write_req.params.gattc_write.flags = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE;
NRF_LOG_INFO("%d ", strlen(p_string));
NRF_LOG_INFO("%d ", strlen(write_req.params.gattc_write.p_value));
for(int i=0;i<strlen(write_req.params.gattc_write.p_value);i++ )
NRF_LOG_INFO("%02X ", write_req.params.gattc_write.p_value[i]);
return nrf_ble_gq_item_add(p_ble_dfu_c->p_gatt_queue, &write_req, p_ble_dfu_c->conn_handle);
}
// main.c
uint8_t buff[1] = {0x01};
ble_dfu_c_string_send(&m_ble_dfu_c, buff, 1);
I tried to add some logs and found that BLE_GATTS_EVT_HVC is not triggered on the ble_peripheral side,
So the BLE_GATTC_EVT_HVX of the ble_center does not receive the return data
Is there something I forgot that caused the ble_peripheral doesn't receive the data()?