最近,我正在使用IIC通信协议来调整ICM20602模块(六轴陀螺仪和加速度计),并且遇到了困扰我很长时间的问题。
IIC协议是正确的,但读取始终失败。
最后,发现GPIO未配置为漏极开路输出。
推挽输出和漏极开路输出推挽输出:输出逻辑0,然后激活N-MOS;输出逻辑1,然后激活P-MOS。
开漏输出:当未连接上拉电阻时,输出逻辑0,然后激活N-MOS;输出逻辑1,P-MOS不会激活,也不会输出高电平。
连接上拉电阻后,输出逻辑为0,N-MOS被激活;反之,则为0。
输出逻辑1,P-MOS被激活,并且可以输出高电平。
也就是说,如果漏极开路输出未连接至上拉电阻,则无法输出高电平。
如果需要漏极开路输出以具有输出高电平的能力,则需要连接一个上拉电阻。
目前,许多单芯片GPIO可以通过软件配置上拉电阻。
左图是开漏输出(连接到上拉电阻),右图是推挽输出开漏输出的功能可以防止短路:在某些情况下(例如总线),多个GPIO端口可能连接到同一条线上,并且存在一个GPIO输出高电平而另一个GPIO输出低电平的情况。
如果使用推挽输出,您会发现此GPIO的VCC和另一个GPIO的GND连接在一起,这是短路的(冷却器)。
如果切换到漏极开路输出怎么办? VCC和GND有一个额外的电阻,因此电路是安全的。
因此,总线通常使用漏极开路输出。
连线和:漏极开路输出还可以实现连线和(自百度),减少“与”门,简化电路。
为什么IIC使用开漏输出并在其上?上拉电阻IIC协议在同一总线上支持多个主设备和多个从设备。
如果使用推挽输出而不是漏极开路输出,则主设备之间将发生短路。
至于为什么需要上拉电阻,这是因为IIC通信需要具有输出高电平的能力。
为了在多个主机占用总线时实现仲裁。
IIC只有两条线(SCL和SDA),如何确定哪个主设备占用总线(当然,先到先得)。
假设主设备A需要启动IIC。
当SCL为高电平时,它需要将SDA从高电平转换为低电平作为起始信号。
主机A将SDA拉高后,需要再次检查SDA电平。
为什么?因为行和。
如果主设备A将SDA拉高,则其他主设备将SDA拉低。
自1& amp; 0 = 0,当检查SDA级别时,主设备A将发现SDA级别不高。
这是低水平。
这意味着其他主设备要比总线设备抢占先机,而主设备A只能放弃占用总线。
如果级别较高,则可以将其占用。
这是IIC通信中漏极开路输出的另一功能。
SDA为高电平,表明主设备A可以占用总线,然后主设备A将SDA拉低以开始通信。
SDA为低,表明有人已经先登录,并且主设备A无法占用总线并结束通信。
因此,要模拟IIC,必须将GPIO端口设置为漏极开路输出,并添加一个上拉电阻。
(硬件IIC将自动配置为漏极开路输出)。
来源:CSDN,链接:梅学尚免责声明:本文内容经21ic授权后发表,版权归原作者所有。
该平台仅提供信息存储服务。
本文仅代表作者的个人观点,并不代表该平台的立场。
如有任何疑问,请与我们联系,谢谢!