由于EEPROM的IIC驱动是用模拟IO写的
1.用示波器抓IIC的波形
2.将SDA和SCLK和GND引脚用线引出,探头连接
3.检查并确保探头衰减是X1而不是X10。
4.软件触发写EEPROM,示波器设置下降沿捕获
5.如果有波形,对波形进行Decode,看解码出来的数据是否与写入EEPROM数据移植(首先看写的地址信息正不正确)
OK,示波器写EEPROM波形排查没问题
6.排查软件问题
7.清除EEPROM里面的DTC故障码后,在软件复位或者重新上电会从DTC码中读出DTC的8个状态位
8.先清除DTC码,下电或者软件复位
9.打断点在上电读EEPROM的地方
10.目前系统有86个故障,对应86个DTCCode,问题出错在后面49号故障,但是这86号故障通过For遍历的,打断点也有技巧,右击Breakpoint Properties断点属性内设置Condition(i == 49)(调试平台为S32DS3.5)
11.到断点后,查看该变量的内存,先找到地址加载在Memory窗口展开,发现49号故障之后并不是自己想要的值。
先说一下出错原因:
该函数是先将EEPROM的数据读出到一个很大的局部数组A[430],然后再从数组数据依次拷贝到DTC结构体,但是这个函数在一个任务里面跑,这个任务只分配了256字节的堆栈,而局部数组太大,导致堆栈溢出。
解决方法:1.将数组设为全局数组
2.或者For遍历从EEPROM读出拷贝到DTC结构体内(该种方法会增加EEPROM读次数)