我想知道在通信期间何时在 I2C 寄存器中设置/清除标志。
例如(从机模式)、何时设置 AAS 标志? 它是在发送确认位之前还是在之后置位? 与重复起始相关的信息何时被清除?
如果您可以提供 涵盖尽可能多的标志的时序图、那将会很好
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.
我想知道在通信期间何时在 I2C 寄存器中设置/清除标志。
例如(从机模式)、何时设置 AAS 标志? 它是在发送确认位之前还是在之后置位? 与重复起始相关的信息何时被清除?
如果您可以提供 涵盖尽可能多的标志的时序图、那将会很好
尊敬的惠特尼:
我正在研究一些代码、 这些代码源自 SPRABJ6中提供的代码- TMS320F2803x 的 PMBus 通过 I2C 实现的软件。 该代码正在从模式下运行。
在'RWBYTE'和'RWWORD'情况下 、此代码监控 AAS 位以确定主器件何时对其寻址、然后决定是执行读取还是写入操作、在我看来、这一决策中存在错误机会。
下面是当主设备希望使用'RWBYTE'情况读取一个字节时我预见的事件序列。
起始位+从地址+写入位+ Ack
命令+确认
重复起始+从地址+读取位+ Ack
数据+ NACK +停止位
根据数据表、当从器件地址匹配时、AAS 位被置位。 它不定义何时发送、但我假设它是在发送 Ack 位时发生的。 AAS 位由重复起始位清零、当从器件地址再次匹配时、AAS 位将重新置位、最后由停止位清零。
SPRABJ6中提供的代码 等待 RRDY 位被置位、我认为这将在收到命令后发生。 命令被解码以确定正在执行一个 RWBYTE 操作。 然后、在查看 SDIR 标志之前、它会等待直到看到 AAS 位被置位、以确定是执行读取还是写入操作。
这是我看到可能出现问题的地方。 如果代码执行得足够快、则不会发生重复启动、也不会清除 AAS 位、因此仍将设置该位、 并假设正在执行写入操作。 如果代码执行速度较慢、则会发生重复启动、并且 AAS 位会被清零、当再次置位时、将检测到读取。
我可以看到解决此问题的唯一方法是清除 AAS 位(如果可能) 当它首次设置为接收到命令后、我可以等待设置的 AAS 位指示重复启动已执行且我们处于读取模式、或者设置的 RRDY 位指示字节已在写入之后 并且我们处于写入模式。
我是否遗漏了一些东西或担心是否有效。 数据表中指出 AAS 位为 R/W、因此我假设一旦设置、我将能够手动清除它。
因此、我建议的代码如下所示。
等待 AAS 位被置位、表示我已经被寻址。
清除 AAS 位、等待 RRDY 位置位、指示已接收到命令。
读取命令并解码。
等待 AAS 置位、表示正在执行重复启动和读取、或 RRDY 置位、表示已发送另一个字节且正在执行写入。
我可以检查 SDIR 位的读/写状态、但看不到 PMBus 协议是否被遵守。 (皮带和大括号我想)
回到我原来的帖子、我希望您现在了解为什么我想知道何时设置/清除 AAS 和其他位。
我希望您能提供一些进一步的指导、
斯图尔特。