我们都知道在I2C通信中,需要将scl和sda均配置成开漏输出模式,但是sda线中,主机如果是发送数据,那么为开漏输出理所应当,为什么从机也要配置成开漏输出模式,从机不应该为输入模式吗? 如果为开漏输出模式的话 怎么接受数据啊?
楼主理解是没有问题的
初始配置都是开漏输出模式
参照正点原子的代码,他的函数里有直接对寄存器进行操作的。里面有两行代码为直接通过寄存器操作设置 IO 口的
模式为输入还是输出,代码如下:
SDA设置为输入 #define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
SDA输出 #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
所以在需要接受字节的函数里,他就会有SDA_IN();发送字节的时候有SDA_OUT();
主机接收信号的时候就是输入模式。不要有任何疑问。你有这种误解,可能是某些代码封装的时候乱起名字造成的。
漏极开路(或集电极开路)
I2C 总线允许多主、多从的多设备并联在一起的共享总线,极大的简化了电路设计。
在多主、多从的双向数据传输中漏极开路(或集电极开路)是最简单便捷的实现方法。
漏极开路(或集电极开路)允许多路输出直接并联。
漏极开路(或集电极开路)输入输出的转换极为便捷。和C51单片机的 P 口类似,IO 要想变输入,先输出 1 就行