Nordic——Serial DFU(串口dfu)升级协议详解

发布时间:2024年01月18日

Nordic——Serial DFU(串口dfu)升级协议详解

1、serial DFU Protocol

通过Uart串行通信执行安全设备固件更新,传输层使用SLIP库对数据包进行编码和解码。

串行 DFU 协议 流程 分四步:
第一步:检查串行通道是否 互通,向设备发送 ping id命令,等待设备回复 测试是否正常收发通信。
第二步:DFU 传输 初始化操作。
第三步:传输 init 包数据。
第四步:传输 固件 数据。

2、DFU 协议 详细说明

2.1 串行通道检测

dfu image 传输开始前 要 发送 ping id 操作命令,检查串行通信是否 收发正常,是 则进行 dfu 初始化、init包传输,固件传输;否 则提示 错误原因,查看操作结果码。

ping 操作命令:

操作码 ping id
09 1byte

ping 操作响应:

响应码 操作码 操作结果码
60 09 1byte

操作结果码:

0x00 无效操作码
0x01 操作成功
0x02 不支持的操作码
0x03 参数值丢失或无效
0x04 没有足够的内存用于数据对象
0x05 数据对象与固件和硬件要求不匹配,签名错误,或者解析命令失败
0x07 不是创建请求的有效对象类型
0x08 DFU进程的状态不允许此操作
0x0a 操作失败
0x0b 扩展错误。响应的下一个字节包含扩展错误的错误代码
2.2 DFU 初始化

在进行 DFU开始之前,DFU控制器必须设置PRN(Packet receive Notification)的值,并获取最大传输单元MTU(Packet receive Notification)。在大多数情况下,可以将PRN设置为0,以禁止在传输期间将 校验码 发送回控制器。如果传输层不可靠,请将PRN设置为非0的值。

DFU 传输数据时 MTU限制了 传输一包数据报文的大小,MTU包括SLIP封装,即一包数据可以发送的最大数据长度 为(MTU / 2)-2。

下面消息序列图显示 如何 设置PRN并获取 MTU:
在这里插入图片描述
设置 prn 值命令:

操作码 prn值
02 2byte

prn值:设置为 0。

设置 prn 值响应:

响应码 操作码 操作结果码
60 02 1byte

操作结果码:见2.1。

获取MTU值命令:

操作码
07

获取MTU值响应:

响应码 操作码 操作结果码 MTU
60 07 1byte 2byte

MTU值 是设备返回的数据 (低字节在前,高字节在后)。

2.3 DFU 传输 Init包

DFU 传输Init包 流程:DFU控制器 首先检查Init包 是否已经成功传输。如没有,DFU控制器 检查它是否已部分传输。如果已经传输了一部分数据,则继续传输,否则,DFU控制器发送Create 命令创建一个新的数据对象,然后传输Init包。当Init包传输完成,DFU控制器发送Execute命令来启动 初始化包的验证。

消息序列图显示如下:
在这里插入图片描述

1、选择命令(Select command):
作用:检查 Init 包的传输状态,通过Select command 响应的 max_size、offset、CRC32信息,判断传输状态是 已完成、部分完成、未开始。

操作码 操作对象类型
06 1byte

操作对象类型:

0x00 Invalid object type
0x01 command object
0x02 data object

选择响应:

响应码 操作码 操作结果码 max_size offset CRC32
60 06 1byte 4byte 4byte 4byte

操作结果码:见2.1。
max_size :传输Init包 数据时 每传输一段数据的最大值(低字节在前,高字节在后)。
offset :每个数据段的偏移量(低字节在前,高字节在后)。
CRC32 :传输数据段的CRC值(低字节在前,高字节在后)。

文章来源:https://blog.csdn.net/qq_45844792/article/details/135649406
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。