器件型号: TM4C1294NCPDT
我正在使用通过 I2C 与 MMC5983MA 传感器连接的 TM4C1294XL 微控制器。
我发现了一个问题、即仅当我在以下步骤之间引入手动延迟时、I2C 通信才起作用:
-从地址 (SA) 传输
-寄存器地址 (RA) 写入
-数据读/写操作
如果没有这些延迟、通信就会失败、我也无法从传感器接收到有效数据。 但是、当使用 SysCtlDelay () 插入延迟时、通信工作可靠。
我知道,理想情况下,正确使用 I2CMasterBusy () 和状态检查应消除手动延迟的需要。
我想了解:
1.为什么在这种情况下需要手动延迟?
2.我的 I2C 事务序列是否有问题?
3、什么是正确的推荐方法来处理这个没有延迟?
下面是供参考的代码片段。
电线数量
I2CMasterSlaveAddrSet (I2C0_BASE、MMC5983_ADDR、FALSE);
I2CMasterDataPut (I2C0_BASE、0x09);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
while (I2CMasterBusy (I2C0_BASE)));
IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)
{
while (1);
}
I2CMasterDataPut (I2C0_BASE、0x01);//开始测量
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
while (I2CMasterBusy (I2C0_BASE)));
//可选:检查错误
IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)
{
while (1);//如果出错、请保持在这里
}
}
https://drive.google.com/file/d/1SFb-i1wKHQM6kTE2YP5nL9e-F5KKqrNK/view?usp=sharing
上述逻辑分析仪捕获结果显示了 无延迟的 I2C 通信
2.有延迟
I2CMasterSlaveAddrSet (I2C0_BASE、MMC5983_ADDR、FALSE);
SysCtlDelay (g_ui32SysClock / 30000);
I2CMasterDataPut (I2C0_BASE、0x09);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
while (I2CMasterBusy (I2C0_BASE)));
SysCtlDelay (g_ui32SysClock / 300000);
IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)
{
while (1);
}
I2CMasterDataPut (I2C0_BASE、0x01);//开始测量
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
while (I2CMasterBusy (I2C0_BASE)));
//可选:检查错误
IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)
{
while (1);//如果出错、请保持在这里
}
SysCtlDelay (g_ui32SysClock / 300000);
}
https://drive.google.com/file/d/1BxJGV5-OqalQTkzH1dwDCp8XjNQ1OMed/view?usp=sharing
上述逻辑分析仪捕获结果显示了 带延迟的 I2C 通信
观察结果:
-带延迟→正确的 I2C 事务(SA, RA,数据可见)
-无延迟→事务失败或不完整(SA 后跟无 RA 的数据)