|
楼主 |
发表于 2012-2-19 17:31:53
|
显示全部楼层
接着就是实现接收部分了,类似的,接收部分也采用移位输入寄存器,跟移位计数器来计算移入的位数,
当移位寄存器空闲时,我们就期望从RDX上检测到一个低电平的起始位,然后开始计数.当计数达到最后一个位,也就是停止位时,检查该数据位上的内容,如果是高电平,就产生一个接收有效的信号,把移位寄存器的内容送到接收缓冲区保存.否则认为出错,扔掉该则数据.
但是由于RDX是一个异步数据,它的发送时钟跟我们的接收时钟的相位不是相同的,而且频率也可能存在一定的误差,如果我们启始位刚好采在靠近边缘上的,而有误差的频率会让我们后面的某几个位的采样出错.这就导致了我们采样有问题.
按照UART的时序我们知道有一个起始位,所以我们可以用这个从位来同步我们的接收时钟,现在的想法是,我们把接收时钟提高到指定频率的N倍,然后我们检测到RDX从高变低时,我们就开始计数,这样计N个时钟,刚好就是一位,而我们跟输入数据的最大不同步时间也只有 1/N 位.
那我们就弄一个N倍的时钟,然后一个最大为N的计数器,再有一个寄存器,记下我们同步时刻的时钟值,以后一到达这个数值,我们就认为一位的时间到了.
然后考虑采样的问题,我们可以在中间点采一次,也可以在中间点前后采三次,然后投票法表决一下,还有一个更好的想法是N个采样点采样值取平均,这样可以提高我们的抗干扰能力.决定采用最后一种办法,N次采样的值累计,如果结果达到或超过 N/2则认为输入是1,否则认为输入是0 减少了因为意外干扰产生的误码.
------------修改新增以下内容--------------------
另外,在启始位上,为了防止有扰动错误的引起一个数据帧的开始接收,所以加入了连续 N/2 次检测到低电平时,才认为一个起始位的存在,为什么不是连续检测 N次更可靠呢,因为如果存在时间频率误差,你可能永远都得不到一个N位的连续低电平,所以只检测了 N/2 次. |
|