微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 谁做过uart的进来

谁做过uart的进来

时间:10-02 整理:3721RD 点击:
怎么理解UART 的发送和接受时钟是异步的?

比如说,你调试开发板的时候,讲开发板连接到电脑上,用串口小助手接收调试信息。开发板用的是开发板上的时钟,而串口小助手用的是你台式机电脑上的时钟,他们俩当然是异步的啦。

但是同处一个UART的收发模块是同步同波特率的,对吧?

同波特率是对的,但不是同步。通讯两设备间的时钟不是同一个时钟源产生的,存在频率和相位的差异,所以是异步的。

我的意思是全双工的UART内部同端的接受模块和发送模块,应该是同时钟的了

同一端自然可以用同一个时钟来发送和接受数据。在串口接收端内部,是用高速时钟对信号进行采样,通常是16倍数据波特率(也有用8倍的),而发送端则需让信号持续16(或8)个时钟周期即可。因为是多倍采样,每一次传输又有起始位和停止位分隔开,所以UART传输对时钟的要求不太严格。
如果非要用不同时钟,理论上也并无不可,只要保证时钟能满足数据波特率要求,接收缓冲器和发送缓冲器都能与上位机交换数据就行。说白了,接收与发送是分开的。不过,我想一般人都不会自找麻烦,弄出两时钟来吧?

实际中我用过不对称的收发时钟,多数UART也是支持这一功能的,比如收115200,发9600

谢谢了
再请教下:发送时波特率发生器产生的16倍分频时钟时给外部接收端做采样时钟吗?

串口只需三条线:TX,发送数据线,RX,接收数据线,还有一根地线。是没有时钟的,要不然怎么说是异步呢?时钟是由接收端本地产生的,以16倍波特率对RX进行采样。
你找本书或在网上搜一下串口的标准,再去下个开源的IP核,分析一下代码就明白了,比我说的要清楚。

那我用系统时钟每16个周期采一次数据,那不是就不用这个分频出来的时钟了?
疑惑中。

7# qushaobo
您用不同波特率传输的话,应该会接收出错吧?(因为协议要求必须同波特率吧)
不然就是您发送之后,对数据有个存储,在以不同的波特率发给接收端的吧?

10# zhangjiaxun
我理解是这样的,本来就是用正常的波特率传输(比如9600),但是为了降低传输的误码率,采用16倍波特率的时钟采样!这样可以降低误码率。
我也是用16倍波特率做的设计,验证成功。只是目前不能实现全双工,只做成半双工通信,不知道您有这方面建议不?谢谢

楼上,你的意思是16分频的时钟是给RECEVIER用的?可是我怎么看到有的设计是给TRANSMITTER用的? 我还是不知道给TRANSMITTER有什么用?甚至本身这个16分频出来的时钟有什么用?

本人对UART非常熟悉,擅长用verilog语言编写UART收发电路。我来给你讲讲:
(1)若外部接口提供时钟信号CLK1,你的接收电路用此时钟clk1进行数据解调,那你的接收电路就与外部设备的发送电路同步(同一个时钟源),但要注意,由于传输延迟的原因,往往外部设备采用CLK1的上升沿发送数据,而你的接收设备就必须采取下降沿进行数据接收(反之亦然),如同步RS485通讯。
(2)若外部设备采用CLK1发送数据,但外部设备不提供时钟信号CLK1,那你就需要自己提供解调时钟源CLK2(发送与接收不同时钟源,称为异步电路),并且CLK2的频率F2需要为CLK1的频率F1的整数倍(F2 = n *CLK1,n通常为16,且越大越好),接收电路在每16个CLK2的中点(第8个CLK2)采集一个数据位,这样就能保证接收电路的采样波特率与发送电路的波特率一致(虽然外部发送设备未提供采样时钟,但接收电路仍可以以同样的波特率进行数据的接收)。如异步RS422通讯。

再说点多余的,供大家参考:通常的异步RS422接收,由于每个字节中间有间隔(起始位及停止位),所以接收电路的硬件协议门阵代码的编写还是比较容易的,最难的异步串行数据接收莫过于PCM数据流的接收,由于数据是连续不断的发送与接收(),所以要从外部设备发来的数据流中提取出时钟源CLK,再用此CLK进行数据的解码,由于此数据的连续性,所以解码出来的CLK要不断进行调整,才可以稳定的进行数据的接收。
呵呵!大家要想在串行通讯方面长进的话,不妨自己动手设计一下PCM流的发送与接收。本人目前也只编写了发送代码,接收更难,有兴趣大家试试看。

15# sanfeng216
恩,很有用哦谢谢您了!想问您有没有做过硬件上的RS232与PC机的“全双工”通信呢?调试PC机端串口时,
您用的软件是什么?我用“串口调试助手”,可是好像不能成功?谢谢您哈!

13# zhangjiaxun
是16倍频,也就是传输波特率的16倍啊~不是分频。
理论上你也可以不要16倍频,采用波特率通信就可以了,但是为了提高误码率才这样做的。这样以后,你那个波特率时钟就相当于没有用了,它只是双方的一种协议,你需要保证每波特率时钟接收(发送)一位就好了。所以接收端是最好16倍频的,这样保证正确无误的接收;而发送端,我觉得无所谓了,不一定要倍频,只要你保证是以相同波特率发送的就可以了!

虽然说是16分频时钟采样,但是有时候就是用中间三个数据,3取2来定下这个数即可。



    您好,我想咨询您一点问题。我现在也是初次接触uart,要进行串口通信,自己设计一个uart,遵循的是rs232协议。我现在不明白的是,要是我这设计一个uart,与pc机上的串口通信,那么我的uart在接收到串口的数据时,是需要每隔16个时钟周期采样一次,还是每一个时钟周期都会发送过来1bit的数据。这里的时钟周期的意思是指基于波特率而转换过来的,
   因为我看到的关于uart的设计,是在接收到数据位时,每隔16个周期采样一次。然后又看到了一个说的是每个周期采样一次。
   因此,可能是我在这里搞混了,不是很明白。

学习了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top