I2C协议简单分析
一、什么是I2C协议
I2C协议是单片机与其它芯片常用的通讯协议,只需要两根线,号称最简单的串行通信协议,所以很好使用。
二、I2C协议的特点
1、只需要两条线路,一条串行数据线SDA,一条串行时钟线SCL;
2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主发送器或主机接收器;
3、它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏;
4、串行的8位双向数据传输位速率在标准模式下可达100kbit/s快速模式下可达 400kbit/s高速模式下可达4Mbit/s;
5、片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整;
6、连接到相同总线的IC数量只受到总线的最大电容400pF限制。
三、I2C术语的定义
四、I2C协议总线信号时序分析
在I2C总线通信的过程中,参与通信的双方 互相之间所传输的信息种类归纳如下。
主控器向被控器发送的信息种类有:启动信号、停止信号、7位地址码、读/写控制位、数据字节、重启动信号、应答信号、时钟脉冲等。
被控器向主控器发送的信息种类有:应答信号、数据字节、时钟低电平。
4.1 数据的有效性
SDA 线上的数据必须在时钟的高电平周期保持稳定;数据线的高或低电平状态只有在 SCL线的时钟信号是低电平时才能改变。
4.2 起始和停止条件
当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件;
当SCL线是高电平时,SDA线由低电平向高电平切换,这个情况表示停止条件。
4.3 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高。
4.4 数据传输与应答信号
发送到SDA线上的数据必须是8位的。每次传输可以发送的数据不受限制。每个字节后必须在时钟的第9个脉冲期间释放数据总线(SDA为高),由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。
4.5 地址格式
在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向,0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。
地址的分配方法有两种:
1、含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突;
2、不含CPU的非智能器件,由厂家在器件内部固化,不可改变。
五、I2C通讯过程
5.1 写通讯过程
1、主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2、发送一个地址字节(包括7位地址码和一位R/W);
3、当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4、主控收到ACK后开始发送第一个数据字节;
5、被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
6、主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线。
5.2 读通讯过程
1、主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2、发送一个地址字节(包括7位地址码和一位R/W);
3、当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK);
4、主控收到ACK后释放数据总线,开始接收第一个数据字节;
5、主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束;
6、主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线。
六、I2C总线应用的问题
6.1 上拉电阻阻值的确定
由于I2C接口采用Open Drain机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须的。
RP不宜过小,一般不低于1kΩ
一般IO端口的驱动能力在2mA~4mA量级。如果RP阻值过小,VDD灌入端口的电流将较大,这导致端口输出的低电平值增大(I2C 协议规定,端口输出低电平的最高允许值为0.4V);如果灌入端口的电流过大,还可能损坏端口。故通常上拉电阻应选取不低于1kΩ的电阻(当VDD=3V 时,灌入电流不超过3mA)。
RP 不宜过大,一般不高于10kΩ
由于端口输出高电平是通过RP实现的,线上电平从低到高变化时,电源通过RP对线上负载电容CL充电,这需要一定的时间,即上升时间。端口信号的上升时间可近似用充电时间常数RPCL乘积表示。
信号线负载电容(对地)由多方面组成,包括器件引脚、PCB 信号线、连接器等。如果信号线上挂有多个器件,负载电容也会增大。比如总线规定,对于的400kbps 速率应用,信号上升时间应小于300ns;假设线上CL为20pF,可计算出对应的RP值为15kΩ。
如果RC充电时间常数过大,将使得信号上升沿变化缓慢,达不到数据传输的要求。因此一般应用中选取的都是几kΩ量级的上拉电阻,比如都选取4k7 的电阻。
小阻值的RP电阻增大了端口Sink电流,故在可能的情况下,RP取值应稍大一点,以减少耗电。另外,通产情况下,SDA,SCL两条线上的上拉电阻取值是一致的,并上拉到同一电源上。
6.2 软件模式I2C时序
由于一般的I2C应用速率并不高(400kbps),使用处理器的IO 口模拟I2C波形,完全可以胜任(处理器一般担任Master,占有I2C通信的控制权,无需担心随机的I2C通信服务中断其他任务的执行)。
处理器分配给I2C任务的IO口,要求可以输出高低电平,还能配置为输入端口。处理器根据总线规范以及从设备的时序要求,利用2 条IO信号线,模拟I2C接口时序波形,进行I2C通信。
处理器发送数据时,通过IO口输出高电平,上升时间基本与外部上来电阻阻值无关,且比用外部上拉电阻上拉到高电平快很多。处理器在接受数据时,即便上拉电阻阻值选的大一些,从设备输出数据的波形上升沿缓慢,但由于处理器使用软件采样的而非硬件采样,因此,对数据传输的结果并不影响。也就是说,使用IO口模拟I2C时序时,上拉电阻阻值可以适当选的大一些。
需要指出的是,使用软件模拟最多只能完成单Master的应用,对于多Master 应用,由于需要进行总线控制权的仲裁管理,使用软件模拟的方法很难完成。
I2C 总线空闲的时候,两条信号线应该维持高电平。否则,上拉电阻上会有耗电。特别是在上电过程中,IO线上电平也应保持在高电平状态。也就是说:当Master 的I2C 使用的是IO软件模拟时,一定要保证该两个IO上电默认均为输入(或高阻)或者输出高电平,切不可默认为输出低电平。IO默认为输入时,可以通过外部上拉电阻将I2C信号线拉至高电平。