跳转至

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观察收发数据。