NRF52832 nRF Toolbox DFU升级详细流程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NRF52832 nRF Toolbox DFU升級(jí)詳細(xì)流程
?
升級(jí)前的流程:(此處待完善)
1、從機(jī)廣播
廣播數(shù)據(jù)包長(zhǎng)度31, 藍(lán)牙MAC地址(e5:f6:b1:61:f8:04), BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE,服務(wù)UUID(0xfe59)
藍(lán)牙名稱:DFU-A01-00000000
?
2、主機(jī)掃描請(qǐng)求
3、從機(jī)應(yīng)答主機(jī)掃描 數(shù)據(jù)為從機(jī)的MAC地址
4、主機(jī)請(qǐng)求連接
數(shù)據(jù)有:主機(jī)MAC, 從機(jī)MAC,訪問(wèn)地址, CRC init, Window Size, Window Offset, Interval, Latency, Timeout, 睡眠時(shí)鐘精度
?
5、主機(jī)查找服務(wù)
?
?
?
開(kāi)始升級(jí)
?
1、首選需要建立連接,且找到相應(yīng)的服務(wù),才能啟動(dòng)升級(jí)流程。
?
2、APP按下升級(jí)鍵,onUploadClicked->start->onHandleIntent->performDfu ?啟動(dòng)升級(jí)
?
3、主機(jī)根據(jù)情況請(qǐng)求MTU參數(shù)
APP: requestMtu(requiredMtu);
NRF52832: ble_evt_handler:BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST
?
4、主機(jī)使能從機(jī)通知功能。
APP: enableCCCD ->onDescriptorWrite
NRF52832: GAP自動(dòng)應(yīng)答
?
5、主機(jī)選擇命令對(duì)象并讀取其數(shù)據(jù),對(duì)象信息包含最大對(duì)象大小、偏移量和到目前為止整個(gè)對(duì)象的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
通知方式應(yīng)答命令區(qū)的現(xiàn)有參數(shù):大小、偏移、CRC
?
6、主機(jī)告知從機(jī)已發(fā)送數(shù)據(jù)包數(shù),默認(rèn)為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、主機(jī)創(chuàng)建一個(gè)數(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自動(dòng)應(yīng)答,通知方式應(yīng)答成功
?
8、主機(jī)發(fā)送初始化數(shù)據(jù)包 Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次
APP: writeInitData(mPacketCharacteristic, crc32);無(wú)應(yīng)答寫
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、 主機(jī)發(fā)送寫請(qǐng)求 獲取剛發(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自動(dòng)應(yīng)答,通知方式應(yīng)答偏移值,CRC值。
?
10、主機(jī)發(fā)送寫請(qǐng)求 執(zhí)行 ?CRC校驗(yàn)正確,則發(fā)的數(shù)據(jù)沒(méi)問(wèn)題,可以執(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
簽名認(rèn)證
GAP自動(dòng)應(yīng)答,通知方式應(yīng)答執(zhí)行成功。
?
11、主機(jī)選擇數(shù)據(jù)對(duì)象 從機(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自動(dòng)應(yīng)答,通知方式應(yīng)答包最大尺寸、偏移值,CRC值。
?
12、主機(jī)創(chuàng)建一個(gè)數(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自動(dòng)應(yīng)答,通知方式應(yīng)答成功
?
13、主機(jī)發(fā)送升級(jí)數(shù)據(jù)包,前面每包為4K,每小包244字節(jié) Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次 無(wú)應(yīng)答寫
APP: writePacket(mGatt, packetCharacteristic, buffer, size);//發(fā)送升級(jí)包數(shù)據(jù),第一小包244字節(jié)
發(fā)送完后觸發(fā)onCharacteristicWrite,如果當(dāng)前包未發(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、主機(jī)發(fā)送寫請(qǐng)求 獲取剛發(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自動(dòng)應(yīng)答,通知方式應(yīng)答偏移值,CRC值。
?
15、主機(jī)發(fā)送寫請(qǐng)求 執(zhí)行 ?CRC校驗(yàn)正確,則發(fā)的數(shù)據(jù)沒(méi)問(wèn)題,可以繼續(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自動(dòng)應(yīng)答,通知方式應(yīng)答執(zhí)行成功。
......
......
......
?
重復(fù)12-15傳輸數(shù)據(jù)包,直到剩下最后一包
?
16、主機(jī)創(chuàng)建一個(gè)數(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自動(dòng)應(yīng)答,通知方式應(yīng)答成功
?
13、主機(jī)發(fā)送升級(jí)數(shù)據(jù)包,最后一包2776字節(jié),每小包244字節(jié) Handle: 0x000d ?Handle: 0x000d 命令 嘗試3次 無(wú)應(yīng)答寫
APP: writePacket(mGatt, packetCharacteristic, buffer, size);//發(fā)送升級(jí)包數(shù)據(jù),第一小包244字節(jié)
發(fā)送完后觸發(fā)onCharacteristicWrite,如果當(dāng)前包未發(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、主機(jī)發(fā)送寫請(qǐng)求 獲取剛發(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自動(dòng)應(yīng)答,通知方式應(yīng)答偏移值,CRC值。
?
15、主機(jī)發(fā)送寫請(qǐng)求 執(zhí)行 ?CRC校驗(yàn)正確,則發(fā)的數(shù)據(jù)沒(méi)問(wèn)題,可以繼續(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自動(dòng)應(yīng)答,通知方式應(yīng)答執(zhí)行成功。
?
16、遠(yuǎn)程用戶(從機(jī))終止連接
APP: 等待遠(yuǎn)程用戶(從機(jī))終止連接
NRF52832: 復(fù)位,自然會(huì)斷開(kāi)連接
?
升級(jí)完成
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的NRF52832 nRF Toolbox DFU升级详细流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu20.04编译carla0.
- 下一篇: 函数中out参数的应用