UART串口接收模块设计(工业环境)
上次笔记记录过UART发送协议,回顾一下UART发送端发送一个字节数据时序图:
对于其中的每一位进行采样,一般情况下每一位数据的中间点是最稳定的,因此一般应用中,采集中间时刻时的数据即可,如下图所示:
(实验室条件)
但是在工业应用中,往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。
以下为改进型的单bit数据接收方式示意图:
在这张图中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此这两段时间的电平无效,采集时直接忽略。而中间这一时间段(用绿色标出),数据本身是比较稳定的,一般都代表了正确的结果。但是也不排除该段数据受强电磁干扰而出现错误的电平脉冲,因此对这一段电平,进行多次采样,并求高低电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。例如,采样6次的结果分别为1/1/1/1/0/1/,则取电平结果为1,若为0/0/1/0/0/0,,则取电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通信线路环境非常恶劣,数据不具有可靠性。
串口发送模块包含两个主要组件:
1、 起始位检测进程
2、 波特率产生模块
3、 数据接收进程
串口接收模块整体结构体
串口发送模块详细结构图
波特率时钟计算:
系统时钟周期为System_clk_period
波特率 |
波特率周期 |
波特率分频计数值 |
System_clk_period = 20计数值 |
9600 |
104167ns |
104167/ System_clk_period/16 |
325-1 |
19200 |
52083ns |
52083/ System_clk_period/16 |
163-1 |
38400 |
26041ns |
26041/ System_clk_period/16 |
81-1 |
57600 |
17361ns |
17361/ System_clk_period/16 |
54-1 |
115200 |
8680ns |
8680/ System_clk_period/16 |
27-1 |
部分代码详情查看附件文档)
发送数据效果以及仿真:
文章评论(0条评论)
登录后参与讨论