在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。
系统框图如下:
在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,使能CPU B(GPIO电平 3.3V)模块的电源芯片,CPU B开始工作。
经分析,发现是上电时刻CPU A的Rx接收到数据,导致CPU A进入非正常启动状态。
猜想CPU A的Rx端接收到信号的原因可能为:
CPU A发送启动日志数据后 CPU B有回复,造成CPU A的Rx接收到数据;
考虑到CPU A启动后才使能CPU B的电源芯片,于是测试CPU A的控制CPU B电源芯片的引脚。发现在复位后的瞬间会出现一个50us左右的一个使能信号,可能在此时CPU B进入工作接收到CPU A的数据,并回复。
但是,
1、CPU B的启动初始化能否在50us内完成?
2、在115200 bps的波特率下,完整接收玩一个字节需要的时间为10*1/115200=86.8 us。所以,在50us的时间内CPU B还没有收到一个完整的字符。
这种假设不成立。
在使用示波器测量串口Rx上的电平时,发现在Rx出现了方波状带有杂波的波形,电平信号在1.8V左右。1.8V的电平信号,很可能造成Rx端接收异常的数据。
为了使CPU A端的电平确定,尝试在CPU A端添加了1K的强上拉电阻。发现系统确实可以正常工作。此时,测试CPU A端Rx,发现出现的方波状波形在2.4V左右。虽然,这样能够暂时解决问题,但是并没根本解决问题。
在比较新旧两块PCB的时候,发现旧的PCB上在CPU A端Tx Rx存在一个120欧姆左右的小电阻,如下:
旧的PCB在测量CPU A端Rx处的电平时,发现电平为0。
在新的PCB上CPU A端添加两个120欧姆的小电阻后,系统上电时,CPU A端的Rx电平也为0。
所以,此处的根本原因在于串口线上缺少了两个小电阻。
关于小电阻在信号线的作用:
1、抑制信号反射(吸收反射的信号);
2、提高抗干扰能力;
3、防止GPIO被瞬间信号击坏;
4、阻抗匹配(串接和并接的目的是一致的,只是手段不一样)。
参考连接:
信号线时钟线地址线GPIO串联小电阻作用
FROM: http://blog.csdn.net/tietao/article/details/46764033