你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

怎解?IIC设备导致死锁了!

[复制链接]
eefishing 发布时间:2020-1-15 01:34
一般情况下, i2c 设备焊接没什么问题,按照设备手册一步步来,基本上就顺风顺水能够用起来。如果这么一个简单的东西,有时候想要的结果死活不出来,反复的检查问题的原因,查询解决办法,核查设备的数据手册,甚至发送和接收的每一条命令与数据都知道是什么意思,仍然无法解决问题,那该怎么办呢?/ h! ^7 q5 Z7 Z' S6 J) V. R+ Q* P9 ?
3 q& n3 g  M4 R: i/ |2 n
本文主要针对 i2c 设备,讲解如何解决 i2c 设备主机与从机直接无法正常数据交互的问题,侧重点是针对硬件设计不太合理、i2c 设备设计不标准导致总线故障的情况,并且通过分析现象,提出解决方案。对于在设备初始化中,没有设置相应的寄存器或者发送命令,而导致的无法获取想要的数据情况,不作详细介绍。! O& `9 |+ @4 F7 G- J- L# z

( r4 F# t' M* e/ x* G/ G" u
# s8 z, X5 p5 s6 l) j, V8 O7 `
一、i2c 基本用法" g4 y/ B; T: }2 c  \
i2c 总线是一种简单、双向二线制同步串行总线。所有主机在 SCL 线上产生它们自己的时钟来传输总线上的报文,SDA 线传输每个字节必须为 8 位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个响应位。在空闲状态时,SCL 与 SDA 均为高电平。4 u- x! }9 s3 W7 B( j0 R

/ o: ^* W4 `3 w7 ~4 i通常一些低功耗 i2c 设备,芯片引脚使用上拉输出即可满足与其正常数据交互,还有一些 i2c 设备,则需要在总线上外加一个上拉电阻,此时相应的 I/O 配置成开漏输出,其他的按照芯片手册进行标准配置。
3 R5 N' R+ |3 a8 @% j1 ?) F/ ~/ v2 J' D. s8 D7 f
二、硬件问题汇总
7 Z  @' n. n$ O0 H/ T
2.1 无法正常拉高拉低引脚
: e9 n- S) F* G& @! d
首先确定 SDA 与SCL 引脚能够被拉高、拉低,检测方式直接软件控制 I/O 口输出引脚低电平/高电平,测量引脚电压是否能够随着芯片引脚的设置输出相应的状态。如果不能被拉低,检测虚焊、上拉电阻断开、i2c 设备是否正常、芯片引脚是否损坏等问题,确保能够正常被拉高或者拉低。+ }, L2 U% R: O! a; l7 B" C8 w0 K

& K' r! N3 x: N1 u& |

) a  Y2 i1 A/ \( H5 x2.2 电气特性无法满足: D$ W) @; O) h0 c$ D5 K
如果正常拉高、拉低的情况下,依然无法正常读取数据。通常建议,根据负载电流更换小阻值的电阻。7 U# f2 q) }. W- d8 j

9 Z) p# F0 Z  p) P" i* \0 |$ [$ s+ g7 U如果需要详细知道原因,就具体查询 i2c 设备电气特性。大多数 i2c 设备电气特性,大致如下图所示:$ i& n  _3 z& P8 U6 O* Z6 y% C
- Q3 d2 G5 g7 Y0 f3 I$ I+ Y
1.jpg * E- Q$ `' H+ C

( p0 I1 {& G, h, W1 D通常这块内容在 i2c 设备电气特性这一块,主要讲解电平拉高拉低的最长时间、最短时间,以及处于高电平与电平的阈值与持续时间等等内容。& U- B# o2 v& s1 B- H# p* g  [. t

# ?$ B4 [) M1 A1 f- C  E4 K" G硬件设计,为了降低单片机的功耗与保护芯片引脚,在满足负载电流和负载电容相关要求的前提下,阻值设置通常比较大。如果同一个总线上挂载多个 i2c 设备, 即使在 I/O 口配置正确的前提下,也会导致驱动能力不足。0 w% Z! ~3 K2 q% F8 d" r5 _
2 i. O! U, ]( t" s. b
现象是拉高电压不足,在拉高、拉低过程中消耗时间过长。这两个问题通常还引起数据线与时钟线:拉高时,高电压持续时间过短;拉低时,低电压持续时间过短。用示波器抓取图形:从波形上看,显示是尖波、斜波、杂波等不符合 i2c 设备电气特性的波形;从数据上看,数据线高电平持续时间过小 ,上升沿时间过长 ,下降沿时间过长等等数据超出设备电气特性的有效值。典型杂波图,如下所示:9 s8 T* l1 X4 U3 P. M# Q
  t( i( N  t0 ]' X  z
2.jpg
; e, a! J" b7 o, w8 t+ u% F6 s
如果出现此类异常,建议更换小一点的电阻,用来增强总线驱动能力,提高电平转换速度。应当注意的是每个 MCU 的耐受电流不一样,减小电阻应避免超过相应引脚承受电流的最大值。
/ i* s- q, u3 h( a7 ~2 g+ j% x! W7 Q' X6 ~
9 D2 z7 e0 Z  g9 Q
三、SDA 死锁& z9 w2 Y9 m  d
如果i2c 设备的数据偶尔能够正确获取,但是仍然会在总线发送数据或者命令的时候,爆出总线读写错误,那么有可能遇到下面的死锁问题,死锁时候,就是数据线被拉低,主机无法拉高。死锁一般发生在从机上,且为数据线死锁。因为i2c总线是共享的,如果需要确定,是否是从机死锁,可以参照下面两幅图,串联电阻进行测试
7 X5 w2 ^& B4 ?0 Q3 k9 `7 A' {; w/ X" n3 ]: ]) D; D& G7 w
3.jpg

6 B# d4 S& Z' `% Y3 r( C: I! y
0 e2 S: l& e) h: m$ L9 p2 |/ }
如上图所示,如果从机死锁,即从机拉低电平,此时检测到的电压为1/3 Vcc。
7 e9 A4 B4 G) E; ^6 t7 d% x
4.jpg

; X& j* {: U% G% L
: x* |2 p. q; f9 |
如上图所示,如果主机死锁,即主机拉低电平,此时检测到的电压为 1/11 Vcc。依据这个原理,可以准确判定死锁的具体位置,多个传感器依据类似方式进行定位。8 _5 R' Q) U- i! q
7 v3 R$ `2 t. \; j- t9 P  C
- `" K) O" H! Z
3.1 反复重启导致死锁
0 }% r6 [( u4 e6 a  a
3.1.1 现象! E( Y2 K/ C2 ?1 F5 m7 X8 ^9 X; j- D* l
如果设备需要反复重启,很有可能在从机设备返回数据的时候,SDA被锁住。具体原因是从机设备在回数据,还没有发送完成,主机时钟消失,从机等待时钟信号, MCU重启,如果从机设备的电源没有复位,从机继续等待 MCU 时钟信号,数据一直被钳住,总线无法完成数据交互。& w* d9 o" J5 V, q. e8 V8 t

0 [' i4 g; x" L4 h: x' C3.1.2 解决方式6 M, o- h* W* t0 w* U# g
解决重启导致总线死锁,一种方式可以如同 rt-thread 驱动解决方式一样,在系统复位的时候,提供9个时钟信号,解初总线死锁;另一种是在按下复位键初始化的时候,给从机设备电源断电重启,这个需要引脚控制。
$ C! ~, @( u8 x& O* i8 K% U
$ X" i4 H- p1 j3 s$ T3 E
3.1.3 9 个时钟信号
) Y- x: \; h# W/ G+ o- z9 w
i2c 设备进行读写操作的过程中,在从机钳住总线的期间,MCU 异常复位,会导致 SDA 死锁,异常产生出现在俩个阶段:从机响应阶段、从机发送数据阶段。下面将针对这两种异常,对时钟信号进行解释,并且总结其他原因,得出结论。/ t4 q: I8 U; G3 }4 f2 D0 B/ k
+ }! j8 H8 G) y: D3 Y8 \( J7 n
(a) 从机响应阶段0 G" J9 U4 W9 U+ }4 X
MCU 在开始信号后发送地址,得到从机设备响应,准备开始返回数据,在这个时候,从机将 SDA 信号拉为低电平,如果 MCU 异常复位,会导致总线上 SCL 停止发送时钟信号,从机等待 MCU 的时钟信号,产生钳住并且拉低 SDA 的现象。如果想要解锁 SDA,从机需要 9 个时钟信号,使得从机完成响应,释放 SDA 。
! q" X6 M7 W; W4 x; s: m
" D! w* A1 ~5 t" [& S0 M6 ?
(b) 从机发送数据阶段0 a5 M4 t2 |$ e. t8 Z: }
如果从机响应完成了,开始给 MCU 返回数据。这个数据有八位,每一位都有可能为低,如果在数据低位,MCU 异常复位,停止发送时钟信号,从机就会等待 MCU 的时钟信号,产生钳住并且拉低 SDA 的现象。如果想要解锁 SDA,从机需要 1-8 个时钟信号,使得从机完成数据响应,释放 SDA 。
# \( t! s3 I  z2 D9 L/ v" D( b0 E/ E/ w3 \$ L6 E
(c)其他情况  o1 t( C9 {8 c% \0 q4 x" K" l5 y, i
在从机一个 8 位数据发送完成后,等待 MCU 响应, 即使属于 MCU 的,从机不再钳住 SDA,没有时钟,数据交互停止。在主机发送数据阶段,总线所有权在主机,主机异常,数据交互停止,总线释放。所以,这些情况下,不存在 SDA 死锁的情况。
) R1 i* I/ ?0 Q2 r2 V& O) v' Y9 ]" {4 y7 w' f7 `$ ?+ {8 [
(d)结论7 h+ O  p/ E4 l2 V
综上所述,解锁 SDA 从机最多需要 9 个时钟信号,也就是异常复位后,MCU 至少发送需要 9 个时钟信号,完成 i2c 总线的 SDA 解锁。所以,RT_Thread 为了避免此类问题的产生,在 i2c 驱动初始化,对总线进行判断,判断是否需要解锁,如果需要,就进行解锁,确保 i2c 设备不会因为这个问题导致数据交互失败。
0 ]+ z; }9 n0 f  b9 n# z$ D" }* E7 s

6 X: H" r( N) }9 K3.2 多个 i2c 设备导致死锁4 q* j% ?3 }. C, Z6 }5 `
多 i2c 设备除了异常复位导致死锁,还会形成相互干扰的问题,一般情况下,不会把同种从机地址挂在同一条总线上,但除此之外,有些 i2c 设备设计不是按照标准的 i2c 总线协议设计,在 i2c 总线共享的前提条件下,有的设备只要总线上从机地址就会有响应。这样由于从机的错误响应,使得各个 i2c 总线异常,甚至钳住总线,导致 I2C 总线进人一种死锁状态。
9 S9 J! T6 p4 k8 H2 K, A! s) [1 D: {5 g+ e6 a5 R* \, y
解决方式,这样的不标准i2c设备,单独使用一个总线,避免干扰,或者单独一个独立引脚,控制电源。
7 v& o0 \# l+ x+ }
收藏 3 评论5 发布时间:2020-1-15 01:34

举报

5个回答
慎微 回答时间:2020-1-15 08:44:53
感恩
李康1202 回答时间:2020-1-15 09:47:46
受教了
294479435@qq.co 回答时间:2020-1-15 11:14:04
要是我早看到这篇文章,当初就不必花费半个月找问题了,总结很好
eefishing 回答时间:2020-1-21 01:36:35
00-405686 发表于 2020-1-15 11:14: c$ J* D  Y- r$ K5 j5 `7 l( j
要是我早看到这篇文章,当初就不必花费半个月找问题了,总结很好

( B, K7 u2 I0 S3 l  ?. B谢谢
jeffhe1 回答时间:2020-1-21 08:47:14
謝謝大神指導,受教了

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版