请细看下图:虚框内为IC内的电路,而虚框外则是外部电路。
从上图可以看出来的信息:
I2C总线:两根线,一根时钟线SCL,一根数据线SDA。
(需要注意的是,这两个pin都是双向的,也就是说主器件跟从器件可以不是恒定不变的。)
Pin脚属性:开漏输出。
(需要通过电阻上拉到电源VCC,保证空闲时候为高电平状态且能够实现高低电平的变化。)
总线传输数据时,当SCL的电平是高的时候,SDA的数据有效,但是不允许变化,会出错。当SCL的电平是低的时候,SDA的数据无效,允许变化。
IIC总线有主从之分,从设备可以是多个,这个是由硬件电路与协议决定的,一般来说总线上扩展的器件数量主要由电容负载来决定。
因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.
所以需要根据不同的负载电容去估算支持的最大从设备的数量。
这里重新普及下CMOS的高低电平大小:
1、输出高电平和输出低电平
Uoh≈Vcc,Uol≈GND,
2、输入高电平和输入低电平
Uih≥0.7Vcc,Uil≤0.2Vcc
上拉电阻Rp的最小值计算:
一般IO端口驱动能力在2mA-4mA之间。如果灌入端口的电流与太大,将加大损坏端口的风险,也会使端口输出的低电平电压被拉高,如果高于0.4V,则有可能造成数据的差错。
sink current of 3 mA for Standard-mode and Fast-mode, or 20 mA for Fast-mode Plus.
举例:评估出一个最小的上拉电阻阻值。
电源电压VDD=5V+/-10% ,IO端口的驱动能力为3mA,Uilmax=0.4V.则最小的上拉电阻计算如下:
(VDDmax-Uilmax)/Rpmin<3mA
代入数据,算得Rpmin的值是1.7k。
如果VDD是3.3V的话,则计算出来的Rpmin大约是1.08K。
上拉电阻Rp的最大值计算:
总线电容是线路连接和管脚的总电容,它决定了Rp 的最大值。
标准模式:每条总线线路的最大电容负载都为400pF。(注意还要满足Tr<300ns)
快速模式:每条总线线路的最大电容负载都为200pF。(注意还要满足Tr<300ns)
先看下I2C的速率:
•Bidirectional bus:
– Standard-mode (Sm), with a bit rate up to 100 kbit/s
– Fast-mode (Fm), with a bit rate up to 400 kbit/s
– Fast-mode Plus (Fm+), with a bit rate up to 1 Mbit/s
– High-speed mode (Hs-mode), with a bit rate up to 3.4 Mbit/s.
• Unidirectional bus:
– Ultra Fast-mode (UFm), with a bit rate up to 5 Mbit/s
快速模式器件的输入有抑制毛刺的功能,SDA 和SCL输入有施密特触发器;
快速模式器件的输出缓冲器对SDA 和SCL 信号的下降沿有斜率控制功能;
如果快速模式器件的电源电压被关断,SDA 和SCL 的I/O 管脚必须悬空,不能阻塞总线;
举例:评估出一个最大的上拉电阻阻值。
由于端口输出高电平是通过Rp实现的,线上电平从低到高变化的时候,电源通过Rp对线上负载电容CL充电,等到达高电平的阈值的时候,是需要一定的时间的,即上升时间。端口信号的上升时间可近似用充电时间常数RpCL表示。
信号线负载电容(对地)由对方面组成,包括器件引脚、PCB信号线、连接器等。如果信号线上挂有对个器件,负载电容也会增大。
比如总线规定,对于400kbps速率应用,信号上升时间应小于300ns,假设线上CL为20pF,可计算出对应的Rp值为15k.
实际给出的公式为:
Rpmax = tr /(0.8473 * Cb) , tr 为上升时间,Cb为总线电容
最大的Rpmax是变化的,要根据实际的Cb去算。
总结:
如果RC充电时间常数过大,将使信号上升沿变化缓慢,达不到数据传输的要求。
如果Rp太小,则会增大端口的sink电流。
故在可能的情况下,Rp取值应稍大一点,以减少耗电。
另外,通常情况下,SCL,SDA两条线上的上拉电阻取值是一致的,并上拉到同一电源上。
电路干扰:
在I2C设备的电源入口处要加滤波电容,一般入口处加10nF或 0.1uF电容;SDA,SCL线上如果有干扰,做滤波处理,线上串一几十ohm电阻,对地加几十pF电容;
信号类型:
I2C总线在传送数据过程中共有三种类型信号:开始信号,结束信号,应答信号。
开始信号:SCL为高电平时,SDA由高电平转变为低电平跳变,表示开始通信。
结束信号:SCL为高电平时,SDA由低电平转变为高电平跳变,表示结束通信。
应答信号:接收数据的IC在接收到一个字节数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
开始和结束信号都是由主机发出的,应答信号是由从机发出。
数据的有效性:
SDA 线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。
硬件调试方法:
下面简单说下IIC总线设备的调试方法。
第一,请正确给出从设备的地址,一般有pin可以给你自己配置,也有的是IC固定下来的,请务必保证总线上所有的地址都不冲突。
第二,可以用示波器或者逻辑分析仪分析所发的数据,请务必仔细,因为这个必须每一位都不出错。