930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 12190|回复: 2

使用nrf52840作蓝牙主机怎么开启indicate

[复制链接]

3

主题

9

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2021-1-27 17:08:12 | 显示全部楼层 |阅读模式
本帖最后由 lolifrog 于 2021-1-27 17:16 编辑

     目前使用使用nrf52840作蓝牙主机连接带dfu的从机设备,从机设备已经刷入BootLoader,是Buttonless DFU的模板。现在想模仿“nrf conncet” 软件,开启DFU服务下Bottonless特征的indicate(如下图),并发送0x01命令使从机进入DFU

现在不知道主机端程序是否开启indicate成功,写CCCD的代码如下
  1. static uint32_t cccd_configure(ble_hrs_c_t * p_ble_hrs_c, bool enable)
  2. {
  3.     NRF_LOG_INFO("Configuring CCCD. CCCD Handle = %x, Connection Handle = %x",
  4.                   p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle,
  5.                   p_ble_hrs_c->conn_handle);

  6.     nrf_ble_gq_req_t hrs_c_req;
  7.     uint8_t          cccd[BLE_CCCD_VALUE_LEN];
  8.     uint16_t         cccd_val = enable ? BLE_GATT_HVX_INDICATION : 0;

  9.     cccd[0] = LSB_16(cccd_val);
  10.     cccd[1] = MSB_16(cccd_val);

  11.     memset(&hrs_c_req, 0, sizeof(hrs_c_req));

  12.     hrs_c_req.type                        = NRF_BLE_GQ_REQ_GATTC_WRITE;
  13.     hrs_c_req.error_handler.cb            = gatt_error_handler;
  14.     hrs_c_req.error_handler.p_ctx         = p_ble_hrs_c;
  15.     hrs_c_req.params.gattc_write.handle   = p_ble_hrs_c->peer_hrs_db.hrm_cccd_handle;
  16.     hrs_c_req.params.gattc_write.len      = BLE_CCCD_VALUE_LEN;
  17.         hrs_c_req.params.gattc_write.offset   = 0;//偏移量设置为0
  18.     hrs_c_req.params.gattc_write.p_value  = cccd;
  19.     hrs_c_req.params.gattc_write.write_op = BLE_GATT_OP_WRITE_REQ;
  20.         hrs_c_req.params.gattc_write.flags    = BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE;//执行准备好的写
  21.     return nrf_ble_gq_item_add(p_ble_hrs_c->p_gatt_queue, &hrs_c_req, p_ble_hrs_c->conn_handle);
  22. }
复制代码
请问
1.怎么检测成功开启indicate,主机开启indicate的时候会和从机交互数据吗?
2.成功开启indicate之后,能不能按照“开发指南(下册-主机)配套实验源码\实验8-1:串口透传主机”中的 ble_uarts_c_string_send 函数 来写0x01到 从机

谢谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

52

主题

339

帖子

6487

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6487
发表于 2021-1-30 09:41:08 | 显示全部楼层
1:主机开启indicate的时候会和从机交互。
2:成功开启后,可以参照8-1的例子,写数据发送到从机。
回复 支持 反对

使用道具 举报

3

主题

9

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2021-2-2 18:00:39 | 显示全部楼层
强光手电 发表于 2021-1-30 09:41
1:主机开启indicate的时候会和从机交互。
2:成功开启后,可以参照8-1的例子,写数据发送到从机。

使用 ble_uarts_c_string_send 函数来写0x01到从机时遇到问题。
已经使能indication,可以读取其特征0x0002
当写入0x01到buttonless experiment dfu特征(后面写入到的都是这个特征)时,主机可以读取0x20 0x01 0x01,但从机没有提示log。当主机写入0x04时,从机有提示
<error> app : Request to send a response to client failed.
<error> app : Request to enter bootloader mode failed asynchroneously.
主机会周期性断开、连接从机,断开连接的原因是0x13.但重新连接后就没有上面的第一条error信息,如果写入的是0x04只有
<error> app : Request to enter bootloader mode failed asynchroneously.
如果写入的是0x01,则没有任何log
详细写特征代码:
  1. uint32_t ble_dfu_c_string_send(ble_hrs_c_t * p_ble_dfu_c, uint8_t * p_string, uint16_t length)
  2. {

  3.     VERIFY_PARAM_NOT_NULL(p_ble_dfu_c);
  4.     nrf_ble_gq_req_t write_req;
  5.     memset(&write_req, 0, sizeof(nrf_ble_gq_req_t));
  6.     if (length > NRF_SDH_BLE_GATT_MAX_MTU_SIZE - 3)
  7.     {
  8.         NRF_LOG_WARNING("Content too long.");
  9.         return NRF_ERROR_INVALID_PARAM;
  10.     }
  11.     if (p_ble_dfu_c->conn_handle == BLE_CONN_HANDLE_INVALID)
  12.     {
  13.         NRF_LOG_WARNING("Connection handle invalid.");
  14.         return NRF_ERROR_INVALID_STATE;
  15.     }

  16.     write_req.type                        = NRF_BLE_GQ_REQ_GATTC_WRITE;
  17.     write_req.error_handler.cb            = gatt_error_handler;
  18.     write_req.error_handler.p_ctx         = p_ble_dfu_c;
  19.     write_req.params.gattc_write.handle   = p_ble_dfu_c->peer_hrs_db.hrm_handle;
  20.     write_req.params.gattc_write.len      = length;
  21.     write_req.params.gattc_write.offset   = 0;
  22.     write_req.params.gattc_write.p_value  = p_string;
  23.     write_req.params.gattc_write.write_op = BLE_GATT_OP_WRITE_CMD;
  24.         NRF_LOG_INFO("ble_dfu_c_string_send write.handle:%x",p_ble_dfu_c->peer_hrs_db.hrm_handle);
  25.     return nrf_ble_gq_item_add(p_ble_dfu_c->p_gatt_queue, &write_req, p_ble_dfu_c->conn_handle);
  26. }
复制代码

请问上述情况是不是没有进入BootLoader(因为从机没有进入的log),问题出在哪里?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

GMT+8, 2024-4-29 11:39 , Processed in 0.067834 second(s), 22 queries .

快速回复 返回顶部 返回列表