本文主要是介绍注意UART的抗干扰设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
注意UART的抗干扰设计
一. 引言
产线最近出现多台设备启动卡死的问题,卡死在uboot启动界面,如下图所示。复现问题的时候,发现卡死的现象随着问题A53核心板走。因此联系核心板供应商,对方给出的可能原因是串口上有脏数据,导致进入uboot命令模式。相应的解决办法是:bootdelay改为-1,不进入uboot命令模式即可。修改以后,仍会出现启动卡死的现象,但打印信息提示的是eMMC未识别成功,但发生卡死的概率已大大降低。
本文中只分析UART上干扰的影响,eMMC未识别的原因及其影响暂时先不讨论。
二. 原因分析
通过串口调试助手,查看打印信息,发现当卡死在logo显示阶段,打印信息显示已进入uboot命令模式。如下图所示,说明有UART上有脏数据,导致误入uboot命令调试。
为什么会进入uboot命令模式?
uboot启动以后会进入3s倒计时。如果在3s倒计时结束之前,调试串口UART上输入任何字符,那么就会进入uboot的命令模式,反之,3s结束后就会自动启动linux内核。因此,首先要排查UART上的RX信号。
检测UART的RX线上波形,发现噪声较严重。如下图所示,大多数情况下,噪声信号幅度在0.6V以内,不会出现电平误判,但偶尔会出现0.8V以上幅度大小的噪声信号。
查阅i.MX8M芯片的资料,该芯片的UART采用的电平标准是LVTTL,如下图所示。
LVTTL又分为3.3V、2.5V以及更低电压的LVTTL,其电平判定标准如下:
按照3.3V的LVTTL电平标准,对于0.8V~2.0V之间未定义的电平信号,是有可能产生电平误判的。
如图7所示,UART的一个数据帧包含1个起始位、7位有效数据、1个奇偶校验位以及1~2个停止位。当没有数据传输时,UART要求通信线路保持高电平,即“1”,每当有效数据传输之前,UART要求先发送一个bit宽度的低电平,即发送一个“0”,用于标识一帧通信数据的开始,即起始位。校验位是一个可选位,可有可无,用于检查数据传送的正确性。停止位是一帧通信数据的结束标志,必须是高电平,即“1”,其宽度可以是1位、1.5位或2位。
在内核启动之前,UART上的RX线上一直为低电平,即处于非空闲状态,当RX线上出现一个0.8V以上的干扰,误判为高电平,并作为停止位,那么是会造成错误通信数据的。当这个错误数据正好发生在uboot启动后的3s倒计时,就会进入uboot命令模式。
那么怎么消除UART上的脏数据影响呢?
三. 整改措施
1. 从软件角度来说,可以增加防干扰设计,比如增加奇偶校验,对于关键指令,可以多次验证。对于本次误入uboot命令模式的问题,更是可以简答粗暴的不响应UART。
2. 从硬件角度,增加上拉电阻,也可以极大提高UART的抗干扰能力。如图8所示,在RX上增加上拉电阻,通过10K电阻接到3.3V,极大抑制了RX上的干扰信号。
这篇关于注意UART的抗干扰设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!