一、I2C总线
1-1、现象1(210917):
? ? ? 如下图1,液晶驱动芯片I2C接口。LCD_SDA与LCD_SCL分别与单片机IO口相连,单片机的I2C采用IO口模拟方式,读/写操作速度213kHz左右。单片机I对液晶驱动芯片进行写操作时,当单片机LCD_SDA配置为开漏输出,LCD_SCL配置为开漏输出,写操作波形如图2;当单片机LCD_SDA配置为开漏输出,LCD_SCL配置为推挽输出,写操作波形如图3。图2的SCL波形相较于图3质量较差。
图1
图2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图3
1-2、笔记1:
开漏输出的作用:
1、防止短路。I2C总线,多个GPIO口可能连接在同一根线上(多个主设备与多个从设备),存在某个GPIO输出高电平,另一个GPIO输出低电平的情况。如果使用推挽输出,存在一个GPIO的VCC和另一个GPIO的GND接在了一起,也就是短路了(主设备之间)。如果换成开漏输出,VCC和GND多了个上拉电阻,这样电路就是安全的,所以总线一般会使用开漏输出。
2、线与。实现多个主设备抢占总线时的仲裁。IIC只有两根线(SCL和SDA),怎么判断哪个主设备占用总线(当然是先来后到了)。假设主设备A需要启动IIC,他需要在SCL高电平时,将SDA由高电平转换为低电平作为启动信号。主设备A在把SDA拉高后,它需要再检查一下SDA的电平。
????????a. SDA是高电平,说明主设备A可以占用总线,然后主设备A将SDA拉低,开始通信; ????????b. SDA是低电平,说明有人已经捷足先登了,主设备A不能占用总线,结束通信。 为什么? 因为线与。如果主设备A拉高SDA时,已经有其他主设备将SDA拉低了。由于 1 & 0 = 0 那么主设备A在检查SDA电平时,会发现不是高电平,而是低电平。说明其他主设备抢占总线的时间比它早,主设备A只能放弃占用总线。如果是高电平,则可以占用。
———————————————— 版权声明:本文为CSDN博主「梅雪殇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/yx1302317313/article/details/89497998
|