一、I2C概述
I2C是Philips开发出来的一种通信协议,全称Inter-Integrated Circuit。
I2C通信的时候只需要两根线,一根时钟线(SCL),一根双向数据线(SDA)。因为特别能节省资源,I2C获得了很广泛的应用,比如单片机教程中最常作为例程的串行时钟DS1307,EEPROM等。
I2C有三种速率模式,标准模式下100Kbps,快速模式下400Kbps,高速模式下3.4MKbps。
二、术语
在使用I2C的过程中,以下术语频繁使用,所以集中说明:
<1>主机/从机。主机是控制时钟并决定何时发送、接收的设备;从机是相对主机而言被主机寻址的设备。
<2>开始信号/结束信号/应答。I2C通信中的三种最重要的控制信号。在开始信号产生后可以进行通信,在结束信号到来后停止通信;应答信号用于表示数据被接收以判断通信是否成功。
<3>时序。操作运行的时间顺序。更形象的,可以认为时序规定了信号电平何时高、何时低的问题。
<4>寻址。寻址就是定位,在多从机情况下,给每个从机一个唯一的地址,主机通过这个地址选定进行通信的从机。
三、I2C电路设计的几个考虑点
A)I2C总线采用了开漏设计,器件本身不能主动输出高电平,因此需要上拉电阻(pullup resistor),并且是必须的!上拉电阻(Rp)的阻值一般不低于1KΩ,也不高于10KΩ。总线上挂的器件越多,选用电阻值越小。一般设计的时候可以先使用4.7KΩ,然后根据实测波形进行调整。
B)I2C能寻址的从机设备和<1>寻址方式有关。其中,7位寻址可以最多128个;10位寻址最多可以1024个。<2>也和寄生电容有关。标准要求总线容性负载最大不超过470pF。
C)标准还定义了串连在SDA和SCL上的电阻Rs,这个小电阻用来抑制总线上的干扰脉冲进入从设备,提高通信可靠性。一般的,Rs可以选择为100~200Ω,具体值可以类比Rp的选择方法进行试探确定。还应指出,这个电阻并不是必须的,如果已知通信环境良好,这个电阻可以不用考虑。
四、I2C的时序
起始条件:SCL高电平时,SDA产生从高电平到低电平的跳变。
停止条件:SCL高电平时,SDA产生从低电平到高电平的跳变。
起始条件产生之前,总线处于空闲状态;起始之后,总线进入忙状态。
因为SCL高电平时,SDA的任意跳变都是表示控制的,所以要求数据传输的情况下,在SCL高电平的时候,数据线必须保持稳定;只能在SCL低的时候才可以改变SDA信号。图示如下:
图 若为数据传输,SDA在SCL为高时必须保持稳定
图
起始、停止和重复起始(多字节传输,与普通起始无异)
五、AVR的TWI
聪明的Atmel开发了(还是抄袭?)完全兼容I2C的协议,为了避免交给Philips专利费,自己起名字叫TWI(Two Wire Interface)
精髓一句话:AVR的TWI接口是面向字节的和基于中断的。