您好、先生、
我们正在开发基于 CC2541的产品、该产品具有通过 I2C 总线连接的多个传感器(例如 sensorTag 参考设计)。 CC2541 I2C 充当主器件、而传感器充当 I2C 从器件。 BLE Stack 版本是 BLE-CC254x-1.4.1.43908、我们使用 hal_sensor 驱动程序代码。 问题是外设传感器的寄存器读取需要一个 I2C 重新启动信号 、但是 在 HalSensorReadReg 中调用的 HalI2CWrite 会在末尾生成一个 I2C 停止、从而完全清除传感器 SoC 的状态。 我们已经尝试在 HalI2CWrite 末尾注释 I2C_STOP。 但这会导致 HalI2CRead 中的下一个状态(I2C_Start)错误。
尝试进行低级调试,在 HalI2CWrite (不带 I2C_STOP )之后,I2C (I2CSTAT)处于0x28 (mstDataAckW)状态。 根据 CC254X 用户指南的表20-3、在0x28状态下 、下一状态可以重复启动。 但我们发送 I2C_START 无法驱动状态机进入0x10 (mstRepStart)状态。 它保持在0x28状态下。 如果我们在总线上捕获信号、则会发出另一个具有读取标志的从器件地址、而不是启动信号。
那么,您能帮助解释一下吗?
通过 逻辑分析仪在 I2C 上添加 i2c 消息格式和信号:
以上是 根据器件规格读取寄存器所需的 I2C 消息格式。 我们可以发现需要 I2C 重新启动信号。
上面是来自另一个基于 cortex-M3的 MCU i2c 的 I2C 信号、用于读取器件。 器件从地址为0x4c,寄存器地址为0x18。 结果值为0x71。
上面是带有 HalSensorReadReg 的信号、它将在寄存器地址 ACK 后生成一个停止信号、然后在 I2C 地址后生成另一个开始信号进行读取。 STOP 会导致寄存器值读出为0x00。
上面是 带有 HalSensorReadReg 的信号,但是 HalI2CWrite()中的 I2C_Stop()被禁用。 确认寄存器地址后 ,不会生成下一个开始。 而是发送从机写入地址和读取地址。



