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
- 从机上报事件:
从机: 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 设置表示可以传输数据,否则忽略此条消息。