NRF52832 nRF Toolbox DFU升级详细流程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NRF52832 nRF Toolbox DFU升級詳細流程
?
升級前的流程:(此處待完善)
1、從機廣播
廣播數(shù)據(jù)包長度31, 藍牙MAC地址(e5:f6:b1:61:f8:04), BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE,服務UUID(0xfe59)
藍牙名稱:DFU-A01-00000000
?
2、主機掃描請求
3、從機應答主機掃描 數(shù)據(jù)為從機的MAC地址
4、主機請求連接
數(shù)據(jù)有:主機MAC, 從機MAC,訪問地址, CRC init, Window Size, Window Offset, Interval, Latency, Timeout, 睡眠時鐘精度
?
5、主機查找服務
?
?
?
開始升級
?
1、首選需要建立連接,且找到相應的服務,才能啟動升級流程。
?
2、APP按下升級鍵,onUploadClicked->start->onHandleIntent->performDfu ?啟動升級
?
3、主機根據(jù)情況請求MTU參數(shù)
APP: requestMtu(requiredMtu);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST
?
4、主機使能從機通知功能。
APP: enableCCCD ->onDescriptorWrite
NRF52832: GAP自動應答
?
5、主機選擇命令對象并讀取其數(shù)據(jù),對象信息包含最大對象大小、偏移量和到目前為止整個對象的CRC32
APP: selectObject(OBJECT_COMMAND);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_command_req->on_cmd_obj_select_request
通知方式應答命令區(qū)的現(xiàn)有參數(shù):大小、偏移、CRC
?
6、主機告知從機已發(fā)送數(shù)據(jù)包數(shù),默認為0
APP: writeOpCode(mControlPointCharacteristic, OP_CODE_PACKET_RECEIPT_NOTIF_REQ);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
on_prn_set_request
?
7、主機創(chuàng)建一個數(shù)據(jù)包傳輸,包大小為0X87。
APP: writeCreateRequest(OBJECT_COMMAND, mInitPacketSizeInBytes);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_command_req->on_cmd_obj_create_request
GAP自動應答,通知方式應答成功
?
8、主機發(fā)送初始化數(shù)據(jù)包 Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次
APP: writeInitData(mPacketCharacteristic, crc32);無應答寫
NRF52832: ble_evt_handler:BLE_GATTS_EVT_WRITE, on_write->nrf_dfu_req_handler_req_process->nrf_dfu_obj_op->
nrf_dfu_command_req->on_cmd_obj_write_request->nrf_dfu_validation_init_cmd_append
?
9、 主機發(fā)送寫請求 獲取剛發(fā)送數(shù)據(jù)的CRC值 Handle: 0x000f Value: 03 ?NRF_DFU_OP_CRC_GET-3
APP: checksum = readChecksum();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_crc_request
GAP自動應答,通知方式應答偏移值,CRC值。
?
10、主機發(fā)送寫請求 執(zhí)行 ?CRC校驗正確,則發(fā)的數(shù)據(jù)沒問題,可以執(zhí)行。NRF_DFU_OP_OBJECT_EXECUTE-4
APP: writeExecute();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_command_req->on_cmd_obj_execute_request->nrf_dfu_validation_init_cmd_execute
簽名認證
GAP自動應答,通知方式應答執(zhí)行成功。
?
11、主機選擇數(shù)據(jù)對象 從機返回 數(shù)據(jù)包一包最大尺寸4k,偏移,CRC
APP: selectObject(OBJECT_DATA);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_select_request
GAP自動應答,通知方式應答包最大尺寸、偏移值,CRC值。
?
12、主機創(chuàng)建一個數(shù)據(jù)包傳輸,只有最后一包可能不是4k,其它包大小為4K。
APP: writeCreateRequest(OBJECT_DATA, availableObjectSizeInBytes);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_create_request->nrf_dfu_flash_erase
GAP自動應答,通知方式應答成功
?
13、主機發(fā)送升級數(shù)據(jù)包,前面每包為4K,每小包244字節(jié) Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次 無應答寫
APP: writePacket(mGatt, packetCharacteristic, buffer, size);//發(fā)送升級包數(shù)據(jù),第一小包244字節(jié)
發(fā)送完后觸發(fā)onCharacteristicWrite,如果當前包未發(fā)送完,writePacket(gatt, characteristic, buffer, size);//繼續(xù)發(fā)送下一小包
NRF52832: ble_evt_handler:BLE_GATTS_EVT_WRITE, on_write->nrf_dfu_req_handler_req_process->nrf_dfu_obj_op->
nrf_dfu_data_req->on_data_obj_write_request->nrf_dfu_flash_store
?
14、主機發(fā)送寫請求 獲取剛發(fā)送數(shù)據(jù)的CRC值 Handle: 0x000f Value: 03 ?NRF_DFU_OP_CRC_GET-3
APP: checksum = readChecksum();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_crc_request
GAP自動應答,通知方式應答偏移值,CRC值。
?
15、主機發(fā)送寫請求 執(zhí)行 ?CRC校驗正確,則發(fā)的數(shù)據(jù)沒問題,可以繼續(xù)傳輸。NRF_DFU_OP_OBJECT_EXECUTE-4
APP: writeExecute(mProgressInfo.isComplete());
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_execute_request->on_data_obj_execute_request_sched
GAP自動應答,通知方式應答執(zhí)行成功。
......
......
......
?
重復12-15傳輸數(shù)據(jù)包,直到剩下最后一包
?
16、主機創(chuàng)建一個數(shù)據(jù)包傳輸,最后一包2776字節(jié)
APP: writeCreateRequest(OBJECT_DATA, availableObjectSizeInBytes);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_create_request->nrf_dfu_flash_erase
GAP自動應答,通知方式應答成功
?
13、主機發(fā)送升級數(shù)據(jù)包,最后一包2776字節(jié),每小包244字節(jié) Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次 無應答寫
APP: writePacket(mGatt, packetCharacteristic, buffer, size);//發(fā)送升級包數(shù)據(jù),第一小包244字節(jié)
發(fā)送完后觸發(fā)onCharacteristicWrite,如果當前包未發(fā)送完,writePacket(gatt, characteristic, buffer, size);//繼續(xù)發(fā)送下一小包
NRF52832: ble_evt_handler:BLE_GATTS_EVT_WRITE, on_write->nrf_dfu_req_handler_req_process->nrf_dfu_obj_op->
nrf_dfu_data_req->on_data_obj_write_request->nrf_dfu_flash_store
?
14、主機發(fā)送寫請求 獲取剛發(fā)送數(shù)據(jù)的CRC值 Handle: 0x000f Value: 03 ?NRF_DFU_OP_CRC_GET-3
APP: checksum = readChecksum();
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_crc_request
GAP自動應答,通知方式應答偏移值,CRC值。
?
15、主機發(fā)送寫請求 執(zhí)行 ?CRC校驗正確,則發(fā)的數(shù)據(jù)沒問題,可以繼續(xù)傳輸。NRF_DFU_OP_OBJECT_EXECUTE-4
APP: writeExecute(mProgressInfo.isComplete());
NRF52832: ble_evt_handler:BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,on_ctrl_pt_write->nrf_dfu_req_handler_req_process->
nrf_dfu_obj_op->nrf_dfu_data_req->on_data_obj_execute_request->on_data_obj_execute_request_sched->
nrf_dfu_validation_post_data_execute->on_dfu_complete->nrf_dfu.c::dfu_observer(關(guān)閉連接)->
nrf_bootloader::dfu_observer(重啟)
GAP自動應答,通知方式應答執(zhí)行成功。
?
16、遠程用戶(從機)終止連接
APP: 等待遠程用戶(從機)終止連接
NRF52832: 復位,自然會斷開連接
?
升級完成
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的NRF52832 nRF Toolbox DFU升级详细流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu20.04编译carla0.
- 下一篇: 利用LABVIEW的python接口调用