EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 EDA365_PCB 于 2024-1-22 17:54 编辑
. M7 D- a7 ^. B) Y5 G% T- V5 W$ A% l9 g0 L6 J/ V
I2C七宗罪之第五罪——没有ACK怎么办?
8 I8 w! ?- [$ C6 x: V- V/ ~EDA365原创 作者:John : m5 ?" K/ d/ d1 G
每一笔I2C的访问都是随着设备互相之间的ACK后结束的,这就好像你和别人商量个事情,要等到别人答应了,这次对话才算结束;又或者你给别人寄一个包裹,一般要等到收件人收到东西后,给你回了电话,你才会认为东西送到了。 这里的“答应”和“回电话”就等于I2C里面的ACK,这一点在前面都已经反复叙述了,这里不再展开说明(可以戳文段开头的链接回顾哦)。
3 e+ y# Q5 f. ?" i b我们先来看看下面这张图:
+ i& G$ \* D! ]1 q
做几点说明,让大家明白讨论内容。 2 e5 I5 q. W. K' G3 f2 X
1.系统串口打印信息如下,表示I2C访问失败:
$ |4 j. G7 c9 K, o/ {8 b$ s0 x# z8 N
I2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
; Z7 f- _- I4 t$ XI2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
! ?$ f/ D9 u2 L! z
4 S) x& X# S6 u3 {2.上图中我在ACK的位置坐了标注,细心的读者只要和下面这张正常的图一比较,就可以看出差别,在ACK的位置,SCL为High/SDA为Low,但是上图确刚刚好相反; 3.我们现在知道在第一个ACK的位置, Slave设备本来应该给出SDA=Low,为了更加清楚的分析问题,我们再来一张说明更多的图。 由前面的说明,我知道是Slave设备出了问题,那么到底出了什么问题呢?
' N' o9 q8 U$ f* n5 I我们先把最前面那张图的案例分析一下,可能有人已经注意到了图中有一个@-40C,对了,没错!就是我们的交换机放在温箱里面做高低温时,在零下-40C的时候发现的问题。
6 V& k. W+ Z9 b( r( B3 j4 j3 X1 N+ f/ P0 K: X4 i
有人问-40度下,这波形怎么量到的啊? 这明显问到了关键点上, 硬件工程师的辛苦就体现出来。首先要把I2C信号线和串口线分别从板子上焊接出来,再分别连到外面的示波器和电脑上,然后就苦逼地守着温箱,运气好的话很快就能复现问题,运气不好要折腾很久才能trigger到这个issue,真的是一把辛酸泪啊。
' v# n2 l' b4 [ W解决的问题过程更加复杂,而且并没有什么技术含量可言——说服Supply Chain的人认为是vendor的器件问题,让他们在芯片生产线做Screen的时候,从原来的泡-40/5分钟改为-45/20分钟,把没有margin的芯片筛选掉。这个和Supply chain以及vendor沟通的过程是痛苦的,大公司嘛,不说了,你们懂的……
7 {* J$ U& N6 y0 q/ A2 |
$ q! t" p; K' g5 j现在我们知道了器件受环境影响会产生I2C不ACK的问题,下面这张图是另外一种情况,先故设迷局,一起看看下图中有什么问题?
- z v4 v& n* d: B) ~. J 我承认,这个真的不好发现,以前团队中的某工程师在调试一个Sony的IMX291 Sensor时,CPU通过I2C死活访问不了,最后把波形一点一点在示波器上触发下来看,还是看不出来,这就难怪,没有经验确实很难找。 7 K" d) A/ g a) ]# r: x9 {
7 h# x3 c" r" s9 e# F- c9 f. O我们先来看单次写操作: 1 w) U1 ]3 o) d6 k# w
1.Start 6 M0 \' E* M9 g; O
2.Master发device address 0 z5 k* Q9 v, q. J: |
3.Master发 R/W为Write $ ]* s$ F8 E8 c K) _) G
4.Slave 回ACK 8 F) |3 o6 _1 O5 D2 |! y) d9 B
5.Master发寄存器地址,也叫Word Address ( f8 V h7 @, W1 t' a4 P
6.Slave 再回ACK m# I' O6 G9 ?" a) t
7.Master发要写的数据给Slave
3 M/ h9 t- c3 w n) L3 i8.Slave收到数据后回ACK # C, |( s; U, n4 ^6 D
9.Master看到ACK后发Stop结束本次操作 : g' I, _! q6 R3 @7 X. I
! X1 T( X+ n: W0 u( O% z1 v我们再来看单次多操作:
- z( h6 _0 I" H0 e |- F \0 Y. Q1.Start $ v- T2 _1 v1 B
2.Master发device address
0 Y" i7 Z0 C- \( @3 q: y& ~; I3.Master发 R/W为Write
% I' d ?; N. r, |; ^: Q; I( A3 l4.Slave 回ACK
6 e& W) y3 P. M2 K5.Master发寄存器地址,也叫Word Address
% E9 u4 T# ?* B) D6.Slave收到后再回ACK
x; c9 n2 }7 X# u- g( q7.此时Slave内部的寄存器指针已经知道对应的寄存器地址 . _6 u+ `, l+ v
8.Master发start + E( k* a$ F9 l4 F- `. E
9.Master再次发device address ! ~0 Q; n0 J. K: F8 v y" E
10.Master 发R/W为Read ! K3 u* t+ v0 u
11.Slave发出ACK y2 B* h, @8 l" Z
12.Slave发数据给Slave $ Y& X- d5 b$ a1 L" Z/ L; {! d
13.Master收到数据后发NAK给Slave 3! k9 [9 ~ L& I/ _
14.Master发stop结束本次读操作 3 S) S, L. H" m
! [# f0 n `5 ^6 n& G* v: [所以上图的读操作一共有两个错误,为了防止读者烧脑,我直接标注出来吧: % i4 a' C' D( N; X3 L
不知道大家在前面阅读的时候有没有看出来呢? 特别是第一个Start很容易漏掉,不是老司机一下子真心发现不了。
! U; J- m7 D7 H# z添加了这里漏掉的START和ACK后,我们的Sony Sensor终于可以访问了,所以时刻要注意ACK是否少了。' S; q s3 E# t
& t; i; H7 ]" U* q; u2 Q. M0 ?$ A
为了让大家清晰理解,这里给出一张完整的逻辑图,大家在理解时要注意和写操作做对比,然后一定要独立思考弄清楚为什么会有这样的差别?一直到自己彻底想明白了,以后独立解决问题的速度也就会变快。
8 E% F. X6 s" i0 k* \9 V5 H最后我再给大家看一张图,请大家自行研究错在哪里? 答案我们将在“第六宗罪”里面揭晓。 ) B* v6 o! C/ p7 ^ m, ^
注:本文为EDA365电子论坛原创文章,未经允许,不得转载。 , b! X" h/ F4 G) A% i) u
|