13.2-“制作一款私有IAP串口下载小工具”之串口IAP的通信协议设计

一、前言

本章以“串口IAP”来讲解IAP的实现过程。因此,在这里讲一下,具体通过怎样的技术与协议,来把“固件”文件传递到芯片的bootloader中。

串口通信方式与参数约定
可以使用“RS232”或“RS485”来组成通信链路。串口通信参数约定如下:

  • 波特率:57600
  • 数据位:8bits
  • 校验:None
  • 停止位:1 bit

二、协议约定

  1. 协议规则
    CRC校验码 = [命令类型码 + 命令码 + 命令参数]
    一个完整封包 = [包头 + 包长 + 命令类型码 + 命令码 + 命令参数 + CRC校验码 + 包尾]
    包头:FF
    包尾:E3 D1 AC B5
    包长:0A (除去包头和包尾的长度,最长256)
    命令类型码:01:下发数据命令,02:获取数据命令,03:下位机主动反馈命令
    命令码:08
    命令参数(长度可变):00 11 22 33 …
    CRC校验码:E32F
    注:方括号和空格只为格式化显示,并不实际包含在封包中。
    封包最长长度为:131 + 1 + 4 + 3 + 2 = 141

  2. CRC校验算法

void GetCRC(uint8_t *data, int16_t len, uint16_t *crc) {
    uint16_t i,j,carry_flag, temp;
    *crc = 0xffff;
    for (i = 0; i < len; i++) {
        *crc = *crc ^ data[i];
        for (j = 0; j < 8; j ++) {
            temp = *crc;
            carry_flag = temp & 0x0001;
            *crc = *crc >> 1;
            if (carry_flag == 1) {
                 *crc = *crc ^ 0xa001;
            }
         }
    }
}
  1. 传输错误的处理方法
    使用失败重试机制,具体实现细节描述如下:
    通信错误的时候,下位机不会给给上位机返回“反馈命令”。
    上位机发送命令后等待接收“反馈命令”,如果等不到,则重发刚才的数据包。
    重发3次失败后,软件提示“下载失败”。

  2. 协议设计思想说明
    4.1 这里把封包设计的这么小,其目的在于让这个协议适用于多种“数据传输通道”,包括:串口、蓝牙、Socket、CAN、USB、Zigbee、其他任何无线通信。同时封包比较小,当遇到错误重发某个包的时候,代价相对较小可以接受。 另外,由于有封包的设计,因此接收数据封包方,需要定义一个接收缓存数组来接收完整的一包数据,然后进行校验计算。所以这个封包大小不能太大,否则MCU可能没有这么大的RAM可用。
    4.2 另外给协议加入了crc校验算法,目的是保证通信数据正确,避免数据传输出错。从而提高整个固件下载系统的稳定性。当你使用串口通信等稳定的通信链路来传输数据的时候crc校验显得有些多余。但是当你使用无线通信的时候,这个crc就是必不可少的校验机制。
    4.3 crc校验算法,采用了“计算法”而不是“查表法”。是因为考虑到特殊的芯片,并没有太多的代码储存空间,因此采用“以CPU计算量换储存空间”的策略。

三、命令列表

命令使用简单整体描述:
电脑PC工具先用“握手命令”确认Bootloader的正确存在。
使用“下载开始”命令告诉芯片准备接收下载数据,Bootloader完成擦除Flash。
使用“下载数据”命令下载数据,bootloader把收到的数据写入到Flash中。
使用“固件校验”命令确认下载到flash中的bin文件和要下载的bin文件“完全一至”。
使用“下载结束”命令告诉芯片下载完成了,可以校验app并重启芯片了。

  1. 下载固件握手命令:
    功能备注:主要用于上位机下载工具,实现自动查找设备的功能。
    命令类型码:01
    命令:01
    参数:无
    反馈命令:
    命令类型码:01
    命令:01
    参数:01 //版本序号(1,2,3,4,5等)

  2. 固件下载开始命令:
    功能备注:用于告诉bootloader要开始下载固件了,请做好准备。准备的内容包括,擦除要烧写固件的flash区域。准备好之后,给上位机反回“反馈命令”即可。
    命令类型码:01
    命令:02
    参数:无
    反馈命令:
    命令类型码:01
    命令:02
    参数:无

  3. 件下载结束命令:
    功能备注:用于上位机下载工具,告诉bootloader下载已经完成(之前的校验也成功了,如果不成功是不会发送此命令的),可以写“App存在”的flag到flash中了,同时可以跳转到烧写好的app并运行app了。
    命令类型码:01
    命令:03
    参数:无
    反馈命令:
    命令类型码:01
    命令:03
    参数:无

  4. 固件下载数据命令:
    功能备注:用于传输要烧写的bin文件到bootloader中,bootloader按页依次写到flash中。
    命令类型码:01
    命令:04
    参数:数据分片序号(2byte,高位在前 ) + 是否为最后一片(1byte)+需要下载的数据(约定为固定大小128byte)下载8个分片可以组成flash的一页128*8 = 1024
    反馈命令:
    命令类型码:01
    命令:04
    参数:无

  5. 固件校验命令:
    功能备注:用于校验所下载到flash中的固件文件与原本的bin文件是“一致的”。用于检测下载是否正确完成。Bootloader校验之后,把结果反回给上位机。
    命令类型码:01
    命令:05
    参数:所下载固件的校验值:0x00, 0x00, 0x00, 0x00(4byte,高位在前 )+ 分片总数(4byte,高位在前)
    反馈命令:
    命令类型码:01
    命令:05
    参数:0:错误,1:正确

四、协议代码实现说明

协议相对很健壮,因此看起来感觉很复杂,不容易实现。其实这个协议是我在实际项目开发中,总结设计出来的一套协议模板。对应于这个协议,我已经设计并实现了一套对应的“协议数据处理框架”。在本书3.1、3.2、3.3章节进行过详细的说明。当时是使用“网络通信”举例来说明“协议框架”的实现代码。这次借助“串口IAP”的应用场景,完成一个“协议框架”的“串口通信”编码示例。 具体的实现代码,请参考:13.4和13.6章节。

你可能感兴趣的:(哈喽,上位机(上位机开发指南))