i²C总线仲裁主要遵循三个机制:
- “线与”
多主机时,总线具有“线与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。
- SDA回读
总线被启动后,多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,就会继续占用总线。
- 低电平优先
由于线与的存在,当多主机发送时,谁先发送低电平谁就会掌握对总线的控制权。
问题1:如果主机1正在传输数据还没完成的时候,主机2也启动总线传输会怎么样?
在STM32F1的i²C外设上有状态寄存器。软件在启动总线前先判断总线忙标志。
问题2:SCLK有回读机制吗,主机1和主机2同时启动总线会怎么样?
应该是没有回读机制。但是有其他方法检测。例如:在STM32F1的i²C外设上有主模式时钟仲裁丢失标志,可配置仲裁丢失中断。
问题3:如果主机1和主机2同时启动了总线,然后开始传输各自的数据,会怎么样?
对于STM32F1应该会产生仲裁丢失标志。假设主控器1要发送的数据DATA1为“101 ……”;主控器2要发送的数据DATA2为“1001 ……”总线被启动后,因为有SDA回读机制,两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,在前3位数据的时候下总线还是得不到仲裁。当主控器1发送第3位数据“1”时(主控器2发送“0” ),由于“线与”的结果SDA上的电平为“0”,这样主控器1就会测到一个与自己发送的不相符的“0”电平。这时主控器1只好放弃对总线的控制权;因此主控器2就成为总线的唯一主宰者。 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
评论记录:
回复评论: