跳转至

GX8008串口通讯协议V2.0*

1. 概述*

  本文档详细描述了,在国芯8008系列芯片,如何使用串口和外部设备进行交互。

  交互包含基本的功能,如:唤醒消息,查询版本号,切换8008工作模式(例如进入通话状态),调节8008音量等等。另外,协议也可以扩充,方便在客户项目中自定义一些指令。

  该文档主要针对如下使用串口交互的方案:

  由于协议按照定义格式,发送方和接收方都需要解析,因此国芯提供了参考代码(C编写),包含了协议的接收解析和发送包装方法。客户只需要把相关代码移植到项目平台上,就可以直接使用了,无需关心协议的具体细节。

  该参考例子可以在windows上或者ubuntu上编译,然后PC通过串口和我们的8008C开发板连接好。参考包里包含一个测试用的8008C固件。下面的章节会有具体的说明。

2. 协议内容*

  1. 通讯的原子单位为消息(message)

  2. 一个消息包括消息头(message-head)、消息体(message-body)

  3. 消息头的格式如下 :

    名称 字节数 描述
    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), 用来传输消息头的校验信息,保证消息头的正确性

  4. 消息体格式如下

    名称 字节数 描述
    content 变长 命令携带的内容
    body_crc32 4 消息体crc32结果,根据B_CHECK确定是否存在
  5. 消息采用超时重传机制。主机发送REQ,超时等待从机RSP。如果接收端收到错误消息,直接返回,不做处理

  6. 传输通道上的数据格式如下:

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

  1. 解压"wukong_8008C_uartV2.0_sample.zip"
  2. 使用国芯wukong开发板8008C,将内部的vsp.zip解压出,取vsp.bin固件烧录进去
  3. 使用串口线,接到开发板的UART0上,和PC的串口连接到一起,进行串口协议通讯。开发板的UART1输出调试信息
  4. UART0的波特率是115200,UART1的波特率是115200
  5. 如果要在windows上测试,需要安装GCC,本例子使用TDM-GCC,下载:https://jmeubank.github.io/tdm-gcc/
  6. 在windows上编译,进入代码目录(makefile的同级目录下),执行:mingw32-make windows。在ubuntu上编译,执行:make linux
  7. 编译生成sample.exe或者sample.elf,执行命令winodws:sample.exe COM5,执行命令ununtu:sudo ./sample.elf /dev/ttuUSB0。注意读取串口可能需要管理员权限。串口号请根据设备在机器上的实际为准
  8. 对开发板喊“小T小T”,可以看到唤醒消息和VAD消息被正确接收。看到如下打印,代表测试成功:
  9. 在sample上输入查询版本的命令 1,可以和开发板交互,获取到固件版本号
  10. 在协议的收发测试都成功的基础上,可以把协议代码移植集成到对应的平台上,串口底层的收和发部分需要自己去适配好,可以参考port.c
  11. 在平台实现好后,需要验证下串口持续和长时间工作收与发的稳定性。可以进行些压力测试,比如不断的发送查询版本号的命令,然后接收,压测一段时间,看看是否有异常。如果测试稳定,那么协议(驱动层)就算移植成功了。后续根据方案具体需求,扩充对应的命令与交互方式

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