EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 EDA365_PCB 于 2024-1-22 17:54 编辑
& g+ l. P7 R7 E: J' I5 q+ V4 z' W- J o7 T
I2C七宗罪之第五罪——没有ACK怎么办?
' G6 V1 R; P& v+ p) J0 q2 t5 vEDA365原创 作者:John ( q$ o& e1 j- n( F2 J4 |
每一笔I2C的访问都是随着设备互相之间的ACK后结束的,这就好像你和别人商量个事情,要等到别人答应了,这次对话才算结束;又或者你给别人寄一个包裹,一般要等到收件人收到东西后,给你回了电话,你才会认为东西送到了。 这里的“答应”和“回电话”就等于I2C里面的ACK,这一点在前面都已经反复叙述了,这里不再展开说明(可以戳文段开头的链接回顾哦)。
! f. `$ B) i2 P4 r$ h4 ^我们先来看看下面这张图:
7 A4 F. `/ B+ q+ K$ _. h* j, o
做几点说明,让大家明白讨论内容。
8 F) A6 U$ p# Y" p1 j3 S# Z8 p5 N6 t# ^1.系统串口打印信息如下,表示I2C访问失败:
& s% c+ J; e/ @4 m( z) N5 h' n$ g2 ]+ S7 n' W# G
I2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
0 A2 F; s; g: }: C$ A) P- vI2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed. - j, F4 {9 X3 y) [' B' F
9 w3 s/ _ D1 s# ?% H; T; n( r
2.上图中我在ACK的位置坐了标注,细心的读者只要和下面这张正常的图一比较,就可以看出差别,在ACK的位置,SCL为High/SDA为Low,但是上图确刚刚好相反; 3.我们现在知道在第一个ACK的位置, Slave设备本来应该给出SDA=Low,为了更加清楚的分析问题,我们再来一张说明更多的图。 由前面的说明,我知道是Slave设备出了问题,那么到底出了什么问题呢?
1 I, w } _4 v我们先把最前面那张图的案例分析一下,可能有人已经注意到了图中有一个@-40C,对了,没错!就是我们的交换机放在温箱里面做高低温时,在零下-40C的时候发现的问题。6 I8 r/ b7 @. e' g
& G6 s0 v8 i9 j有人问-40度下,这波形怎么量到的啊? 这明显问到了关键点上, 硬件工程师的辛苦就体现出来。首先要把I2C信号线和串口线分别从板子上焊接出来,再分别连到外面的示波器和电脑上,然后就苦逼地守着温箱,运气好的话很快就能复现问题,运气不好要折腾很久才能trigger到这个issue,真的是一把辛酸泪啊。
% a+ [0 a$ {( T0 s8 |5 g. T解决的问题过程更加复杂,而且并没有什么技术含量可言——说服Supply Chain的人认为是vendor的器件问题,让他们在芯片生产线做Screen的时候,从原来的泡-40/5分钟改为-45/20分钟,把没有margin的芯片筛选掉。这个和Supply chain以及vendor沟通的过程是痛苦的,大公司嘛,不说了,你们懂的……
' B, V4 Z% V: d; l5 g: o; @: A8 S4 C2 _6 v$ M4 K0 J1 X
现在我们知道了器件受环境影响会产生I2C不ACK的问题,下面这张图是另外一种情况,先故设迷局,一起看看下图中有什么问题?
0 H! {+ T$ a0 j( B5 t) e
我承认,这个真的不好发现,以前团队中的某工程师在调试一个Sony的IMX291 Sensor时,CPU通过I2C死活访问不了,最后把波形一点一点在示波器上触发下来看,还是看不出来,这就难怪,没有经验确实很难找。
, J1 C* i4 a7 g6 M: V
! K2 x) ^" b: L9 P我们先来看单次写操作:
# K, o/ l3 e5 ]1 h5 z! P1.Start 1 l5 [ M& h/ V- f- P
2.Master发device address ' y& Y4 c3 C, E
3.Master发 R/W为Write % W, j, \2 ~& K! F2 I! m
4.Slave 回ACK
* H( |4 `7 Y& p w5 t4 l. r5.Master发寄存器地址,也叫Word Address
, K" G; Y( G8 K, d, m6 j6.Slave 再回ACK
# i' R% |; ^1 j! O/ @# y7.Master发要写的数据给Slave
) p& o `/ W. `3 {8.Slave收到数据后回ACK 8 ~# }6 m1 f: b+ Q/ H5 _9 b
9.Master看到ACK后发Stop结束本次操作
& ~4 m% e i2 d: J
) d+ E1 V3 A7 O3 N! {我们再来看单次多操作:
7 L' }8 X; S1 {1 {) P" G) {5 f9 z6 X3 `! s1.Start * `3 S1 R* Z2 A* i
2.Master发device address
2 R: ~7 r- u4 q* f9 R/ K- ~, [4 y3.Master发 R/W为Write
/ w. M& g2 t; U4.Slave 回ACK
. Y8 p8 C L+ i$ Q% E% |5.Master发寄存器地址,也叫Word Address 2 W c; y! z l4 Y$ K" f6 f, r* r
6.Slave收到后再回ACK
- r& U7 S1 ?3 g2 ]" ?7.此时Slave内部的寄存器指针已经知道对应的寄存器地址 P& s6 D5 |, }7 y: r1 {3 v1 R+ \ J
8.Master发start ! Y; s3 x5 w3 l m0 l- q
9.Master再次发device address
0 G, P) p1 T# a9 @: H4 x5 {10.Master 发R/W为Read " |8 R, g6 W; c- k
11.Slave发出ACK
R, ^) r) U" z% r" `; }12.Slave发数据给Slave 8 p: G) c9 M5 C3 @, L
13.Master收到数据后发NAK给Slave 3
6 {% \/ Q3 _5 n% q14.Master发stop结束本次读操作 # A3 e- p6 G0 |% z
# y+ ]! n1 }( n9 T, G所以上图的读操作一共有两个错误,为了防止读者烧脑,我直接标注出来吧:
8 J9 K" ~. n" T& @& U m
不知道大家在前面阅读的时候有没有看出来呢? 特别是第一个Start很容易漏掉,不是老司机一下子真心发现不了。
& V! F% g7 E1 F$ [1 f. t5 ?, \添加了这里漏掉的START和ACK后,我们的Sony Sensor终于可以访问了,所以时刻要注意ACK是否少了。
, W. g, X( r- q% H, _* ?
9 s0 g9 t7 S& `' `, I为了让大家清晰理解,这里给出一张完整的逻辑图,大家在理解时要注意和写操作做对比,然后一定要独立思考弄清楚为什么会有这样的差别?一直到自己彻底想明白了,以后独立解决问题的速度也就会变快。
G: Y+ K. j* R* J9 e: Q最后我再给大家看一张图,请大家自行研究错在哪里? 答案我们将在“第六宗罪”里面揭晓。 ! ?) P, g1 n# {# z' r
注:本文为EDA365电子论坛原创文章,未经允许,不得转载。 : x e0 b/ Y/ ~3 V# |
|