46065|93

400

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

<学习笔记>花点时间让你彻底搞懂I2C总线 [复制链接]

 

前言

经常在论坛上看到有网友在咨询I2C的问题,这里就I2C总线做一个给比较全面的总结,感兴趣的网友可以耐心的看下去,相信对你会有帮助。

 

1. 基础知识】

1.1. 关于口线电平

I2C总线中有2个口线,SDASCL。这两个口线对为OC输出。什么是OC呢?相对OC还有什么输出呢?

OC就是开漏输出(Open Collector)的简称,有时候也叫OD输出(Open-Drain),OD是对mos管而言,OC是对双极型管而言,在用法上没啥区别。

相对于OC输出,另一种输出叫推挽输出(Push-Pull),一般的MCU管脚输出可以设置这两种模式。这里分别介绍下这两种输出的不同点。

 

推挽输出 : 可以输出高、低电平连接数字器件,推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.

开漏输出 : 输出端相当于三极管的集电极未接任何电平, 要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)

 

对于MCU的开发者来讲,简单的这样理解就可以了。如果管脚设置成推挽输出模式,输出高时,IO口相当于VCC, 输出低时IO口相当于接地。如果管脚设置成开漏输出模式,输出高时,IO口的电平会和与其相连的口线进行与操作,如果都为高,才会被上拉拉成高电平,输出为低时,也相当于接地。

 

I2C总线要实现线与的功能,所以SDASCL口线都必须设置为开漏输出模式。我们使用MCU的硬件I2C接口时,口线会被自动设置成开漏。但有时候我们会使用IO口来模拟I2C总线,这个时候我们如何设置口线呢?

 

这里要分两种情况,如果MCU的口线支持开漏输出模式,则可以直接把SDASCL设置成开漏输出。例如Silicon C8051系列MCU,它的口线就支持开漏和推挽输出。如果MCU不支持开漏输出那怎么办呢?例如MSP430。在网上我们看到很多的例程代码都是直接设置IO口的高低电平,这样做其实是不太合理的。因为我们只满足了I2C总线在自己这端的时序要求。而没有考虑到连接在总线上的其他器件。如果总线上其他器件的电平和MCU输出的电平一致,这样做是没问题的,如果两边的电平不一致时,这样做就有一定风险造成IO的损坏。当你输出高时,相当于IO口连接到VCC,如果对方这是恰好输出的是低电平,那就相当于短路了。当然如果软件做的合理,是可以避免这样的事情的,但总线上的很多器件都不是由你能控制的,如何设计出更合理的软件来避免这样的问题发生呢?

 

对于不支持开漏输出MCU,我们最合理的做法是,当设置口线电平为高时,我们把口线设置成输入状态,然后利用口线上的上拉电阻来把口线拉高。这样即使是两边电平不一致时,也不会造成IO口的损坏。

 

。。。<未完待续>

最新回复

楼主,我用模拟i2c读取MPU6050,读一次数据要花100+毫秒,这是怎么回事呢?  详情 回复 发表于 2016-11-30 02:04
 
点赞 关注(13)

回复
举报

400

帖子

0

TA的资源

五彩晶圆(中级)

推荐
 

1.2. 关于总线口线

大家都知道I2C是由SDASCL两个口线组成的。这两个口线的高低电平组合、上升下降边沿组合就形成了总线的各种时序。这里我们先做一个枚举,看下两个口线能组合出什么样的时序出来。

 

 

上表中灰色部分不是I2C总线关心的,9,10分别被定义为I2CSTARTSTOP信号。

I2C数据总线SDA是在时钟为高时有效,在时钟SCL为高期间,SDA如果发生了电平变化就会终止或重启I2C中线,所以我们在数据传输过程中,要在SCL为低的时候去更改SDA的电平。

 

 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

板凳
 
恩。不错不错
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 
不错~
 
 
 

回复

2787

帖子

23

TA的资源

至上芯片

5
 
支持下,收藏了
 
个人签名我追求崇本务实,我追求完美第一!我选择低调做人,我选择高调做事!
 
 

回复

57

帖子

0

TA的资源

一粒金砂(高级)

6
 
好 好  太棒了  楼主更新呀   特期待
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主开题写的很好啊,期待继续更新~
 
 
 

回复

279

帖子

0

TA的资源

一粒金砂(中级)

8
 
期待继续更新~
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

9
 

1.3. 关于I2C总线的时序

    在上一节中我讲到了由SDA和SCL能形成的各种电平组合,那么这些组合如何在I2C总线上得到应用的呢?

    在这一节,我们一步一步的来分析I2C总线的逻辑时序。首先是I2C的START信号。

    START信号是在SCL位高电平时,SDA从高电平变成低电平。

    大家想一下为什么是这样设计呢?

     这个和I2C的多主性能有一定关系。因为I2C的总线是开漏输出的,总线上接上上拉电阻后,SCL和SDA就变成了高电平,这个时候挂接在总线上的任意一个I2C主机口可以把SDA拉低,即产生了一个START信号,挂接在总线上的其他I2C主机检测到这个信号后就不能去操作I2C总线了,否则会发生冲突。直到检测到一个STOP信号为止。

STOP的信号是在SCL口线为高时,SDA产生一个上升沿。STOP信号之后,I2C总线恢复到初始状态

 那么这两个时序如何在在我们软件中实现呢? 这里我以MSP430为例,探讨下如何合理的实现这样的代码. 首先,我们需要把SDA和SCL的口线都设置成输入模式(前面讲了为什么),当口线设置成输入模式时,PXOUT寄存器的值是用来设置口线是上拉还是下拉,PXOUT需要设置成上拉。(想一下为什么?)因为如果你设置成下拉的话,一般I2C的总线会接2个上拉电阻,就相当于总线上是图1的等效电路。

当我们设置为口线为输入时,口线的高电平就不会是VCC,而是一个分压后的电平。

[ 本帖最后由 Triton.zhang 于 2012-3-7 09:28 编辑 ]

图1.JPG (14.07 KB, 下载次数: 8)

图1.JPG

点评

很好!  详情 回复 发表于 2012-7-24 16:36
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
很详细,好资料!谢谢分享!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

11
 
好东西,正需要,谢谢分享
 
 
 

回复

670

帖子

0

TA的资源

一粒金砂(中级)

12
 

楼主是个好人·,签定完毕!!!

 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

13
 

回复 楼主 Triton.zhang 的帖子

楼主,你的描述中这一句我还是不懂,能详细讲讲吗?谢谢!

“对于不支持开漏输出MCU,我们最合理的做法是,当设置口线电平为高时,我们把口线设置成输入状态,然后利用口线上的上拉电阻来把口线拉高。这样即使是两边电平不一致时,也不会造成IO口的损坏”。
 
 
 

回复

272

帖子

0

TA的资源

一粒金砂(中级)

14
 
顶!!!!   不错。。。
 
 
 

回复

117

帖子

0

TA的资源

一粒金砂(中级)

15
 
不错哦 谢谢楼主分享
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

16
 
楼主好用心,前些天搞stm32的硬件I2C 头大,特地好好的看了下 Philips的I2C资料,比较详细。
 
 
 

回复

128

帖子

0

TA的资源

一粒金砂(高级)

17
 
期待继续更新~
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

18
 

回复 楼主 Triton.zhang 的帖子

楼主讲的很实用,却是在用IIC时发现了把端口置高电平损坏器件的问题,最后通过LZ的方法解决了问题。
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

19
 

回复 13楼 孙博 的帖子

简单说就是IIC总线上会连接多个器件。
在软件模拟IIC总线接口时:
假设通过P1.1,P1,2分别控制SCL,SDA
如果需要SDA传输一个高电平很多书上都是直接
P1DIR = BIT2;
P1OUT |=BIT2;
这么做当总线上其它从器件SDA也输出高电平相当于短路,会损坏器件。
正确做法是
SCL,SDA连接一个上拉电阻接VCC
然后
P1DIR  ~= BIT2 端口置输入状态相当于置高电平
P1DIR |= BIT2 端口置输出状态相当于置低电平

点评

P1DIR ~= BIT2 端口置输入状态相当于置高电平 P1DIR |= BIT2 端口置输出状态相当于置低电平 这个不太明白,能详细的解释一下吗  详情 回复 发表于 2012-11-20 15:35
我就是用的你说的这种方法。但是输入状态时,我没有使能上下拉电阻,与楼主说的有这点不一样。不知道会有什么影响。。。?  详情 回复 发表于 2012-8-5 08:13
 
 
 

回复

827

帖子

0

TA的资源

一粒金砂(中级)

20
 
不错,顶
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表