当前位置:首页 > 学习资源 > 讲师博文 > 模拟I2C为什么要将GPIO端口设置为开漏输出?

模拟I2C为什么要将GPIO端口设置为开漏输出? 时间:2023-10-24      来源:华清远见

不知道大家有没有跟我遇到类似的问题:我在fs4412开发板上调试mup6050(六轴传感器)时,使用I2C通信协议,模拟I2C协议正确,但是一直读取数据失败,且伴随着开发板发热。最后发现造成该现象的原因是没有配置GPIO为开漏输出。

首先我们先简单回顾一下I2C通信总线:

I2C(集成电路总线),是由飞利浦(Philips)公司开发的一种简单、双向二线制同步串行总线。它只需要两根线(时间线和数据线)即可在连接于总线上的器件之间实现通信。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。

I2C信号的几个重要的概念:

初始状态(即空闲状态):SCL和SDA均被上拉电阻钳位在高电平的初始状态;

开始信号:当SCL为高电平的时候,SDA被拉低,此为开始信号,表明通讯开始;

终止信号:当SCL为高电平的时候,SDA被拉高,此为终止信号,表明本次通讯结束;

应答信号:当发送器向接收器发送完一个字节(8位)数据后,第9个时钟周期内,接收器必须给发送器一个应答信号,这样数据才算传输成功。高电平表非应答,低电平表应答。

根据I2C总线的物理特性,I2C总线内部使用的是漏极开路输出驱动器,这里的漏极开路输出就是我们说的开漏输出。因此特性SDA和SCL可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻使得初始状态为高电平。

开漏输出:开漏输出就是不输出电压,控制输出低电平时引脚接地,控制输出高电平时引脚既不输出高电平,也不输出低电平,为高阻态。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。

以MOS管为例:

N-MOS管:漏极接正极,源极接负极,栅极正电压时导电沟道建立;

P-MOS管:漏极接负极,源极接正极,栅极负电压时导电沟道建立。

因此在不接上拉电阻时:输出逻辑0,则N-MOS激活;输出逻辑1,P-MOS不会激活,不会输出高电平。 在接上拉电阻时:输出逻辑0,则N-MOS激活;

输出逻辑1,P-MOS激活,可以输出高电平。 也就是说开漏输出如果不接上拉电阻,是没有输出高电平的能力的。如果需要开漏输出有输出高电平的能力就需要接上拉电阻。

另外,在一些情况下(比如总线),多个GPIO口可能会连接在同一根线上,这样就存在某个GPIO输出高电平,但另一个GPIO输出低电平的情况。如果不是使用开漏输出,你会发现这个GPIO的VCC和另一个GPIO的GND接在了一起,会导致电路短路。而如果使用开漏输出,VCC和GND之间就多了个上拉电阻,这样就避免的短路,保证了电路安全。所以总线一般会使用开漏输出。     回到开头的那个问题,目前很多开发板是可以通过软件给GPIO端口配置上拉电阻的,我一开始使用I2C协议并没有将总线设置为开漏输出,导致数据读取失败,并且由于电路短路导致开发板发热。所以模拟I2C必须要将GPIO端口设置为开漏输出。

 

上一篇:classpath和path的作用

下一篇:NB IOT、LORA的通信距离对比分析

戳我查看嵌入式每月就业风云榜

点我了解华清远见高校学霸学习秘籍

猜你关心企业是如何评价华清学员的

干货分享
相关新闻
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2024 北京华清远见科技发展有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部