一般我们在设计UART接收模块的思路为:遇到低电平(起始位)启动计数器(计时器);根据双方约定的波特率,在数据位、校验位、停止位的中间进行采样对应的位;计时到接收完停止位完成接收。
根据上述思路,结合实际情况,下面列举出几个笔者自己的想法;
接收完成的位置
在发送方,利用发送板卡上面的晶振提供的时钟进行计时,在接收方,利用接收板卡上面的晶振提供的时钟进行计时。
此时还没有发现什么问题。
但是问题已经出来了,那就是收发双方的晶振是不同的,也是有误差的(例:收发双方都是标称50MHz的晶振,但是实际可能一个50.0001MHz,另外一个是49.9999MHz)。误差的存在,就会导致收发双方对时间的计时有一定的偏差(设计时,认为相同)。
发送方如果有较多的数据需要发送,那么发送方在发送完上一帧的停止位后,会立刻发送下一帧的起始位。
由于双方对计时有误差。如果接收方晶振快一点的话,接收方认为结束时间到了,其实发过来数据的结束时间还没有到,此时不会影响下次接收;如果接收方晶振慢一点的话,接收方认为结束时间到了,其实发过来的数据的结束时间早就过去了,由于发送在数据连续发送时,上一帧结束下一帧立刻开始,那么此时接收方的结束位置就落到下一帧的启动中了(无法检测下一帧的起始位的下降沿)。如果连续发送多帧,误差就会累积,导致无法正常接收(如果监测的是低电平启动,连续的帧数较少时,是可以接收的,一旦较多,就会出现误差)。
解决方案:
让发送方每次发完一帧后发送一段时间的空闲(不太建议)。
让接收方结束时间提前,不要等待接收全部的停止位,而是在采样到停止位就结束(停止位的中间)。那么此时相当于接收方会提前停止,无论接收方的晶振慢还是快(慢不会慢出这段提前结束的时间),都会不耽误下一帧的采样。
有效起始位
一般在检测到下降沿或者低电平就开始启动计时。
当通信线路不稳定时,就有可能出现误启动,导致异常情况的出现。
解决方案:
检测到低电平的持续时间大于正常起始位的一半时间时,才开始接收(后续采样时,注意采样计时的改变)。
加倍采样
一般通过计时的方式在数据位的正中间进行采样。
当通信线路不稳定时,可能会出现采样错误。
解决方案:
通过计时的方式,在时长一位的数据线上,等间隔采样16次;取出16次中间的五次采样结果,五次相同就是此结果、四次相同按照四次相同的结果输出、三次相同按照三次相同的结果输出(但是标志此时的线路通信不稳定)。
本篇内容中有部分资源来源于网络,如有侵权,请联系作者。
448