本文描述了通过 CSK6 系芯片烧录 UART 接口对芯片进行固件烧录的方法,可用于上位机对 CSK6 进行固件升级的应用开发,通过本章节,您将了解到:
通过串口对 CSK6 系芯片完成固件烧录的流程如下:
上述步骤2与步骤3需遵循 CSK6 串口烧录协议,接下来将进行说明。
CSK 串口烧录由上位机向 CSK6 发起命令请求,CSK6 处理后相应相应的结果。
对于所有的请求,上位机都需要经过 SLIP 编码后发出;同样地,对于所有从 CSK6 发回的响应,上位机都应当进行 SLIP 解码后再进行处理。
0xC0
开始和结束0xC0
和 0xDB
需分别替换为 0xDB 0xDC
和 0xDB 0xDD
。以上替换是在校验和和长度计算后完成的。
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 1 | direction | 命令包中固定为 0x00 |
1 | 1 | command | 命令标识符(参照指令列表) |
2 | 2 | size | data 字段的长度,单位为字节 |
4 | 4 | checksum | payload 字段的校验和,仅当 command 为 FLASH_DATA 、NAND_DATA 和 MEM_DATA 时需要填充,其它情况取 0x00000000 |
8 | n | data | 长度可变的数据字段,不同 command 的数据格式不同,详见指令列表的 data 字段格式 |
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 1 | direction | 响应包中固定为 0x01 |
1 | 1 | command | 与触发响应的命令包中的 command 字段保持一致 |
2 | 2 | size | data 字段的长度,单位为字节 |
4 | 4 | value | 如无特殊在指明,无意义 |
8 | n | data | 长度可变的响应数据字段 |
如无特殊指明,data
字段的格式如下:
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
8 | 1 | error | 0x00 表示成功,0x01 表示失败 |
9 | 1 | code | 响应状态码,参照响应状态码 |
command | 值 | 功能描述 | data 字段格式 |
---|---|---|---|
FLASH_BEGIN |
0x02 |
开始 Flash 下载 | 参照 FLASH_BEGIN 包数据格式 |
FLASH_DATA |
0x03 |
传输 Flash 数据 | 参照 FLASH_DATA 包数据格式 |
FLASH_END |
0x04 |
结束 Flash 下载 | 参照 FLASH_END 包数据格式 |
MEM_BEGIN |
0x05 |
开始 Memory 下载 | 参照 MEM_BEGIN 包数据格式 |
MEM_END |
0x06 |
结束 Memory 下载 | 参照 MEM_END 包数据格式 |
MEM_DATA |
0x07 |
传输 Memory 数据 | 参照 MEM_DATA 包数据格式 |
SYNC |
0x08 |
同步 | 0x07 0x07 0x12 0x20 + 32个 0x55 |
READ_FLASH_SLOW |
0x0E |
读取 Flash | 参照 READ_FLASH_SLOW 包数据格式 |
SET_BAUD |
0x0F |
改变波特率 | 参照 SET_BAUD 包数据格式 |
FLASH_MD5 |
0x13 |
Flash MD5 校验 | 参照 FLASH_MD5 包数据格式 |
NAND_INIT |
0x20 |
初始化 NAND | 参照 NAND_INIT 包数据格式 |
NAND_BEGIN |
0x21 |
开始 NAND 下载 | 参照 NAND_BEGIN 包数据格式 |
NAND_DATA |
0x22 |
传输 NAND 数据 | 参照 NAND_DATA 包数据格式 |
NAND_END |
0x23 |
结束 NAND 下载 | 参照 NAND_END 包数据格式 |
NAND_MD5 |
0x24 |
NAND MD5 校验 | 参照 NAND_MD5 包数据格式 |
FLASH_ERASE_CHIP |
0xD0 |
擦除整片 Flash | 参照 FLASH_ERASE_CHIP 包数据格式 |
FLASH_ERASE_REGION |
0xD1 |
擦除 Flash 区域 | 参照 FLASH_ERASE_REGION 包数据格式 |
READ_FLASH_ID |
0xF3 |
读取 Flash JEDEC ID | 参照 READ_FLASH_ID 包数据格式 |
READ_CHIP_ID |
0xF4 |
读取芯片 UUID | 参照 READ_CHIP_ID 包数据格式 |
值 | 说明 |
---|---|
0x00 |
传输成功 |
0xC0 |
data 字段长度不一致 |
0xC1 |
data 字段校验和不一致 |
0xC2 |
data 字段的 block size 不合法 |
0xC3 |
命令参数不合法 |
0xC4 |
SPI Flash 操作失败 |
0xC5 |
SPI Flash 解锁失败 |
0xC6 |
当前未在 Flash 下载状态 |
0xC8 |
Flash 下载数据不满足 FLASH_BEGIN 所给出的数量 |
0xC9 |
Flash 下载数据超出了 FLASH_BEGIN 所给出的数量 |
0xCA |
FLASH_DATA 所传递的 seq 字段值不连续 |
0xD0 |
未找到 NAND |
0xFE |
命令执行异常 |
0xFF |
命令不受支持 |
MEM_BEGIN
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 4 | size | 即将通过 MEM_DATA 下载的数据总字节数 |
12 | 4 | block_num | 需要传输的 block 数量 |
16 | 4 | block_size | 每一个 block 的数据长度 |
20 | 4 | offset | 目标内存偏移,固定为 0x00000000 |
本数据包只需要传输一次
报文示例:
C0 00 05 10 00 00 00 00 00 CC 3E 00 00 08 00 00 00 00 08 00 00 00 00 00 00 C0
MEM_DATA
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式。注意 checksum 需要填充为 payload 的校验和 |
8 | 4 | size | payload 数据段长度,根据需要传输的数据量来定,无对齐要求 |
12 | 4 | seq | 序号,从 0 开始,每发送一个 MEM_DATA 增加 1 |
16 | 8 | reserved | 未使用,保持为 0x00 |
24 | n | payload | 需要发送的数据 |
报文示例:
C0 00 07 10 08 F2 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 F5 1C 08 …… 23 68 C0
MEM_END
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 8 | flag | 全为 0x00 |
报文示例:
C0 00 06 08 00 00 00 00 00 00 00 00 00 00 00 00 00 C0
FLASH_BEGIN
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 4 | size | 即将通过 FLASH_DATA 下载的数据总字节数 |
12 | 4 | block_num | 需要传输的 block 数量 |
16 | 4 | block_size | 每一个 block 的数据长度 |
20 | 4 | offset | 目标 Flash 偏移 (起始地址为 0x00000000 ) |
block_size
建议取值为4096
,以达到最佳传输效率。
offset
需要 4K 对齐,即能被4096
整除。
本数据包只需要传输一次,将接下来需要传输的内容通知代理程序。
报文示例:
C0 00 02 10 00 00 00 00 00 00 10 00 00 01 00 00 00 00 10 00 00 00 00 00 00 C0
FLASH_DATA
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式。注意 checksum 需要填充为 payload 的校验和 |
8 | 4 | size | payload 数据段长度,根据需要传输的数据量来定,无对齐要求 |
12 | 4 | seq | 序号,从 0 开始,每发送一个 FLASH_DATA 增加 1 |
16 | 8 | reserved | 未使用,保持为 0x00 |
24 | n | payload | 需要发送的数据 |
报文示例:
C0 00 03 10 10 E1 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7B E9 97 11 B5 48 …… 64 D1 A0 C0
FLASH_END
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 4 | flag | 固定为 FF 00 00 00 |
报文示例:
C0 00 04 04 00 00 00 00 00 FF 00 00 00 C0
SET_BAUD
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 4 | new_baud | 需要更改的目标波特率 |
12 | 4 | old_baud | 当前波特率 |
报文示例:
C0 00 0F 08 00 00 00 00 00 00 6D 0B 00 00 C2 01 00 C0
示例中,将波特率由
115200
变更为748800
。
FLASH_MD5
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 4 | offset | 校验起始偏移值 |
12 | 4 | length | 需要校验的区域大小 |
16 | 8 | reserved | 全为 0x00 |
offset
需要 4K 对齐,即能被4096
整除。
报文示例:
C0 00 13 10 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 C0
返回格式:
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见响应包数据格式 |
8 | 1 | error | 0x00 表示成功,0x01 表示失败 |
9 | 1 | code | 响应状态码,参照响应状态码 |
10 | 16 | md5 | MD5 校验值 |
READ_FLASH_SLOW
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 4 | offset | 读取起始偏移值 |
12 | 4 | length | 需要读取的区域大小 (当前只支持 64 ) |
报文示例:
C0 00 0E 08 00 00 00 00 00 00 00 40 00 40 00 00 00 C0
返回格式:
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见响应包数据格式 |
8 | 1 | error | 0x00 表示成功,0x01 表示失败 |
9 | 1 | code | 响应状态码,参照响应状态码 |
10 | 64 | data | 所请求区域的数据 |
NAND_INIT
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
8 | 1 | mode_4bit | SDIO 传输模式,0 表示 1-bit 模式,1 表示 4-bit 模式 |
9 | 1 | sd_cmd | SD_CMD 引脚配置,传 0x00 使用默认值,详见后文 |
10 | 1 | sd_clk | SD_CLK 引脚配置,传 0x00 使用默认值,详见后文 |
11 | 1 | sd_dat0 | SD_DAT0 引脚配置,传 0x00 使用默认值,详见后文 |
12 | 1 | sd_dat1 | SD_DAT1 引脚配置,详见后文 |
13 | 1 | sd_dat2 | SD_DAT2 引脚配置,详见后文 |
14 | 1 | sd_dat3 | SD_DAT3 引脚配置,详见后文 |
15 | 1 | reserved | 未使用,保持 0x00 |
每个引脚配置字段占用 8 bit,每个 bit 的含义如下:
bit | 名称 | 说明 |
---|---|---|
7 | set | 0 表示维持该引脚默认配置,1 表示使用下面 pad 和 pin 所指定的引脚 |
6 | pad | 引脚 PAD,0 表示 PA,1 表示 PB |
5-0 | pin | 引脚号 |
各引脚默认值如下:
功能 | PAD | PIN | 说明 |
---|---|---|---|
SD_CMD | PA | 13 | |
SD_CLK | PA | 20 | |
SD_DAT0 | PA | 19 | |
SD_DAT1 | / | / | 默认为 1-bit 模式,未使用该引脚 |
SD_DAT2 | / | / | 默认为 1-bit 模式,未使用该引脚 |
SD_DAT3 | / | / | 默认为 1-bit 模式,未使用该引脚 |
其中 SDIO 1-bit 模式只需使用 SD_CMD
SD_CLK
SD_DAT0
3 个引脚,4-bit 模式需要上述全部 6 个引脚。
报文示例:
C0 01 20 0A 00 00 00 00 00 00 00 00 02 00 00 FF CF 03 00 C0
返回格式:
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见响应包数据格式 |
8 | 1 | error | 0x00 表示成功,0x01 表示失败 |
9 | 1 | code | 响应状态码,参照响应状态码 |
10 | 4 | blk_len | 单个 NAND 区块大小 (字节) |
14 | 4 | blk_num | NAND 区块数 |
NAND_BEGIN
包数据格式与FLASH_BEGIN
包数据格式一致。注意 offset
需要 512 字节对齐。
报文示例:
C0 00 21 10 00 00 00 00 00 00 00 40 01 00 14 00 00 00 10 00 00 00 00 20 06 C0
NAND_DATA
包数据格式与FLASH_DATA
包数据格式一致。
报文示例:
C0 00 22 10 10 AC 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 ......4F 00 00 08 4F 00 00 09 4F 00 00 C0
NAND_END
包数据格式与FLASH_END
包数据格式一致。
报文示例:
C0 00 23 04 00 00 00 00 00 FF 00 00 00 C0
NAND_MD5
包数据格式与FLASH_MD5
包数据格式一致。注意 offset
需要 512 字节对齐。
报文示例:
C0 00 24 10 00 00 00 00 00 00 00 20 06 00 00 40 01 00 00 00 00 00 00 00 00 C0
FLASH_ERASE_CHIP
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
报文示例:
C0 00 D0 00 00 00 00 00 00 C0
FLASH_ERASE_REGION
包数据格式偏移 | 长度 | 字段名 | 说明 | |
---|---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 | |
8 | 4 | offset | 擦除起始偏移值 | |
12 | 4 | length | 需要擦除的区域大小 |
offset
及length
都需要 4K 对齐,即能被4096
整除。
报文示例:
C0 00 D1 08 00 00 00 00 00 00 00 00 00 00 00 10 00 C0
READ_FLASH_ID
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
报文示例:
C0 00 F3 00 00 00 00 00 00 C0
返回格式:
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 1 | direction | 响应包中固定为 0x01 |
1 | 1 | command | 与触发响应的命令包中的 command 字段保持一致 |
2 | 2 | size | data 字段的长度,此处为 0 |
4 | 4 | value | Flash ID,详见下文说明 |
返回报文示例:
C0 01 F3 02 00 0B 40 17 00 00 00 C0
以上述报文为例,Flash ID 为 0B4017
。根据 JEDEC 规范,该 ID 由 3 个字节组成,各字节含义如下:
偏移 | 示例 | 说明 |
---|---|---|
0 | 0B |
厂商代码 (Manufacturer ID),详见厂商数据手册 |
1 | 40 |
存储类型 (Memory Type),详见厂商数据手册 |
2 | 17 |
容量代码,计算方式为 2 << (ID[2] - 1) ,可算得示例中的 Flash 容量为 8192 字节即 8MB |
READ_CHIP_ID
包数据格式偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见命令包数据格式 |
报文示例:
C0 00 F4 00 00 00 00 00 00 C0
返回格式:
偏移 | 长度 | 字段名 | 说明 |
---|---|---|---|
0 | 8 | header | 协议头,详见响应包数据格式 |
8 | 1 | error | 0x00 表示成功,0x01 表示失败 |
9 | 1 | code | 响应状态码,参照响应状态码 |
10 | 8 | chip_id | 芯片 UUID |
返回报文示例:
C0 01 F4 0A 00 00 00 00 00 00 00 E2 EA 0D 10 14 E1 7C F9 C0
芯片 ID 约定以大写16进制字符串展示,如上述示例中的芯片 ID 为 E2EA0D1014E17CF9
。
请参照以下步骤令 CSK6 芯片进入 UART 启动模式
BOOT0
引脚输入高电平,对 BOOT1
引脚输入低电平;RESTN
引脚的输入低电平,使 CSK6 复位;延时一段时间后恢复为高电平,使 CSK6 运行,此时 CSK6 进入 UART 启动模式PA16
引脚会输出 4 Hz 方波,可用于确认 CSK6 是否处于 UART 启动模式(需注意连接到此引脚的外设是否会受到影响)SYNC
报文直至有报文响应固件烧录使用的串口引脚为:PA15 (UART2_RXD)、PA18 (UART2_TXD)。
请参照以下步骤修改传输波特率,以提升固件升级的速率
SET_BAUD
报文,检查响应报文SYNC
报文,直至有报文响应请参照以下步骤将代理程序传输给芯片,用于接收并烧录业务固件
请参照以下步骤烧录业务固件,完成固件更新
FLASH_BEGIN
、FLASH_DATA
(重复至发完)、FLASH_END
指令报文向芯片传输固件FLASH_MD5
指令校验所写入的数据是否一致每烧录完一个分区都要执行一次
FLASH_END
操作,再进行下一个分区的烧录,以确保数据完整落盘。
同理,FLASH_MD5
也需要在FLASH_END
之后执行。
所有 Flash 操作的
offset
都需要 4K 对齐,即能被4096
整除。
如果需要通过 CSK6 向 NAND 烧写数据,可参照一下步骤
NAND_INIT
初始化 NAND。该指令可携带 SDIO 引脚配置,也会返回 NAND 的区块数量和区块大小。执行后需要判断返回码,若错误码为 0xD0
,表示未检测到 NAND,或该 NAND 不受支持NAND_BEGIN
、NAND_DATA
(重复至发完)、NAND_END
指令报文向芯片传输数据,该过程的流程与 Flash 烧录相似NAND_MD5
指令校验所写入的数据是否一致每烧录完一个分区都要执行一次
NAND_END
操作,再进行下一个分区的烧录,以确保数据完整落盘。
同理,NAND_MD5
也需要在NAND_END
之后执行。
所有 NAND 操作的
offset
都需要 512 字节对齐,即能被512
整除。