主题中讨论的其他器件:BQ34Z100
我们有一个在连接调试器并在 CCS 中执行时工作良好的应用程序。 从闪存执行10次中的3次时、应用程序也可以在没有调试器的情况下工作。 我们的 F28069通过 I2CA 模块从 BQ34z100电量监测计中检索数据。 首先、将 BQ 的地址放置在 I2C 总线上 、然后放置相关的数据寄存器。
当从闪存执行时、在第二个时钟高电平转换后、模块将时钟线保持为高电平、而不会返回到完成将寄存器地址放在总线上的操作。
从 RAM 执行时从未发生过这种情况。
下面是从 RAM 执行和闪存执行之间的屏幕截图。
在 RAM 下正常运行
从闪存执行时的操作
请注意、捕获右侧的数据寄存器地址只有2个时钟、并且保持高电平的时间超过100ms、这是不可接受的。
此外、 由于 BQ 之外的其他器件也使用 I2C 模块进行通信、因此 I2C 模块由以下器件调用。、
uint16 get_I2C_data (struct I2C_MSG_Xcvr * I2C_Config_Msg、uint16 * PTR_I2C_st填 充)
其中 I2C_Config_Msg 指向配置模块的结构–器件地址(buste 有多个器件)、读取/写入、字节的首选方式等 ptR_I2C_填 充 指针只是来自 I2C 寄存器的接收数据。
I2caRegs.I2CSAR = tempaddr;
I2caRegs.I2CCNT = I2C_Config_Msg->NumOfBytesTX;
I2caRegs.I2CMDR.ALL = 0x2E20; //开始条件、主发送器、7位地址、自由运行数据模式
正在等待数据的循环内部... 这是 I2C 模块停止计时数据。
I2caRegs.I2CDXR =*(I2C_Config_Msg->MsgBufferTX+I);
while (!(I2cRegs.I2CSTR.bit.XRDY)&&!(CPU_Timer_Status.PTO_Flags = TIME_OUT_FLAG))
此外、我们还验证了由于在2K 的堆栈末尾写入了一些预定义符号、我们没有堆栈溢出。
除了这个 I2C 问题、我们的应用中的所有其他功能都可以正常工作–SPI、UART、ADC、中断、CPU 计时器、 等等
什么会导致 I2C 模块停止移动数据? 我们可以在哪里以及如何继续查找此模块故障的路径原因?
如果能在这方面提供任何帮助,将不胜感激。 提前非常感谢!
b/r
Matt