微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440 UART串口驱动

S3C2440 UART串口驱动

时间:11-20 来源:互联网 点击:
外围设备频率),FCLK/n(CPU工作频率的分频),UEXTCLK(外部输入时钟)三个时钟作为输入频率,波特率设置寄存器是可编程的,用户可以设置其波特率决定发送和接收的频率。发送器和接收器包含了64Byte的FIFO和数据移位器。UART通信是面向字节流的,待发送数据写到FIFO之后,被拷贝到数据移位器(1字节大小)里,数据通过发送数据管脚TXDn发出。同样道理,接收数据通过RXDn管脚来接收数据(1字节大小)到接收移位器,然后将其拷贝到FIFO接收缓冲区里。
(1)数据发送
发送的数据帧可编程的,它的一个帧长度是用户指定的,它包括一个开始位,5~8个数据位,一个可选的奇偶校验位和1~2个停止位,数据帧格式可以通过设置ULCONn寄存器来设置。发送器也可以产生一个终止信号,它是由一个全部为0的数据帧组成。在当前发送数据被完全传输完以后,该模块发送一个终止信号。在终止信号发送后,它可以继续通过FIFO(FIFO)或发送保持寄存器(NON-FIFO)发送数据。
(2)数据接收
同样接收端的数据也是可编程的,接收器可以侦测到溢出错误奇偶校验错误,帧错误和终止条件,每个错误都可以设置一个错误标志。
l溢出错误是指在旧数据被读取到之前,新数据覆盖了旧数据
l奇偶校验错误是指接收器侦测到了接收数据校验结果失败,接收数据无效
l帧错误是指接收到的数据没有一个有效的停止位,无法判定数据帧结束
l终止条件是指RxDn接收到保持逻辑0状态持续长于一个数据帧的传输时间
(3)自动流控AFC(Auto Float Control)
UART0和UART1支持有nRTS和nCTS的自动流控,UART2不支持流控。在AFC情况下,通信双方nRTS和nCTS管脚分别连接对方的nCTS和nRTS管脚。通过软件控制数据帧的发送和接收。
在开启AFC时,发送端接收发送前要判断nCTS信号状态,当接收到nCTS激活信号时,发送数据帧。该nCTS管脚连接对方nRTS管脚。接收端在准备接收数据帧前,其接收器FIFO有大于32个字节的空闲空间,nRTS管脚会发送激活信号,当其接收FIFO小于32个字节的空闲空间,nRTS必须置非激活状态。如图2-60所示。


图2-60自动流控数据传输
(4)波特率
在UART中波特率发生器为发送器和接收器提供工作时钟。波特率发生器的时钟源可以选择S3C2440A的内部系统时钟(PCLK,FCLK/n)或UEXTCLK(外部时钟源),可以通过设置UCONn寄存器来设置波特率发生器的输入时钟源。通常我们选择使用PCLK作为UART工作时钟。
UART控制器中没有对波特率进行设置的寄存器,而是通过设置一个除数因子,来决定其波特率。其计算公式如下:

UART除数(UBRdivn)= (int)(CLK/(buad rate * 16 )) - 1

其中:UBRdivn的取值范围应该为1~2^16-1。例如:波特率为115200bps,PCLK时钟为其工作频率,采用50MHz,UBRdivn为:

UBRdivn = (int)(50M / (115200 x 16)) - 1 = 26

在系统时钟未初始化时,PCLK = 12MHz,如果波特率采用57600bps,那么UBRdivn为:

UBRdivn = (int)(12M / (57600 x 16)) - 1 = 12

当使用外部时钟源时,如果外部时钟小于PCLK时钟,则UEXTCLK应该设置为0。
(5)波特率的错误容忍率(Baud-Rate Error Torlerance)
数据信号在传输过程中由于外界电磁干扰,信号减弱等原因,当时钟频率较低,传输速率较高时会产生误差,当误差达到一定值时,会出现数据信号不能正常识别,造成通信异常。好比如,在普通列车轨道上试图行驶高速列车一样,由于高速列车对轨道要求很高,当速度达到一定程度,很可能造成事故。业界的波特率的错误容忍率为1.86%(3 / 160),如果大于该值则应该选择较低的波特率或提高输入时钟频率。
错误容忍率计算公式为:

UART Error = (tUPCLK - tUEXACT)/ tUEXACT * 100%

注:tUPCLK为UART的真实工作时钟频率:tUPCLK = (UBRdivn + 1) * 16 * 1Frame / PCLK
tUEXACT为UART理想工作时钟频率:tUEXACT = 1Frame / baud-rate
其中:1Frame为数据帧的长度=开始位+数据位+可选校验位+停止位
假如,波特率采用115200bps,PCLK时钟为50MHz,波特率除数因子UBRdivn为26(通过前面UBRdivn计算公式算出),采用1个停止位,8个数据位,无校验的8N1方式通信时,其错误容忍率为:

tUPCLK = 27 * 16 * 10 / 50M = 0.0000864
tUEXACT = 10 / 115200 = 0.0000868
UART Error= | 0.0000864 - 0.0000868 | / 0.0000868 = 0.46%

在开发板没有初始化系统时钟前,开发板工作在12MHz下,假如我们将波特率设置为115200bps,采用PCLK为系统默认时钟12MHz,8N1数据帧格式通信,那么:
UBRdivn = (int)(12M / (115200 * 16)) - 1 = 6
其错误容忍率:

tUPCLK = 7 * 16 * 10 / 12M = 0.0000933
tUEXACT = 10 / 115200 = 0.0000868
UART Error = | 0.0000933 - 0.0000868 | / 0.0000868 = 7.5%

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

网站地图

Top