一、概述
最近遇到一个特别奇怪的问题:客户一个mpsoc的板子,在改板后,启动模式设置成emmc无法启动。而且在上电几秒内,连复位键都不起作用。按道理按复位必然重启,这是硬件逻辑,不可能出现这种情况。
二、问题分析
1.问题复现
到客户现场后,打开秒表计时,同时拍摄视频用于逐帧精确分析。结果发现实际上并不止几秒,而是大概13秒左右才会响应复位。
2.原理图分析
经过审查原理图,板卡的上电顺序为
PS AUX -> PS PLL -> PS MGT -> PS IO -> PS DDR
而复位PS_SRST_B和PS_POR_B都接到了PS AUX,也就是在复位释放的时候io和emmc都还没准备好。所以这时候没法正常启动。
彻底的解决方案是把复位的电源接到最后一个电源上,不改版折衷的情况,加电容延后复位信号,让复位在电源正常后再变高。这个电容值要仔细测试,并且要考虑到批量生产时电容容值的精度,以及高低温下容值的变化,要留出足够的裕量。
3. 为什么上电十几秒内复位键不起作用
原理图上的复位按键是接在PS_SRST_B上。在ug1085的Ch38: Reset System这章有说明,上电时会先执行csu rom,由csu加载boot,根据boot是否为secure模式来决定是否使能PS_SRST_B。
客户这种情况刚好一直读不到boot,导致卡在这里,一直等到超时PS_SRST_B才能正常工作
因此只有接在PS_POR_B上才能保证任意时刻都能复位。官方的开发板比如zcu104和zcu106都是PS_SRST_B和PS_POR_B两个都接,只接一个复位按键的情况下建议保留PS_POR_B而不是PS_SRST_B。
4. 深入分析
但是为什么是十几秒这个值一直困惑着我,由于现场没有示波器无法抓波形,只能暂时搁置了。直到这周调另外一块板时,发现了这个波形
图里这两段波形是qspi模式下BootROM两次读取boot时抓取的,间隔是415ms。
而32*0.415=13.28秒
怀疑是MultiBoot模式下重试了32次导致的,暂时手头没有带emmc的开发板,后续还需要找到板卡实际验证这个猜想
MultiBoot原理可以参考UG1085的Ch11 Boot and Configuration