GX8008串口通讯协议V2.0*
1. 概述*
本文档详细描述了,在国芯8008系列芯片,如何使用串口和外部设备进行交互。
交互包含基本的功能,如:唤醒消息,查询版本号,切换8008工作模式(例如进入通话状态),调节8008音量等等。另外,协议也可以扩充,方便在客户项目中自定义一些指令。
该文档主要针对如下使用串口交互的方案:
由于协议按照定义格式,发送方和接收方都需要解析,因此国芯提供了参考代码(C编写),包含了协议的接收解析和发送包装方法。客户只需要把相关代码移植到项目平台上,就可以直接使用了,无需关心协议的具体细节。
该参考例子可以在windows上或者ubuntu上编译,然后PC通过串口和我们的8008C开发板连接好。参考包里包含一个测试用的8008C固件。下面的章节会有具体的说明。
2. 协议内容*
-
通讯的原子单位为消息(message)
-
一个消息包括消息头(message-head)、消息体(message-body)
-
消息头的格式如下 :
名称 字节数 描述 magic 4 魔数 cmd 2 命令 seq 1 消息序列号 flags 1 消息标志 length 2 消息体长度 crc32 4 消息头crc32结果 -
魔数,标识一条消息的开始,固定为:0x42555858
-
命令(cmd), 用于标识一条消息。由以下属性组成
属性 bit位 描述 TYPE 15~8 命令类型 NR 7~0 命令号 TYPE:命令类型。说明命令的类型属性,类型有以下三种:
属性 值 描述 request(REQ) 0x1 请求:主机向从机发送、请求数据。需从机RSP响应 response(RSP) 0x2 响应:从机响应主机请求的数据 notify(NTF) 0x3 通知:主机或从机通知对方自己的状态。不需要对方响应(扩展) NR:命令号,标识命令序号。取值范围0-255
-
消息序列号(seq)用于表示当前消息的序列。取值范围0-255。协议内部管理,每发送一个request或notify,先对seq加1再使用,循环到255后,再从0开始。对于请求的响应,需要带上request对应的sequence。
-
消息标志(flags):
属性 bit位 描述 B_CHECK 0 标识消息体是否带有crc32 Reserve 1~7 保留 -
消息体长度(length), 用来传输消息体的实际长度。消息体长度 0到65535字节
-
消息头crc32结果(crc32), 用来传输消息头的校验信息,保证消息头的正确性
-
-
消息体格式如下
名称 字节数 描述 content 变长 命令携带的内容 body_crc32 4 消息体crc32结果,根据B_CHECK确定是否存在 -
消息采用超时重传机制。主机发送REQ,超时等待从机RSP。如果接收端收到错误消息,直接返回,不做处理
-
传输通道上的数据格式如下:
3. 命令定义*
主机:SOC (比如蓝牙SOC)
从机:GX8008/GX8008C
注意
如下描述会根据具体的项目随时增减
描述 | cmd | TYPE | flags | content | 方向 |
---|---|---|---|---|---|
获取从机固件版本号 | 0x0102 | REQ | 无 | 无 | 主机->从机 |
返回从机固件版本号 | 0x0202 | RSP | B_CHECK | 有 | 从机->主机 |
通知唤醒消息源 | 0x03a0 | NTF | 无 | 无 | 从机->主机 |
通知系统SOC工作状态 | 0x0301 | NTF | B_CHECK | 有 | 主机->从机 |
通知调节音量大小 | 0x0310 | NTF | B_CHECK | 有 | 主机->从机 |
通知从机心跳 | 0x0380 | NTF | 无 | 无 | 从机->主机 |
通知VAD开始 | 0x0385 | NTF | 无 | 无 | 从机->主机 |
通知VAD结束 | 0x0386 | NTF | 无 | 无 | 从机->主机 |
4. 参考移植*
下载参考例程:http://yun.nationalchip.com:10000/l/SFO4la
- 解压"wukong_8008C_uartV2.0_sample.zip"
- 使用国芯wukong开发板8008C,将内部的vsp.zip解压出,取vsp.bin固件烧录进去
- 使用串口线,接到开发板的UART0上,和PC的串口连接到一起,进行串口协议通讯。开发板的UART1输出调试信息
- UART0的波特率是115200,UART1的波特率是115200
- 如果要在windows上测试,需要安装GCC,本例子使用TDM-GCC,下载:https://jmeubank.github.io/tdm-gcc/
- 在windows上编译,进入代码目录(makefile的同级目录下),执行:mingw32-make windows。在ubuntu上编译,执行:make linux
- 编译生成sample.exe或者sample.elf,执行命令winodws:sample.exe COM5,执行命令ununtu:sudo ./sample.elf /dev/ttuUSB0。注意读取串口可能需要管理员权限。串口号请根据设备在机器上的实际为准
- 对开发板喊“小T小T”,可以看到唤醒消息和VAD消息被正确接收。看到如下打印,代表测试成功:
- 在sample上输入查询版本的命令 1,可以和开发板交互,获取到固件版本号
- 在协议的收发测试都成功的基础上,可以把协议代码移植集成到对应的平台上,串口底层的收和发部分需要自己去适配好,可以参考port.c
- 在平台实现好后,需要验证下串口持续和长时间工作收与发的稳定性。可以进行些压力测试,比如不断的发送查询版本号的命令,然后接收,压测一段时间,看看是否有异常。如果测试稳定,那么协议(驱动层)就算移植成功了。后续根据方案具体需求,扩充对应的命令与交互方式
5. 简单串口协议*
考虑到一种场景,仅仅只需要 GX8008 主动把指令消息通过串口上报给其它设备,而不需要接收。
因此,使用上面的 UART2.0 协议就比较复杂了。下面提供一种简单的协议。
-
波特率:115200
-
数据格式
-
同步头(Byte 0 Byte 1):长度两字节,固定为 0x55 0x55,是每次数据接收的开始字节
-
数据长度(Byte 2):长度一字节,计算从同步头开始计算包含同步,固定为 0x8
-
消息类型(Byte 3):长度一字节,指示后面的消息的类型,固定为 0x1
-
消息(Byte 4): 需要传输的内容,针对控制消息为1字节长度,比如 0x0 代表 “你好小乐”,0x1代表 “打开灯光”
-
BBC校验(Byte 5):长度一字节,消息与消息类型按位异或
-
(Byte 6 Byte 7):长度两字节,数据传输结束,固定为 0xAA 0xAA
-
例如 “你好小乐”:传输数据是 55 55 08 01 00 01 AA AA