1.1 IIC总线概述
全称Inter Interface Circuit芯片间接口总线,由Philips公司推出。是应用于短距离,芯片间的通讯
一般是单片机与外围存储,接口芯片间的通讯。
总线特性:串行同步半双工,物理层编码方式为NRZ,不归零编码方式。
1.2 物理构成
1:两根总线SDA和SCL构成(可用正常铜导线,是不是可以使用双绞线,但是基本上都是使用PC板上的铜导线代替)。
2:若干节点(主节点和从节点数量并不限制为固定关系),但是一般系统构成有(至少一个主节点和一个从节点)。
第二点又有几点需注意的点
一:总线上的节点,不是没有限制的,虽然从寻址上看,一个I2C总线上,最多能挂128(7bit)(1008)(10bit寻址)个个从节点,和若干个不限制数量的主节点。但是受总线负载电容的影响,其总线上的等效不要超过400pF,通过增加驱动可以总线上的电容超过4000pf,总线长度可以达到15m
关于I2C总线,由于是开漏或者开集电极输出,所以需要接上拉电阻,才能在空闲时将电位钳制在高电平。
3:电源+上拉电阻
二:关于上拉电阻的选择。我们先要了解I2C协议的一些物理层特性
首先我们看到:输入低电平电压和输出高电平电压
输入低电平电压最低0 V->最高0.4V
输出高电平 最大值 VIH = 07Vcc-VCC
根据公式可以得出:算出上拉电阻的最小值在5V电源供电下,至少为1.53K欧姆。
最大上拉电阻是多少?
最大上拉电阻,我们需要知道I2C物理层的的另外一个特性,就是上升沿和下降沿
可以看到,在标准模式下,SDA和SCL两条线的上升沿最大时间为1000ms。
我们把电路简化成一个RC,把节点简化为一个等效电容
把节点等效成电容,总线上的节点都是并联,相当于电容1(节点1)并联一个电容2(节点2)。
总线上的 总电容 = 电容1(节点1)+电容2(节点2)
根据已知Tr最大值1ms,Cb是总电容 假设=200pF
带入公式得 Rp(max) = 591715.9763313609 大约为591KΩ左右。
实际应用中最大不会用到这么大的值,一般情况下标准值4.7KΩ即可满足大部分请求
总结两点,上拉电阻选取规则
最小值必须要保证总线被拉低时,最低电压<=规范规定最大值
最大值必须保证 总线上升沿时间<=规范最大上升沿时间
最后我们利用51单片机的开发板,量取一下I2C的物理层数据,数据如下,即可判定是符合要求的
习题与思考
(1)我们在开发过程中遇到总线低电平,不符合规范要求。即发现总线上世纪最低电压>0.3Vcc时如何处理。
答:这是必须要增大上拉电阻
(2)总线上升沿不符合要求。即上升时间>规范定义的最大上升沿时间
答:解决方式1,减小上拉电阻
解决方式2,PC板重新布线,或者减少总线上节点数量
方式1,是最常见的
方式二:除非在一下情况下使用,即一开始发现上升沿时间较大,不符合要求。我们采取减小电阻的方式,使得上升沿时间变小。上拉电阻减小到最小值时,再减小电阻,最低输出电平即将不符合要求。此时上升沿依然不符合要求。这时我们才会采用方式2来解决。
(3)总线上新增加节点对I2C的那些物理层数据有影响
答:新增加节点对输出低电平和总线电容都有影响,但是一般情况下对输出低电平影响很小,但是电容一定增加,导致上升沿时间变大。如果未增加节点之前,上升沿符合要求,增加节点之后上升沿变得不符合要求之后,我们应该减小上拉电阻。
(4)某一位工程师在设计过程中使用51单片机作为主节点,AT24C02作为从节点。因为其他端口都被其他外设占用,设计师采用P2.0=SDA ,P3.0=SCL。请问这样做,会不会有问题?
答:因为51单片机上不同端口的内部结构是不一样的,于是,就会导致SDA和SCL的一致性出现差异,所谓一致性差异,就是总线上的低电压,上升沿时间,两条线出现不一致的现象。虽然在大多数情况下这并不会造成严重的问题,但是在条件允许的情况下。我们还是选取同一型号的端口分别作为SDA和SCL。
(5)实际量取I2C波形过程中发现以下问题
在SDA拉升过程中,SCL也出现了一个小幅度上升,暂时不知道原因。
1.3I2C的编码规则
(1)起始信号(在SCL高电平期间,SDA发生负跳变)
在SCL(蓝色线)高电平期间,SDA(红色线)从高电平跳变为低电平
注意点如下
我把起始信号分为三个部分
第一部分,我称为确认总线空闲阶段,这一阶段SDA和SCL都是高电平,需维持至少是两个机器周期以上。(我暂时的理解为一个周期用来采样,一个周期用来使单片机进入空闲状态)
第二部分;从SDA下降沿开始,到SCL下降沿开始,我叫做起始信号建立阶段。此阶段也应该保持至少两个机器周期
第三部分,将SCL拉低,方便接下来的SDA数据线的变化,SCL拉低需保持最低两个机器周期。保证主节点已经知道SCL已经拉低,两个周期后可执行SDA上的数据变化。
(2)发送从机地址
从机地址,分为7bit和10bit的ID,目前我只知道,7bit中前四位是固定的代码,每一种类型的器件都有不同的编码(如AT24C02是EEPROM,同一种芯片前四位都是固定的)(),2^4=16种器件。然后低三位是器件自保留可硬编程。
即可这么理解,一根总线上可以挂载16中不同类型的芯片,同一种芯片可以同时挂载8个,只是需要将他们可编程的低3位,接地或者接高电源来赋予不同的地址。
补充一下10bit寻址相关的知识,
10bit寻址,将地址分为两个字节传输,其中前五位固定为(11110)这个是必须不变的,指示采取10bit 位的寻址。
可以与7bit寻址相比
(3)