CI14LP IIC协议¶
1、协议简介¶
IIC通讯协议用于CI14LP语音模块与外部主控MCU(以下称master)之间的识别结果传递与播报控制。CI14LP作为IIC slave(7位设备地址0x64)挂载在master的IIC总线上,master通过读写”寄存器”的方式获取识别结果(命令词ID/语义ID)或下发播放指令。协议由 components\msg_com\i2c_protocol_module.c 实现。
协议参数:
- 通讯角色:CI14LP为slave,7位设备地址
0x64 - 使用外设:IIC0(中断方式,
iic_slave_interrupt_init(IIC0, 100, 0x64, SHORT_TIME_OUT)) - 传输速度:100 kHz(
I2C_PROTOCOL_SPEED,可配置) - 协议模式:命令词ID模式(
IIC_PROTOCOL_CMD_ID默认开启);语义ID模式(IIC_PROTOCOL_SEC_ID默认关闭) - 数据尾:0x5A
- 校验:累加和(寄存器地址累加数据各字节)
开启方式: 在 user_config.h 中配置:
#define USE_IIC_PROTOCOL 1 /* 使能IIC通信协议 */
#define I2C_PROTOCOL_SPEED 100 /* IIC传输速度kHz */
2、协议模式与寄存器定义¶
2.1 命令词ID模式(默认开启)¶
| 寄存器 | 值 | 说明 |
|---|---|---|
| I2C_REG_CMDID | 0x02 | master请求得到命令词ID的寄存器地址 |
| I2C_REG_PLAY_CMDID | 0x03 | master用命令词ID播放Audio的寄存器地址 |
2.2 语义ID模式(默认关闭,置1开启)¶
| 寄存器 | 值 | 说明 |
|---|---|---|
| I2C_REG_SECID | 0x04 | master请求得到语义ID的寄存器地址 |
| I2C_REG_PLAY_SECID | 0x05 | master用语义ID播放Audio的寄存器地址 |
3、数据帧格式¶
3.1 命令词ID数据帧(i2c_cmdid_msg_t,#pragma pack(1))¶
| 字段 | 类型 | 说明 |
|---|---|---|
| reg | uint8_t | 寄存器地址 |
| cmd_id | uint8_t | 命令词ID(8位) |
| check_sum | uint8_t | 校验和:reg累加cmd_id |
| end | uint8_t | 数据尾:0x5A |
- 识别结果上报:CI14LP识别到命令词后(含唤醒词,唤醒词命令词ID为
IIC_WAKEUP_WORD_CMDID= 0x01),将cmd_id + check_sum + end缓存在发送数据包中(IIC_SEND_CMDID_LEN= 3字节),master读寄存器0x02时由slave中断回调自动返回。 - 播报控制:master向寄存器0x03写入4字节数据(
IIC_RECV_CMDID_LEN= 4:reg + cmd_id + check_sum + end),CI14LP解析后播放对应命令词的提示音。
3.2 语义ID数据帧(i2c_secid_msg_t,#pragma pack(1))¶
| 字段 | 类型 | 说明 |
|---|---|---|
| reg | uint8_t | 寄存器地址 |
| sec_id[4] | uint8_t[4] | 语义ID(32位,默认唤醒词语义ID IIC_WAKEUP_WORD_SECID = 0x01E05501) |
| check_sum | uint8_t | 校验和:reg累加语义ID各个字节 |
| end | uint8_t | 数据尾:0x5A |
- 识别结果上报:
IIC_SEND_SECID_LEN= 6字节(sec_id[4] + check_sum + end)。 - 播报控制:master写入7字节数据(
IIC_RECV_SECID_LEN= 7)。
3.3 接收状态机¶
slave接收master数据时按状态机逐字节解析(i2c_recv_status):
| 状态 | 值 | 说明 |
|---|---|---|
| I2C_RECV_STATUS_REG | 0x01 | 接收寄存器地址 |
| I2C_RECV_STATUS_CMDID | 0x02 | 接收命令词ID |
| I2C_RECV_STATUS_SECID | 0x03 | 接收语义ID |
| I2C_RECV_STATUS_CHECK_SUM | 0x04 | 接收校验和 |
| I2C_RECV_STATUS_END | 0x05 | 接收数据尾 |
任一环节校验失败都会回到 I2C_RECV_STATUS_REG 状态重新同步;收到正确数据尾后清空发送缓存,完成一次交互。
4、API¶
| 函数名 | 描述 |
|---|---|
| i2c_communicate_init | IIC协议初始化(slave模式、中断注册、设备地址0x64) |
| i2c_product_send_msg | 识别到命令词后生成本次识别结果数据包(供master读取) |
| i2c_send_data | slave发送回调中,向master返回缓存数据 |
| i2c_recv_cmdid_packet | slave逐字节接收命令词ID数据包 |
| i2c_recv_secid_packet | slave逐字节接收语义ID数据包 |
| userapp_deal_i2c_msg | 应用层处理IIC消息(解析master下发的播放指令) |
| i2c_sleep_deal | 退出唤醒后清除发送给master的数据包 |
5、使用示例¶
1) master读取识别结果(命令词ID模式):
master发送(写):0x64(W) + 0x02 //指向命令词ID寄存器
master发送(读):0x64(R) + cmd_id + checksum + 0x5A
2) master控制CI14LP播放提示音(命令词ID模式):
master发送(写):0x64(W) + 0x03 + cmd_id + checksum + 0x5A
6、注意事项¶
- IIC协议与串口协议共用命令词信息,唤醒词的命令词ID固定为0x01,主控可直接据此判断进入唤醒状态。
- 若需要使用语义ID模式,需将
IIC_PROTOCOL_SEC_ID置1并重新编译,此时命令词ID模式与语义ID模式共用同一套接收状态机。 - 协议默认关闭打印(
IIC_PROTOCOL_DEBUG= 0),调试时可置1观察收发数据。