2、I2C Architecture
I2C 采用的 GPIO 一般为开漏模式,支持线与功能,但是开漏模式无法输出高电平,所以需要外部上拉。Vdd 可以采用 5V、3.3V、1.8V 等,电源电压不同,上拉电阻阻值也不同。
一般总线上认为,低于0.3Vdd为低电平,高于0.7Vdd为高电平。
推挽结构和开漏结构
推挽结构:使用两个三极管或 MOSFET,以推挽方式存在于电路中。电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高。既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
图中上面是 NPN 型三极管,下面是 PNP 型三极管。分别有以下两种情况:
输出高电平:向负载灌电流。
输出低电平:从负载拉电流。
三极管和 MOS 管效果类似,不赘述。
开漏结构(OD):对比推挽结构,开漏结构只有一个三极管或者MOS管。
之所以叫开漏,是因为MOS管分为三极:源极、栅极、漏极。漏极开路输出,所以叫开漏;如果是三极管:基极、集电极、发射极,集电极开路,所以叫开集输出(OC)。
开集输出(OC),NPN 三极管:
这个结构很好分析:Vin 高电平,三极管导通,对外输出低电平,外部被直接拉到低。Vin 低电平,集电极(C)开路,输出电平状态由外部决定。
以上分析均采用三极管,MOS管类似。
因此,推挽结构可以输出高低电平。开漏输出只能输出低电平,高电平由外部电路决定。
对比总结如下:
电平跳变速度,推挽输出由CPU控制,高低电平跳变速度快(0->1),开漏输出由外部上拉电阻决定,上拉电阻小,反应速度快,从低电平到高电平跳变速度就快,但电阻小电流就大,功耗就高,反之亦然。
所以开漏输出的外部上拉电阻要兼顾速度和功耗。上拉电阻小,信号边沿陡峭,信号好,但是功耗高。
电平转换:推挽输出输出的高低电平只有0和Vdd,开漏输出的高电平由外部上拉电阻决定,多少V都可以,只要不超过MOS管击穿电压。
线与功能
线与:所有 GPIO 输出高就是高,只要有一个输出低,整条线上面的都是低,这就是“与”的意思。
推挽结构下,两个GPIO口连接到一根线上,假如左边的PMOS导通,右边的NMOS导通,Vdd就会通过两个MOS管直接接地,由于MOS管导通电阻不大,会导致电流很大,直接损坏这两个GPIO口,因此,推挽输出不支持线与。
推挽结构在这种情况下会损坏GPIO口。
开漏:假如很多GPIO是开漏结构,接到了一根线。开漏结构输出的高电平靠外部上拉,假如有一个GPIO接地,那么电流会通过上拉电阻流进GPIO口接地,因为有上拉电阻的存在,所以不会损坏GPIO口。
线与,是 I2C 协议的基础!线与:当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占用状态。
上拉电阻计算
1、上拉电阻过小,电流大,端口低电平 level 增大。
因此计算出一个精确的上拉电阻阻值是非常重要的。计算上拉电阻的阻值,有明确计算公式:
最大电阻和上升沿时间 tr 、总线电容 Cb 、标准上升沿时间 0.8473 有关。
最小电阻和电源Vdd电压、GPIO口自己最大输出电压 Vol、 GPIO口自己最大电流 Vol 有关。
查《I2C-bus specification and user manual.pdf》7.1节:
查《I2C-bus specification and user manual.pdf》表10:
1、标准模式:0~100KHz,上升沿时间 tr = 1us
2、快速模式:100~400KHz,上升沿时间 tr = 0.3us
3、高速模式:up to 3.4MHz,上升沿时间 tr = 0.12us
由此公式,假设 Vdd 是 1.8V 供电,Cb总线电容是200pF(虽然协议规定负载电容最大400pF,实际上超过200pF波形就很不好,我们以200pF来计算)
标准模式 :
快速模式:
高速模式:
最小电阻(Vdd越大,上拉电阻就要越大):
注意,高速模式下,电源电压一般采用 1.8 V,不会采用 3.3V,因为如果用 3.3V 计算你会发现最小电阻比最大电阻大。
采用合适的电源电压和合适的上拉电阻,才会让你的 I2C 传输信号最优。上拉电阻选小了,会使得总线电流大,端口输出的低电平会变大(一般低电平不允许超过0.4V)。上拉电阻选大了(RC),上升时间增大,方波变三角波。
大家在不同速率采用的电阻一般有以下几种:1.5K、2.2K、4.7K。
上拉电阻关系图