以数据55为例,描述串口是如何接收55这个数据
对于串口接收而言,rx体现在硬件上之后一根线,数据以高低电平的方式在这个线上传输;根据异步串行通信协议来说,空闲状态是高电平,开始位是以低电平开始的,如下图所示
在这里我们选取数据帧的格式位1个起始位,8个数据位,0校验位,1停止位(1+8+0+1)
在串口的接收模块中,由于数据帧的定义格式,我们需要完整的8个数据位首先存储一下,因为我们只有一根线rx,这里我们在模块内要串行数据转换为并行数据暂时存储
55(H) = 0101 0101(B),先传低位的数据1,然后是0,然后是1,依此类推。
当我们传送55的低位的1的时候,也就是8h80(1000 0000),然后传送第二,此时的8位存储器变为8h40(0100 0000),然后是低位第三位1,此时存储器变为了8ha0(1010 0000),依次类推,这里用了一个移位的模式;
-1.首先当我们检测到rx出现下降沿的时候(通过边沿检测电路)我们拉高一个flag信号(rx-flag),当flag信号拉高的时候我们要开始波特率计数(传送一个比特需要多少个时钟周期),当完成一个比特传送的时候,我们对比特率计数器加1,标志信号flag拉低的的标识是我们传送完毕数据位和停止位
2.我们选择在每个波特率计数器到中间的时候取样,将这个信号存储在8位reg中,这里体现的是每个bit-flag都在rx中间计数,并且在bit-flag之后的8位reg的rx-data也会变化,依次80——40——a0——50——a8——54——aa——55,最后55表示传送完毕,还要加上后面rx为高电平表示进入空闲状态,此时将rx-flag拉低,为后面的数据传输做准备
parameter CLK_FREQ = 50_000_000;
parameter UART_BPS = 9600;
localparam BPS_CNT = CLK_FREQ / UART_BPS;
怎么理解波特率计数器?
当我们选择9600bps的时候,表示每一秒传送9600个比特的数据,——(9600bit/s),那么传送一个比特需要1/9600秒;当时钟周期是50Mhz的时候,我 可以得到一个时钟周期所占用的时间是1/50_000_000秒(20纳秒);1/9600秒中有多少个1/50_000_000秒就表示传送一个比特需要多少个时钟周期,也就是(1/9600)➗(1/50_000_000)————————》即为CLK_FREQ / UART_BPS。
————————————————
版权声明:本文为CSDN博主「cyzbz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cyzbz/article/details/113665159