UART是以异步方式实现通信的,其采样速度由波特率决定,波特率产生器的工作频率可以由PCLK(外围设备频率),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%
其错误容忍率大于1.86%,因此在12MHz频率下,波特率不能设置为115200,现在将波特率设置为56700bps,采用8N1数据帧格式通信,那么:
UBRDIVn = (int)(12M / (57600 * 16)) - 1 = 12
tUPCLK = 13 * 16 * 10 / 12M = 0.000173
tUEXACT = 10 / 57600 = 0.0001736
UART Error = | 0. 000173 - 0. 0001736 | / 0. 0001736 = 0.345%
采用波特率为56700bps,8N1数据帧格式通信时,其错误容忍率小于标准的1.86%,因此可以正常工作。
图2-61 MINI2440开发板串口硬件图
UART的接口
图2-61为MINI2440开发板引出UART串口接线图,它采用DB9接口公头(有接线柱的端口,只有接线孔的为母头),其有9根信号线,UART通信过程中用到了信号线2 RSTXD0(数据发送管脚)它和串口线母头TXDx信号线相接(x代表0号,1号,2号串口),信号3 RSRXD0(数据接收管脚)和串口线母头RXDx相接(x代表0号,1号,2号串口),信号线5(接地管脚),信号线7 RSCTS0(数据发送流控制管脚)和串口线母头nCTSx相接,信号线8 RSRTS0(数据接收流控制管脚)和串口线母头nRTSx相接。如果UART中没有开启AFC流控的话,只要用到信号线2,信号线3和信号线5。
图2-62 MINI2440串口管脚接线 |