EDA365电子论坛网
标题: I2C七宗罪之第五罪 [打印本页]
作者: alexwang 时间: 2019-3-20 14:07
标题: I2C七宗罪之第五罪
本帖最后由 EDA365_PCB 于 2024-1-22 17:54 编辑 & i2 c, H6 [% }( B$ M0 @
2 a& V! U6 U* ?7 h$ ]# _0 HI2C七宗罪之第五罪——没有ACK怎么办?
* p* ]5 v! f l; y6 g AEDA365原创 作者:John
: ?3 |# g- Z$ S3 z7 V
每一笔I2C的访问都是随着设备互相之间的ACK后结束的,这就好像你和别人商量个事情,要等到别人答应了,这次对话才算结束;又或者你给别人寄一个包裹,一般要等到收件人收到东西后,给你回了电话,你才会认为东西送到了。
这里的“答应”和“回电话”就等于I2C里面的ACK,这一点在前面都已经反复叙述了,这里不再展开说明(可以戳文段开头的链接回顾哦)。8 Z$ r0 F) t# |( c! E
我们先来看看下面这张图:
) n4 u5 `0 d; R, o. I2 x/ u
做几点说明,让大家明白讨论内容。
% H9 f# {/ e% d4 |# J( x
1.系统串口打印信息如下,表示I2C访问失败:
7 L2 B/ X# U9 \0 G
; w( x% d% a& {' P
I2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
1 S. }3 B9 y b f7 E; m% a/ e8 E aI2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
% @! X- V3 w! H0 G: f) k7 y# M
2.上图中我在ACK的位置坐了标注,细心的读者只要和下面这张正常的图一比较,就可以看出差别,在ACK的位置,SCL为High/SDA为Low,但是上图确刚刚好相反;
3.我们现在知道在第一个ACK的位置, Slave设备本来应该给出SDA=Low,为了更加清楚的分析问题,我们再来一张说明更多的图。
由前面的说明,我知道是Slave设备出了问题,那么到底出了什么问题呢?
0 n m; m6 e: d# w( N我们先把最前面那张图的案例分析一下,可能有人已经注意到了图中有一个@-40C,对了,没错!就是我们的交换机放在温箱里面做高低温时,在零下-40C的时候发现的问题。: g8 X1 F6 g, b
9 \: N" \; R) l" k有人问-40度下,这波形怎么量到的啊?
这明显问到了关键点上,硬件工程师的辛苦就体现出来。首先要把I2C信号线和串口线分别从板子上焊接出来,再分别连到外面的示波器和电脑上,然后就苦逼地守着温箱,运气好的话很快就能复现问题,运气不好要折腾很久才能trigger到这个issue,真的是一把辛酸泪啊。
7 X$ j/ H/ [' B$ L) l3 j* O; f解决的问题过程更加复杂,而且并没有什么技术含量可言——说服Supply Chain的人认为是vendor的器件问题,让他们在芯片生产线做Screen的时候,从原来的泡-40/5分钟改为-45/20分钟,把没有margin的芯片筛选掉。这个和Supply chain以及vendor沟通的过程是痛苦的,大公司嘛,不说了,你们懂的…… ?! _/ ~1 A; O- g0 s
9 A5 q% `( y/ p0 N' F( i现在我们知道了器件受环境影响会产生I2C不ACK的问题,下面这张图是另外一种情况,先故设迷局,一起看看下图中有什么问题?
" T' J5 r& \5 c8 k 我承认,这个真的不好发现,以前团队中的某工程师在调试一个Sony的IMX291 Sensor时,CPU通过I2C死活访问不了,最后把波形一点一点在示波器上触发下来看,还是看不出来,这就难怪,没有经验确实很难找。
) `' V4 c) y( t6 q& y# J1 X
8 s$ K: i% U: C$ |
我们先来看单次写操作:
r; m) J* c* p+ W
1.Start
+ S0 V' A5 ^2 O/ }: T* N3 b0 R2 s2.Master发device address
" P: R+ L8 K' x p/ E/ q7 v- e
3.Master发 R/W为Write
% V d; G' o3 x/ Y) h, F
4.Slave 回ACK
4 u6 V- R- x, `" C* v% q5.Master发寄存器地址,也叫Word Address
( c; J4 o% w( s$ @- {+ K; ^) s
6.Slave 再回ACK
' ~; e9 s3 C+ `; R7.Master发要写的数据给Slave
) |6 A. z& m9 a; {! i/ P3 x8.Slave收到数据后回ACK
; p& W' T* S+ `& f! j$ D: P8 n9.Master看到ACK后发Stop结束本次操作
7 p% |. F5 E; i, e; @" s. \
7 N) v" u* Y% \' ]; d* f我们再来看单次多操作:
( {" T, T- ^6 x% {7 L
1.Start
6 u- u- `/ q3 E& O( @
2.Master发device address
# Y6 B/ n0 K( j$ o4 p! e" }
3.Master发 R/W为Write
9 z0 V- d; G. `2 O4.Slave 回ACK
1 o9 [" V4 @, Z, q+ H) f5.Master发寄存器地址,也叫Word Address
' ~3 i, u. h7 Z& ^# q+ b. ]# Y; {6.Slave收到后再回ACK
" @: q1 l4 s7 h/ _. @# e( g7.此时Slave内部的寄存器指针已经知道对应的寄存器地址
, G8 R1 j3 h2 f. D- c& a( E8.Master发start
1 M1 f8 J }3 n8 F) Z! w9 i' A1 {
9.Master再次发device address
% W( p1 e" k4 c7 _& j$ I' B
10.Master 发R/W为Read
5 s8 J. T( p y- v$ `11.Slave发出ACK
! J! P; S6 h. k12.Slave发数据给Slave
/ n8 N, O6 c. Z) g# s" E
13.Master收到数据后发NAK给Slave
3
5 }! I3 ]; n, Z5 w" Y- G14.Master发stop结束本次读操作
; p. k0 z1 R. p0 g3 m+ n
; {: U( o0 D6 S3 {所以上图的读操作一共有两个错误,为了防止读者烧脑,我直接标注出来吧:
6 h" ~- a$ ]0 ]$ x1 V0 ^ x
不知道大家在前面阅读的时候有没有看出来呢? 特别是第一个Start很容易漏掉,不是老司机一下子真心发现不了。$ x) E) D( R1 N# w, O
添加了这里漏掉的START和ACK后,我们的Sony Sensor终于可以访问了,所以时刻要注意ACK是否少了。
4 t! M& R& r% S/ u' x: r, D. @! v1 ?" G
为了让大家清晰理解,这里给出一张完整的逻辑图,大家在理解时要注意和写操作做对比,然后一定要独立思考弄清楚为什么会有这样的差别?一直到自己彻底想明白了,以后独立解决问题的速度也就会变快。
3 M# e, K. y5 F9 V' V& k; B最后我再给大家看一张图,请大家自行研究错在哪里? 答案我们将在“第六宗罪”里面揭晓。
( v( p) b, R5 k2 A" z注:本文为EDA365电子论坛原创文章,未经允许,不得转载。
7 a! o+ @& _0 U1 a% {* y' B8 a& e2 J3 [& C
作者: yongbudl2015 时间: 2019-11-19 18:20
各位,有john大神的联系方式吗,很想认识一下,我邮箱2929219135@qq.com
作者: ohdsp 时间: 2019-12-18 20:43
谢谢资料分享
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |