我尝试了 MAP_I2C_masterSendSingleByte ()和 MAP_I2C_masterReceiveSingleByte (),但两者之间有一个停止位置,我更喜欢使用中断例程,该例程可以捕获 NACK 状态。
我想监控 SCL 和 SDA 线路卡在低电平状态、在哪里可以从寄存器中找到线路状态?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我尝试了 MAP_I2C_masterSendSingleByte ()和 MAP_I2C_masterReceiveSingleByte (),但两者之间有一个停止位置,我更喜欢使用中断例程,该例程可以捕获 NACK 状态。
我想监控 SCL 和 SDA 线路卡在低电平状态、在哪里可以从寄存器中找到线路状态?
您好!
我对这种情况进行了一些测试、并发现了一些注意事项。
尝试的事务是主机 TX 1字节、重新启动、主机 RX 1字节。
首先、就主器件 TX 而言、您有两个可用的标志、一个是发送开始+地址、另一个是 TXIFG。
关于 TXIFG 需要注意的一点是、当字节在总线上传输时、它不会被置位。
相反、当数据字节从 TXBUF 移动到发送移位寄存器准备发出时、TXIFG 被置位。
这意味着在 TXIFG 被置位后、在实际数据字节被发送前、我们仍然有9个 I2C 时钟。
如果 I2C 以100KHz 运行并且 CPU 以3MHz (默认值)运行,则这大约是300个 CPU 周期。
应用程序需要在发送重新启动前延迟这300个周期、否则事务可能会停止或导致停止。
为了保持这个时序紧张、在我的示例中、我使用了一个没有中断的内联延迟。
但是、也可以启用 TXIFG、在 ISR 中延迟300个周期、然后发送重启。
我认为这不可取、因为 ISR 可能会被阻止。
其次、当涉及一个字节的 RX 时、API "Masterreceivesinglebyte"似乎存在时序问题。
我也无法使用此 API 创建成功的一个字节读取。
但是、我通过使用直接寄存器访问代码并更改序列来实现此目的。
我猜是因为 I2C 事务/状态机速度慢于 MCLK 会导致这种情况。
由于我的示例可以正常工作、成功传输、然后接收一个字节、因此我已将其附加到该帖子。
我还针对 API 提交了一个错误、如果有进一步的更新、我将返回此处发布。
我将此主题标记为已解决、如果您有其他问题、请随时告知我。
PS:测试设置为2个 MSP432 LP,一个作为主设备,另一个作为从设备。
此致、
Priya