EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 EDA365_PCB 于 2024-1-22 17:54 编辑
& J& K9 p2 V5 \: N, S$ H0 O4 T7 a; ^* E' o+ D* \" X1 V* N2 D
I2C七宗罪之第五罪——没有ACK怎么办? 8 C7 `) i: u8 C/ P, m2 l% N
EDA365原创 作者:John
- i: {$ e( o! ^- h6 s- I每一笔I2C的访问都是随着设备互相之间的ACK后结束的,这就好像你和别人商量个事情,要等到别人答应了,这次对话才算结束;又或者你给别人寄一个包裹,一般要等到收件人收到东西后,给你回了电话,你才会认为东西送到了。 这里的“答应”和“回电话”就等于I2C里面的ACK,这一点在前面都已经反复叙述了,这里不再展开说明(可以戳文段开头的链接回顾哦)。
1 w$ d/ R0 Q D我们先来看看下面这张图:
5 [$ T* }5 c k: r o- ]
做几点说明,让大家明白讨论内容。 $ n+ i! X* x+ b7 P& W
1.系统串口打印信息如下,表示I2C访问失败:
/ i" [3 Q% G6 C: S D& Z, j. ^1 K3 a& K# l
I2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
+ L' \! o! m5 ?I2C slave device not found num1,addr 0xe2====i2c_send_command_to+scc_rommon send_status Failed.
. ?! O5 ~) Q. d c# A. D! U) H' C# K
7 E" Q$ m5 ]/ u" A! d2 B) @. C2.上图中我在ACK的位置坐了标注,细心的读者只要和下面这张正常的图一比较,就可以看出差别,在ACK的位置,SCL为High/SDA为Low,但是上图确刚刚好相反; 3.我们现在知道在第一个ACK的位置, Slave设备本来应该给出SDA=Low,为了更加清楚的分析问题,我们再来一张说明更多的图。 由前面的说明,我知道是Slave设备出了问题,那么到底出了什么问题呢? + w9 ]1 ~) w. b0 H* H7 k4 h
我们先把最前面那张图的案例分析一下,可能有人已经注意到了图中有一个@-40C,对了,没错!就是我们的交换机放在温箱里面做高低温时,在零下-40C的时候发现的问题。
7 a" n) V, `$ F# G5 I9 @6 ?- v/ s8 v
有人问-40度下,这波形怎么量到的啊? 这明显问到了关键点上, 硬件工程师的辛苦就体现出来。首先要把I2C信号线和串口线分别从板子上焊接出来,再分别连到外面的示波器和电脑上,然后就苦逼地守着温箱,运气好的话很快就能复现问题,运气不好要折腾很久才能trigger到这个issue,真的是一把辛酸泪啊。
! \1 F% m/ H6 ?0 p8 u, P# ?解决的问题过程更加复杂,而且并没有什么技术含量可言——说服Supply Chain的人认为是vendor的器件问题,让他们在芯片生产线做Screen的时候,从原来的泡-40/5分钟改为-45/20分钟,把没有margin的芯片筛选掉。这个和Supply chain以及vendor沟通的过程是痛苦的,大公司嘛,不说了,你们懂的……
9 A, @. _; o" ?4 @6 u) i( A f0 V3 d. ?. J8 R
现在我们知道了器件受环境影响会产生I2C不ACK的问题,下面这张图是另外一种情况,先故设迷局,一起看看下图中有什么问题?
! d" t' M- @& ]: p7 \. l
我承认,这个真的不好发现,以前团队中的某工程师在调试一个Sony的IMX291 Sensor时,CPU通过I2C死活访问不了,最后把波形一点一点在示波器上触发下来看,还是看不出来,这就难怪,没有经验确实很难找。
& n) \& ?* Y' Y# x1 J- h- @; o' b ^2 w5 ? u5 \1 S
我们先来看单次写操作: , T1 x1 b( j$ l# z6 K; A! Q
1.Start - I' l) z2 v. x' V
2.Master发device address
, G6 Y& h! q! W0 U3 w3.Master发 R/W为Write
( Z) D {* Y7 v4.Slave 回ACK
% R5 \& t+ s% P+ I! ?' Z! V# \5.Master发寄存器地址,也叫Word Address $ b5 Q- `( w C5 l- G. Y a
6.Slave 再回ACK : o. b' ]* _) Q6 Y! k' P% g$ d
7.Master发要写的数据给Slave 5 c ]# y& ?2 U) N
8.Slave收到数据后回ACK
2 f; m& ?. u1 {. f! O7 w9.Master看到ACK后发Stop结束本次操作
' @+ ?5 V6 f6 d4 K; b* f7 k ]0 O( v' p
我们再来看单次多操作: ! u z$ `7 E$ v/ ], I$ x- U3 u
1.Start
" W# I4 ?: O7 f" O# j2.Master发device address
y- p) J! R/ l2 m5 A3.Master发 R/W为Write 7 R/ x. B2 @/ S2 c
4.Slave 回ACK ) Q4 i1 z/ e6 k- |7 R
5.Master发寄存器地址,也叫Word Address
2 i8 ]. ^) _5 u! [2 v% L. X M* Q% T6.Slave收到后再回ACK # i, d- Z L2 d- a6 ~
7.此时Slave内部的寄存器指针已经知道对应的寄存器地址
1 H0 Z8 s8 e$ h* O& a8.Master发start 7 o6 Y# z# w% P4 l
9.Master再次发device address
9 _# L, p1 @/ l% X10.Master 发R/W为Read
# ?) u! Z4 O% ~, x* F7 A11.Slave发出ACK 1 E+ j* `1 _0 E, m. V4 q5 U7 o
12.Slave发数据给Slave
! I" a$ ?6 H+ U$ H" Z0 d% d: ^13.Master收到数据后发NAK给Slave 3
/ c _; b; I3 F% F14.Master发stop结束本次读操作
. M' k* K; f, I4 k
& @! q8 S1 G! j! `4 h* Q7 c所以上图的读操作一共有两个错误,为了防止读者烧脑,我直接标注出来吧:
, s' g6 h" S$ F7 y2 T* |1 v% B
不知道大家在前面阅读的时候有没有看出来呢? 特别是第一个Start很容易漏掉,不是老司机一下子真心发现不了。
6 Y& Q0 D3 X# q. K( n5 y! t5 p W添加了这里漏掉的START和ACK后,我们的Sony Sensor终于可以访问了,所以时刻要注意ACK是否少了。
/ g: G' N" e7 r j4 |. e+ `. z' ^; G
为了让大家清晰理解,这里给出一张完整的逻辑图,大家在理解时要注意和写操作做对比,然后一定要独立思考弄清楚为什么会有这样的差别?一直到自己彻底想明白了,以后独立解决问题的速度也就会变快。 . H9 }0 X: ~1 e* @8 y
最后我再给大家看一张图,请大家自行研究错在哪里? 答案我们将在“第六宗罪”里面揭晓。 & g: H a+ p& s$ d
注:本文为EDA365电子论坛原创文章,未经允许,不得转载。
+ F" }5 n" w) ]3 y: R7 ]4 c$ V* \ |