stc-isp烧录 下载 协议 过程分析
一、数据封装格式
包头 |
标示 |
数据包长度 |
命令字 |
内容 |
校验 |
包尾 |
1. 包头:2字节,固定为:0x46,0xB9。
2. 标示:1字节,分两种,ARM发给MCU :0x6A;MCU回复给ARM :0x68。3. 数据包长度:2字节,除包头外数据包总长度。
4. 命令:1字节。
5. 内容:可以为空,最长134字节。
6. 校验:1字节,为包头之后,校验之前所有字节相加的值,不计进位。
7. 包尾:1字节,固定为:0x16。
二、命令列表
命令字 |
说明 |
回复 |
说明 |
0x7F |
引导MCU进入ISP模式。 |
0x00 |
内容中携带MCU自身配置信息。 |
0x8F |
测试波特率指令。 |
0x8F |
内容是与波特率相关的信息。 |
0x8E |
设置波特率指令。 |
0x8E |
内容是与波特率相关的信息。 |
0x80 |
握手指令。 |
0x80 | 握手回复,内容为空。 |
0x84 |
文件大小指令。 |
0x80 |
文件大小回复,内容为空。 |
0x00 |
发送文件指令。 |
0x80 |
发送文件回复,内容为1个字节。 |
0x8D |
设置选项指令。 |
0x8D |
设置选项应答 |
0x50 |
MCU选项信息。 |
0x10 |
MCU选项信息应答。 |
0x82 |
退出ISP模式指令。 |
0x80 |
退出应答。 |
三、通信流程
1. ARM首先连续给MCU发送0x7F,引导MCU进入ISP模式。
2. MCU上电,收到0x7F后,进入ISP模式,回复自身配置信息,这条数据有点特殊,因为它没有包头,以0x68(MCU给ARM回复的标示)开头,其余都符合该协议的数据封装格式。
3. ARM收到MCU自身配置参数后,会给MCU发送测试波特率的指令。
4. MCU收到测试波特率指令后,以相同的命令字回复给ARM。
5. ARM收到测试应答后,给MCU发送设置波特率的命令。
6. MCU收到设置波特率指令后,以相同的命令字给ARM回复。
7. ARM收到设置波特率应答后,给MCU发送握手指令,MCU以相同的命令字给ARM回复。如此,重复5次,握手结束。
PS:由于时间关系,以上流程数据包中携带的内容,具体是什么含义,没有仔细研究。
8. 握手结束后,ARM会给MCU发送文件大小,擦除芯片的指令,此数据包中的内容为写入MCU的文件大小,占7个字节,不足7个字节的用0x33补齐。
文件大小计算方法:
在MCU中,以512B为单位,把存储空间分为若干份,此处文件大小的含义为写入文件占存储空间的份数, 不足一份的按一份计算:
file_copies= file_size >> 9;
file_copies = ((file_copies << 9) ==file_size) ? file_copies : (file_copies + 1);
file_size为写入bin文件的大小。
9. MCU收到上述指令后,会根据写入文件的大小,擦除芯片,并给ARM回复。
10. ARM收到文件大小的回复后,开始向MCU发生文件,封装格式:
预留位 |
写入地址 |
内容长度 |
文件内容 |
1. 预留位:2字节,0x00, 0x00。
2. 写入地址:2字节,相邻两个数据包的地址以0x80递增。
3. 内容长度:2字节,固定长度为:0x00, 0x80。
4. 文件内容:0x80(128)字节,为实际读到的bin文件内容。
注意:写入文件的大小必须为0x80×4的倍数。
11. 文件发送完毕后,ARM会向发送设置选项信息(具体什么含义,不清楚),MCU会给予回复。
12. 收到上述回复后,ARM再次向MCU发送MCU选项信息(具体什么含义,不清楚),MCU会给予回复。
13. 最后,ARM向MCU发送退出ISP模式指令,MCU收到指令后,给予回复,程序写入成功。