|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' ?) i0 u2 e* _为什么是开漏输出?
2 \; V0 B1 b# ~# R3 \/ q0 E* M7 J& U* F! ^- V) Z+ k4 Q
I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况。所以总线一般会使用开漏输出。
5 j# Y( H: H5 B8 P5 F/ G! N& a为什么要接上拉电阻?
6 ~5 |) b2 c4 R% T8 p$ {8 ^& Z+ ?: L+ o
接上拉电阻是因为I2C通信需要输出高电平的能力。一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换。; V" O( d3 k x6 y
5 @6 g8 w( T7 l3 \" e+ h# \
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。# R1 j5 }% [8 [1 ~8 v9 X
' t: Q$ b6 V" T& a+ M6 C2 F
上拉电阻阻值怎么确定?0 e6 a8 K$ g9 `& s1 z) j
4 M: r8 E1 f" W( W( X8 b$ H( I$ U一般IO端口的驱动能力在2mA~4mA量级。
0 \7 u7 \7 K. i8 W' u7 Q. `3 K- i/ A* W4 p
阻值不能过小。) J+ G5 P" E3 c
: V7 n9 H; j" n6 ?$ J功耗问题。如果上拉阻值过小,VDD灌入端口的电流将较大,功耗会很大,导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V)。故通常上拉电阻应选取不低于1K的电阻(当VDD=3V时,灌入电流不超过3mA)。# `# T& H2 `1 |/ a
" S2 O; W8 X* u1 P" W; X
阻值不能过大。
# k$ r4 g( s) ]4 O/ e/ `4 w2 Y# {3 H& T
速度问题。它取决于上拉电阻和线上电容形成的RC延时,RC延时越大,波形越偏离方波趋向于正弦波,数据读写正确的概率就越低,所以上拉电阻不能过大。
. e+ ?% @# R1 F1 }2 O; m9 P, ], ^4 A: E0 K
I2C总线上的负载电容不能超过400pF。当I2C总线上器件逐渐增多时,总线负载电容也相应增加。当总的负载电容大于400pF时,就不能可靠的工作。这也是I2C的局限性。2 j- f7 @$ ^# e! q; l" W: a
6 N/ N( c+ m) z3 @
建议上拉电阻可选用1.5K,2.2K,4.7K。4 d. i, f- Y, B" {2 g) w
( I* q$ Q! x" P i; I" c& \I2C总线基本操作' y7 ?5 ^* j7 B1 j) |6 H; y) L( ?
; f, T$ T2 n0 ]4 u7 U: l! I: U4 J
根据I2C总线规范,总线空闲时两根线都必须为高。假设主设备A需要启动I2C,他需要在SCL高电平时,将SDA由高电平转换为低电平作为启动信号。& F7 o- v' N0 [$ u! t
主设备A在把SDA拉高后,它需要再检查一下SDA的电平。为什么? 因为线与,如果主设备A拉高SDA时,已经有其他主设备将SDA拉低了,由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平,而是低电平。说明其他主设备抢占总线的时间比它早,主设备A只能放弃占用总线。如果SDA是高电平,说明主设备A可以占用总线,然后主设备A将SDA拉低,开始通信。
, m# U8 E( e8 C% C5 T# r0 `3 E' ~& u因此,模拟I2C一定要将GPIO端口设置为开漏输出并加上拉电阻。
/ h6 O2 Q& Z m1 y" z |
|