|  | 
 
| 
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  1 z% s; h( i+ u/ c1 `为什么是开漏输出?
 & m$ _$ R9 [' k$ ^# S/ o: V+ w0 [
 I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况。所以总线一般会使用开漏输出。# |& p3 n( d, a; N. P# j+ e
 为什么要接上拉电阻?
 ' d8 U2 p2 G  U
 8 x% M. ?/ c7 b; [& h接上拉电阻是因为I2C通信需要输出高电平的能力。一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换。
 . ]) S4 i1 w* ~# W
 3 ~0 N4 K! m. r' _' L  ]& WI2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。. @4 `9 G" c6 j0 R  K: H
 
 & A! B- M$ t( _上拉电阻阻值怎么确定?8 U5 [$ {% p$ F5 ]0 k1 \
 
 h$ |( O  }( G) M一般IO端口的驱动能力在2mA~4mA量级。
 & ^0 }/ S/ @8 n
 " O7 v8 t1 K! \1 G9 u6 A阻值不能过小。
 6 A% Z" u# d+ [+ D
 % ~' C" \8 @& A6 a3 h6 i) a功耗问题。如果上拉阻值过小,VDD灌入端口的电流将较大,功耗会很大,导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V)。故通常上拉电阻应选取不低于1K的电阻(当VDD=3V时,灌入电流不超过3mA)。7 o# L' G3 Q+ ^5 p: `2 K9 e2 g% J( v6 L
 
 ( [8 E( @! i6 [# C/ Q# ^阻值不能过大。" j+ ]0 ?3 w/ w8 f. X
 
 + X- C, _  \+ ~速度问题。它取决于上拉电阻和线上电容形成的RC延时,RC延时越大,波形越偏离方波趋向于正弦波,数据读写正确的概率就越低,所以上拉电阻不能过大。% i! [8 [9 {1 N' R4 s5 P% g3 G
 
 h; w8 t7 J4 F8 Q2 CI2C总线上的负载电容不能超过400pF。当I2C总线上器件逐渐增多时,总线负载电容也相应增加。当总的负载电容大于400pF时,就不能可靠的工作。这也是I2C的局限性。
 6 c0 Z/ h# W. A, e8 [: T" i8 o: y, |/ e
 建议上拉电阻可选用1.5K,2.2K,4.7K。
 5 n5 S1 R$ o) Z' x* C. f
 3 C5 P  T" o1 t9 |I2C总线基本操作
 : s  ]( n) S5 P9 M0 r+ m- O) k
 7 b0 K, l  W) `$ C4 N根据I2C总线规范,总线空闲时两根线都必须为高。假设主设备A需要启动I2C,他需要在SCL高电平时,将SDA由高电平转换为低电平作为启动信号。6 H8 ^( U6 [9 a( Q8 W9 X
 主设备A在把SDA拉高后,它需要再检查一下SDA的电平。为什么? 因为线与,如果主设备A拉高SDA时,已经有其他主设备将SDA拉低了,由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平,而是低电平。说明其他主设备抢占总线的时间比它早,主设备A只能放弃占用总线。如果SDA是高电平,说明主设备A可以占用总线,然后主设备A将SDA拉低,开始通信。
 & C4 k, x" h* s9 e) [  G, c因此,模拟I2C一定要将GPIO端口设置为开漏输出并加上拉电阻。
 * `4 ?$ C- ^4 V+ @1 C  r2 L! d9 ^
 | 
 |