最近有个想法,就是用逻辑分析仪维修苹果手机,因为手机在开机过程中,CPU要和各个I2C总线上的设备通信,这些设备有灯光升压IC、充电IC、显示供电等等,如果能抓取开机过程中通信数据解析出来,这就好像是老师上课点名一样,那个应答了,那个没有一答,都可以看出来,没有应答的肯定就有问题了,应答了的再看看返回数据正常不……我觉得这样有修手机才有灵魂。
于是,我先用逻辑分析仪抓取了苹果6开机的I2C通信时序
果然发现类似Write to [0xF4]+ACK之类的解析结果,很明显示,这是向地址为F4(十六进制)的IC发送了写命令,后面又跟了0x00+ACK,0x2D+NAK,这可以看出在在开机第6.7秒时向地址为F4的器件写了数据002D。
那么问题来了,我怎么知道这个地址为F4的是那个器件呢?于是,我想到了I2C地址扫描器,根据I2C通信协议,每个从器件内部都有个地址匹配单元,当总线上地址和自已地址匹配时,会在第8个时钟(读写控制)之后拉低SDA总线“应答”,所以用一个程序从1到127依次发送地址信号,如果发现有应答信号,表示该器件地址就是这个号。就好像老师不知某个学生的学号,班上有51个人,那就从1号到51号叫号,叫到那学生应答了,该学生就是这个号一个道理。
我这个人有个特点,想做的事立马就做。
接下来就是选平台,51/AVR/PIC/SMT8/STM32/Arduino/树莓派/Micro bit这些都可以,我上网查了一下,AVR在这方面资料不多,那就AVR吧,做好了,整理成资料也可以给学习AVR的同学一个思路。
我手头刚好有块AVR开发板,就用这个来做吧,数码管显示是现成的,就不用自已接线了,可以缩短开发时间。
因为一是为了做个扫描器,二是为了给其它学习AVR的一个思路,所以在I2C电路上并没有采用AVR自带的硬件I2C电路,而是用软件模拟I2C,这样通过程序,大家能更加明白I2C通信协议。
通过一天的奋斗,这个I2C地址扫描器终于做成了,成功的把一个1602串口屏的地址扫描出来了,地址是63,换成十六进制是0x3F。我设计是当找到匹配地址时有一个白色LED灯亮起并退出扫描程序。
成功找到地址
找到应答信号
从1开始描描,在3F时收到应答ACK信号
不忘初心,我最初目的是为了扫描苹果主板上的IC吧,就先测试码片吧,手头刚好有个精诚的码片测试座,在左下角预留了I2C接口,我焊上4根线,然后对应和“扫描器”相连,然后从苹果6废板上拆下个逻辑码片,放上,再用扫描器扫描。
很容易找到地址
苹果6逻辑码片地址80(0x50)
这里需要说明的是0x50(1010000)是8位地址,是加了读写信号的,其真实的7位地址是0x28(101000)
0x50收到应答信号
最后,我还是要把所有源程序付上,该程序在Atmel Studio6下编译并下载到板上测试成功,请放心参考。
包含/预处理/申明
初始化
中断/显示/按键
I2C扫描
发送启动/停止信号
发送地址/返回应答
主程序