跳转至

UART接入指南*

主控芯片/上位机与 GX8002 通过串口收发消息来实现事件,数据的交互。主控芯片/上位机作为主机设备(Master),GX8002 为从机设备(Slave)

串口对接有两种方式:

  • 第一种是 GX8002 每次唤醒都主动通过 UART 上报唤醒的事件

  • 第二种是 GX8002 每次唤醒先通过中断上报,然后等待对方通过 UART 查询获取唤醒事件

区分这两种方式,是考虑低功耗场景下,对方的 SOC 处于休眠状态,需要 GX8002 给个中断才能把 SOC 唤醒,然后等待 SOC 查询当前的唤醒事件。如果对方的 SOC 支持串口唤醒,或者该 SOC 不存在进入休眠的场景,那么推荐使用 GX8002 串口主动发送的模式。

1. 消息协议*

1.1 消息协议*

消息分为三种类型:请求(REQ),回复(RSP),通知(NTF)

1.2 默认串口参数*

  • baud:115200

  • data bit:8

  • parity:N

  • stop bit:1

1.3 消息格式*

消息包括 消息头消息体

1.3.1 消息头*

名称 长度(Byte) 说明
magic 4 魔数
cmd 2 命令
seq 1 消息序号
flags 1 消息标志
length 2 消息体长度
crc32 4 消息头校验
  • 魔数(magic):0x42 0x55 0x58 0x58

  • 命令(cmd):

bit位 名称 说明
0 ~ 7 NR 命令号(见命令说明
8 ~ 15 TYPE 消息类型:REQ(0x01),RSP(0x02),NTF(0x03)

REQ:主机向从机发起请求,需从机RSP响应
RSP:从机响应主机的请求
NTF:主机或从机向对方发送通知,不需要对方响应

  • 消息序号(seq):用于表示当前消息的序列,协议内部管理

  • 消息标志(flags):

bit位 名称 说明
0 B_CHECK 标识消息体是否带有crc32
1 ~ 7 Reserve 保留
  • 消息体长度(length):如果length为0,说明该消息无消息体;如果B_CHECK为1,包含消息体crc32的长度

  • 消息头crc32(crc32):消息头的校验信息,保证消息头的正确性

1.3.2 消息体*

消息体用于携带用户数据,由消息头中的length确定是否包含消息体

名称 长度(Byte) 说明
content 由消息头中的length和B_CHECK字段决定 用户数据
crc32 4 消息体crc32,由B_CHECK指定

2. 消息命令说明*

2.1 语音事件*

  • 魔数(magic):0x42 0x55 0x58 0x58

  • 消息:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x0C REQ(0x01) 0 0
从机 0x0C RSP(0x02) 1 6 (2字节ID + 4字节crc) EventID
从机 0x0C NTF(0x03) 1 6 (2字节ID + 4字节crc) EventID
  • EventID (同GX8002短指令ID):
ID 事件
100 主唤醒词
102 暂停播放
103 停止播放
104 播放音乐
105 增大音量
106 减小音量
112 播放上一首
113 播放下一首
114 接听电话
115 挂掉电话

注意

不同的固件,这个 EventID 值会不一样,请根据实际情况确认

  • 主机读取从机事件:

主机: 42 55 58 58 0c 01 00 00 00 00 ba 1d 5b 9d 
从机: 42 55 58 58 0c 02 00 01 06 00 db aa 63 8d 64 00 5c bc 48 40 
在具体方案中,可使用轮询或者响应外接GPIO中断的方式来读取事件

  • 从机上报事件:
从机: 42 55 58 58 0c 03 00 01 06 00 6b 83 03 b0 64 00 5c bc 48 40 
  • 消息结构示例图:

2.2 麦克风状态*

  • 魔数(magic):0x42 0x55 0x58 0x58

  • 消息:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x70 REQ(0x01) 0 0
从机 0x70 RSP(0x02) 1 6 (2字节状态码 + 4字节crc) 状态码
  • 状态码:
码值 说明
0 异常
1 正常
  • 查询示例:
主机: 42 55 58 58 70 01 01 00 00 00 65 b7 07 59
从机: 42 55 58 58 70 02 00 01 06 00 61 67 83 f1 01 00 be 23 c2 58

2.3 Gsensor状态*

  • 魔数(magic):0x42 0x55 0x58 0x58

  • 消息:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x71 REQ(0x01) 0 0
从机 0x71 RSP(0x02) 1 6 (2字节状态码 + 4字节crc) 状态码
  • 状态码:
码值 说明
0 异常
1 静止状态
2 运动状态
  • 查询示例:
主机: 42 55 58 58 71 01 01 00 00 00 c0 64 5b 92
从机: 42 55 58 58 71 02 00 01 06 00 c4 b4 df 3a 02 00 7d 70 ef 73

2.4 固件版本号*

  • 魔数(magic):0x42 0x55 0x58 0x58

  • 消息:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x02 REQ(0x01) 0 0
从机 0x02 RSP(0x02) 1 8 (4字节版本号 + 4字节crc) 版本号
  • 版本号:

4字节, 例如0x01 0x02 0x03 0x04, 版本号为V1.2.3.4

  • 查询示例:
主机: 42 55 58 58 02 01 01 00 00 00 af 1b ed 1f
从机: 42 55 58 58 02 02 00 01 08 00 25 e6 ea 29 01 00 00 00 79 b8 f8 99

2.5 开关Dmic功能*

  • 魔数(magic):0x42 0x55 0x58 0x58

  • 消息:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x72/0x73 REQ(0x01) 0 0
从机 0x72/0x73 RSP(0x02) 1 6 (2字节状态码 + 4字节crc) 状态码
  • 查询示例:
打开Dmic例子:
主机:42 55 58 58 72 01 00 00 00 00 0B 71 73 AC
从机:42 55 58 58 72 02 00 01 06 00 6A C6 4B BC 01 00 BE 23 C2 58
关闭Dmic例子:
主机: 42 55 58 58 73 01 00 00 00 00 AE A2 2F 67
从机:42 55 58 58 73 02 00 01 06 00 CF 15 17 77 01 00 BE 23 C2 58

2.6 串口录音*

  • 录音波特率:500000

  • 魔数(magic):0x58 0x58 0x55 0x42

  • 开始录音:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x0307 NTF(0x03) 0 16 录音配置: UART_RECORD_CONFIG
从机 0x0381 NTF(0x03) 0 16 录音配置: UART_RECORD_CONFIG
typedef struct {
    unsigned int baudrate;              // 0:default;others:Limited support
    unsigned int channel_num;           // 0or1: one channel;2: tow channel;others: Not support;
    unsigned int channel;               // bit_0:mic0;bit_1:mic1;bit_2:fft;bit_3:logfbank;bit_4:G-sensor
    unsigned int flow_ctrl_enable;      // 1:enable flow ctrl;0 disable flow ctrl
} UART_RECORD_CONFIG;
  • host发送录音设置到8002,8002判断录音设置无误则原样返回录音设置表示可以录音,否则忽略此条消息。

  • 示例(mic0):

host 58 58 55 42 07 03 00 00 10 00 6f 8c f6 5e 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
8002 58 58 55 42 81 03 00 00 10 00 aa 7b 1f 96 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00

  • 示例(G-sensor):

host 58 58 55 42 07 03 00 00 10 00 6f 8c f6 5e 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00
8002 58 58 55 42 81 03 00 00 10 00 aa 7b 1f 96 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00

  • 流控
命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x0384 NTF(0x03) 0 0
  • 开始录音消息中如果使能了流控,则认为其附带一次流控,即开始录音消息中的设置判断无误后8002就开始发送数据。

音G-sensor数据时不可以使用流控。

示例:58 58 55 42 84 03 01 00 00 00 2d 9f ac 34

  • 录音数据:
命令号 消息类型 B_CHECK 消息体长度 消息体内容
从机 0x0382 NTF(0x03) 0 一个录音周期对应的数据长度 一个录音周期对应数据

​ 一次流控发送一个录音周期的数据,即一个context中相应的数据

​ 录音G-sensor数据时不可以使用流控,此时录音周期随传感器数据量变化。

​ 这4个通道(mic0、mic1、fft、logfbank),使能了多个通道则按顺序依次发送。

​ G-sensor通道不可以和其他通道一起录音。

​ mic0、mic1通道的是pcm数据,16000采样率,16bit位宽。mic1在单麦模式不支持。

​ G-sensor通道数据是 3 维, 1600采样率, 16 bit位宽,即每个采样点 6 个字节。

  • 停止录音:
命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x0308 NTF(0x03) 0 0

收到停止录音后8002停止发送数据。

示例: 58 58 55 42 08 03 01 00 00 00 8e 4b de 5d

2.7 FEED模式*

  • FEED 模式用于 8002 接收 主机 通过串口发来的 logfbank 数据用于 kws。
  • 主机 处于 wakeup 时 8002 使用 主机 发来的数据 kws。
  • 主机 处于 sleep 时 8002 使用 mic 数据 kws。
  • 波特率:500000
  • 魔数(magic):0x58 0x58 0x55 0x42

  • 主机 发送 sleep 状态:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x0312 NTF(0x03) 0 0
  • 主机在进入 sleep 之前发送此条消息给 8002, 8002 收到后切换工作方式为从 audio in 拿 mic 数据进行 kws。

  • 8002 发送停止数据传输:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
8002 0x0316 NTF(0x03) 0 16 feature配置: UART_RECORD_CONFIG
  • 8002 在收到主机发来的 sleep状态后,切换工作状态完成后向主机发送此条消息。

  • 主机 发送 wakeup 状态:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
主机 0x0313 NTF(0x03) 0 0
  • 主机在 wakeup 后发送此条消息给 8002, 8002 收到后切换工作方式为从串口接收主机发来的 logfbank 数据进行 kws。

  • 开始数据传输:

命令号 消息类型 B_CHECK 消息体长度 消息体内容
8002 0x0314 NTF(0x03) 0 16 feature配置: UART_RECORD_CONFIG
主机 0x0317 NTF(0x03) 0 16 feature配置:配置: UART_RECORD_CONFIG
typedef struct {
    unsigned int frame_length;       // ms
    unsigned int sample_rate;        // default : 16000
    unsigned int frame_num_per_pack; // default : 4
    unsigned int version;            // 0x1
} UART_FEATURE_CONFIG;
  • 8002发送 feature 设置到主机,主机判断设置无误则原样返回 feature 设置表示可以传输数据,否则忽略此条消息。