总线基础--IIC总线

欢迎转载,转载请注明出处。

前言

说到驱动开发,就不得不提总线;总线是设备间传递数据的桥梁,计算机将总线分为三类,即数据总线。地址总线和控制总线,也就是通常意义上所说的系统总线。一般都会将系统总线、内部总线和外部总线统称为计算机的三大总线。其中总线又有并行/串行、全双工/半双工/单工之分,这些准备单独作为一个章节来介绍,并通过这些,对总线做个总结和区分。

I2C总线

I2C总线是两线(SDA/SCL),半双工,串行、多主控接口标准,可以挂接多个设备,具有总线总裁机制。I2C总线由PHILIPS公司开发,用于连接微控制器及其外围设备。

  • 两线(SDA/SCL)
    一条数据线(SDA),用于传输数据;一条时钟线,用于产生时序。I2C总线在数据传输过程中,总共有三种信号,开始信号,结束信号和响应信号。
    1)开始信号:当SCL为高电平时,SDA从高电平跳变到低电平时,表示开始传送数据。
    2)结束信号:当SCL为高电平时,SDA从低电平跳变到高电平时,表示结束数据传输。
    3)响应信号:接收器在接受到8位数据后,在第9个时钟周期,拉低SDA电平,表示数据接收完成。

    I2C设备电路

大多数I2C设备,都如图中一样,SDA和SCL线上会接上拉电阻,这样总线在空闲状态时,两根线都保持高电平;通过改变两根线上的高低电平,就可以控制I2C的状态。
如下时序图可以看出,刚开始SDA和SCL都是高电平;当SCL为高电平时,SDA从高电平跳变到低电平时,就会产生START信号;从图中也能看出,结束信号发出后,SDA和SCL又都变回到初始状态,即高电平。

I2C时序图

I2C每次发送1个字节(8位)数据,因为I2C总线可以挂接多个设备,所以主机要选择需要通信的从机;挂接到I2C总线上的设备都有各自特定的地址;当主机通信时,会先发出地址信息,寻找I2C设备,当地址信息匹配后,从机会给主机一个应答信号,表示匹配成功,从而建立通信;否则主机会重新发送地址信息或直接停止请求通信;START信号过后,主机发送8位数据,前7位是从机地址,第8位是传输方向,表示需要进行的是读操作还是写操作(0表示写操作,1表示读操作),因为地址信息是7位,所以I2C总线可以挂接128个设备。

I2C时序图

当主机和从机通信建立成功后,就开始发送数据,从图中可以看出,SDA上的数据(0/1)总是在SCL为低电平时开始改变(见图中红线)在SCL为高电平时,SDA上的数据总是保持稳定(见图中蓝线)。这是因为从设备数据的采集,是在SCL为高电平期间进行的,所以要求SCL为高电平期间,SDA数据不变。在8位数据传输结束后(一个时钟周期传输一位数据),主机会释放对SDA线的控制;此时因为上拉电阻的存在,SDA线会变回高电平,在第9个时钟周期,从机会拉低SDA线的电平信号;当主机检测到SDA线上的电平被拉低时,表示从机接收数据完成。

下图是S3C2440的I2C总线时序,可以看到设备的读写操作,总是在START信号后,地址信息的第8位决定。
关于图中的7-bit地址和10-bit地址,参见7-bit, 8-bit, and 10-bit I2C Slave Addressing

S3C2440时序

  • 半双工
    首先解释一下全双工/半双工/单工的定义。
    1)全双工:即允许数据在两个方向同时传输;典型的,电话,我们在接电话的同时,也可以说话,数据接收和传输(听和说)互不影响,这就是全双工模式。
    2)半双工:也允许数据在两个方向传输,但与全双工不一样的是,两个方向的数据无法同时传输;同一时刻,只允许往一个方向传输数据。大多数的对讲机就是半双工模式的,拿对讲机的两个人,听和说,同一时刻只能有一个动作,听对方说话的时候,自己是无法说话的,同样自己说话的时候,对方也只能等你说完,他再说话。既可以接收数据也可以发送数据。
    3)单工:即数据只有一个传输方向,任何时候,要么只能接收数据,要么只能发送数据。最容易想到的设备就是BB机,我们看电影时,也经常有这样的桥段:当BB机响起时,演员会拿出BB机,看是谁发来的信息,然后再找电话亭,给对方回个电话。这里BB机就是工作于单工模式,只能接收信息,不能发送信息,需要给对方回应时,还得专门去寻找电话,给对方回应。

    根据上面的定义,I2C既可以发送数据也可以接收数据(从机地址的第8位是传输方向,0表示写操作,1表示读操作),但因为只有一根数据线SDA;所以同一时刻,只能进行一个操作,读和写无法同时进行,所以这里我们就可以知道,I2C工作于半双工模式。

  • 串行
    串行是区别于并行的一种数据传输方式,数据连成一串,一位一位的传输;就行羊肉串一样,我们都是一块一块的把肉咬下来(当然不排除天才,一次全咬下来/笑哭);并行当然就是数据可以一个或多个字节一起传输(这取决于设备的针脚),例如我们说I2C传输数据时,8位数据,按时钟周期一位一位的传输,传输完成后,在第9个时钟周期给应答信号。如果是并行传输,假设设备有8个针脚,那么这8位数据就可以在一个时钟周期内传输完成,I2C一位数据刚传输结束,这边8位数据就都完成了。
    讲到这里,也许你可能会有这样的感觉,串行设备一次只能传输一位数据,而并行却可以传输多位,那么并行设备肯定传输效率比串行设备高的多。从理论上来说,好像是这样,串行设备应该被并行设备取代,但实际上,目前很多的高速传输用的都是串行方式,正因为并行设备拥有多根导线,所以导致信号间很容易产生干扰,而且随着时钟频率的提高,干扰更明显;但这方面串行设备因为线少,干扰就很容易控制,所以现在串行传输反而比并行传输用的多。具体介绍大家可以参考为什么目前的串行传输比并行传输快

  • 多主控
    I2C是真正意义上的多主机总线,当两个或多个主机同时发起数据传输请求时,I2C可以通过冲突检测和仲裁机制来控制数据传输。
    总线仲裁是通过一个“线与”的逻辑来判断的,如下图,DATA1和DATA2分别表示主机2和主机2的信号,在同一时刻,主机1和主机2同时产生数据传输请求,在START信号后,主机1和主机2要传输的数据都与SDA数据线的数据一致,所以两个主机的数据都会被传输出去,在第二个时钟周期也一样,直到第三个时钟周期,主机1发送的时高电平信号,而主机2发送的是低电平信号,根据“线与”的逻辑,主机1和主机2进行“线与”过后,此时SDA上呈现应该是低电平信号,这就与主机1的信号相反,所以主机1就退出竞争,主机2获得总线控制,当总线空闲时,主机1会重启传输。

这里写图片描述

  • 可以挂结多个设备
    前面说到,主机开始数据传输时,会先发送需要建立通信的从机的地址,因为挂接到I2C上的从设备,都有各自的地址,所以主机可以根据地址信息,找到想要通信的I2C从设备,从这可以看出,I2C总线可以挂接多个设备。地址信息由7位数据表示,所以I2C最多可以挂结128个设备。

总结

到此I2C总线的基本定义就介绍差不多了,尽管I2C总线,所需线路少、干扰容易控制、支持多主机等优点;但仍然满足不了我们实际使用中的需求,所以也就有其他总线协议来替代,下篇将介绍同样功能强大的SPI总线。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值