问题描述:
交换芯片+主控CPU,CPU通过SMI控制交换芯片,CPU提供复位信号和25MHz时钟给交换芯片,交换芯片与CPU数据报文交互通过RMII。主控CPU在boot汇编代码执行交换芯片的复位和25MHz时钟初始化。系统上电可以正常启动,并进入APP。当反复热重启系统(同一台板子热重启次数固定),交换芯片死机(主控CPU通过SMI访问交换芯片,没有任何响应)。断电重启,系统恢复正常。
问题分析:
交换芯片还没有准备好,已经开始读取或写交换芯片寄存器;
频繁复位交换芯片;
交换芯片复位时间不够;
复位信号异常;
复位信号和时钟时序问题;
排除:
断开MDIO和MDC的连线,现象仍旧存在;
断开交换芯片和CPU的复位连线,现象消失;单独搭了交换芯片的最小系统,反复热重启,不存在死机现象;
修改boot代码,延长复位时间,现象仍旧存在;发现复位型号存在异常,复位信号不是固定低电平一段时间然后固定高电平,而是持续一段时间低电平之后,一段时间高电平,然后再一段低电平,最后再固定高电平;
检查代码,因为CPU的复位输出管脚上电默认是低电平,所以为了保证时钟输出和复位信号同步,才产生上边描述的信号,修改复位信号,现象仍旧存在。
到了这里,唯一能影响交换芯片工作的似乎就是时钟了。交换芯片支持两种时钟源:外部25MHz直接输入或者25MHz晶振。断开CPU和交换芯片的时钟连线,焊接上交换芯片预留的独立晶振,现象消失;
仔细检查电路,发现交换芯片使用CPU提供的25MHz时钟,但交换芯片的外部晶振引脚1却焊接了一只20pf的电容。修改20pf电容为下拉电阻,现象消失;拆掉20pf电容现象消失;
注:交换芯片资料已经提交当使用外部时钟是,晶振的引脚1需要接地,晶振的引脚2需要悬空。但是我们硬件工程师错误的认为引脚1的电阻仅是预留,并且错误的制作了bom。
总结:
当SOC支持多时钟源时,一定要注意其他时钟源引脚的初始状态。对于影响SOC工作的情况,需要首先着手进行下面的验证:电源是否稳定、电源启动时序、时钟和复位信号。