IC验证之UART模块
1.UART 模块
1.1UART 工作原理
通过异步收发器(UART)用来传输串行数据。UART之间以全双工方式传输数据,最精简的连接方法只有三条连线:TXD用于发送数据,RXD用于接收数据,Gnd给双方提供参考电平。
UART使用标准的CMOS逻辑电平(0—5V、0—3.3V、0—2.5V或0—1.8V四种)来表示数据,高电平为1,低电平为0。为了增强干扰能力,提到传输长度,通常将CMOS逻辑电平转换为RS-232逻辑电平(3—15V以0表示,-3 — -15V以1表示)。TXD、RXD数据线以“位”位最小传输单位,传输数据包括1位起始位、5—8位数据位、1位奇偶校验位(可选)和1—2位停止位。低位在前,高位在后!
传输数据之前,UART之间要约定数据的传输速率(即每位所占时间,其倒数成为波特率)、数据的帧格式(即有多少个数据位、是否使用校验位、是奇校验还是偶校验、有几位停止位等)。
UART IP结构如下,可以看出,接收FIFO是16x12bit,而发送FIFO是16x8bit。
这是因为接收FIFO中多了4个状态位,包括帧错误、校验错误、中断错误和复写错误。
1.2UART 模块初始化流程
UART中常用的寄存器有控制寄存器UARTCR、线控寄存器UARTLCR_H、FIFO中断阈值寄存器UARTIFLS、波特率寄存器(整数部分UARTIBRD、 小数部分UARTFBRD)、DMA控制寄存器UARTDMACR、标志寄存器UARTFR等。
(1)在配置uart的寄存器前,将控制寄存器UARTCR的bit0置低,取消模块使能。
(2)配置波特率寄存器。
(3)配置线控寄存器
bit0:是否发送break。
bit1:是否使能校验位。
bit2:奇偶校验选择。
bit3:1bit或2bit停止位。
bit4:是否使能FIFO。
bit5-6:数据位宽度选择,00-5bit,01-6bit,10-7bit,11-8bit。
bit7:固定校验位选择,一般不用,若该位为1,则校验位被固定为0或1,所以数据位后和校验位前会多出一个bit,用来满足奇偶校验要求。
(4)配置FIFO阈值寄存器。
(5)配置DMA控制寄存器UARTDMACR
bit0:RX DMA使能。
bit1:TX DMA使能。
bit2:DMA error。
这里的DMA指的是标准DMA IP,具体的源地址和目的地址、传输字节大小、位宽、DMA中断号等需要在DMA中设置。可参考IC验证之DMA使用
(6)配置控制寄存器URATCR,并且使能UART模块
bit0:使能uart模块。
bit8:发送使能。
bit9:接收使能。
bit14:RTS硬件流控。
bit15:CTS硬件流控。
(7)中断屏蔽寄存器UARTIMSC。
需要特别注意的是,虽然手册里说明写入1代表屏蔽该中断,但是实际上是写入1代表使能中断;写入0代表屏蔽中断!
2.UART 流控信号
在RS232中本来CTS与RTS有明确的意义,但自从贺氏(HAYES)推出了聪明猫(SmartModem)后就有点混淆了。在RS232中RTS与CTS是用来半双工模式下的方向切换;HAYES Modem中的RTS,CTS是用来进行硬件流控的。通常UART的RTC、CTS的含义指后者,即用来做硬流控的。
硬流控的RTS、CTS:RTS(Require To Send,发送请求)为输出信号,用于指示本设备准备好可接收;CTS(Clear To Send,发送清除)为输入信号,有效时停止发送。假定A、B两设备通信,A设备的RTS连接B设备的CTS;A设备的CTS连接B设备的RTS。前一路信号控制B设备的发送,后一路信号控制A设备的发送。对B设备的发送(A设备接收)来说,如果A设备接收缓冲快满的时发出RTS信号(意思通知B设备停止发送),B设备通过CTS检测到该信号,停止发送;一段时间后A设备接收缓冲有了空余,发出RTS信号,指示B设备开始发送数据。A设备发(B设备接收)类似。上述功能也能在数据流中插入Xoff(特殊字符)和Xon(另一个特殊字符)信号来实现。A设备一旦接收到B设备发送过来的Xoff,立刻停止发送;反之,如接收到B设备发送过来的Xon,则恢复发送数据给B设备。同理,B设备也类似,从而实现收发双方的速度匹配。
半双工的方向切换:RS232中使用DTR(Date Terminal Ready,数据终端准备)与DSR(Data Set Ready ,数据设备准备好)进行主流控,类似上述的RTS与CTS。对半双工的通信的DTE(Date Terminal Equipment,数据终端设备)与DCE(Data circuit Equipment )来说,默认的方向是DTE接收,DCE发送。如果DTE要发送数据,必须发出RTS信号,请求发送数据。DCE收到后如果空闲则发出CTS回应RTS信号,表示响应请求,这样通信方向就变为DTE->TCE,同时RTS与CTS信号必须一直保持。从这里可以看出,CTS,TRS虽然也有点流控的意思(如CTS没有发出,DTE也不能发送数据),但主要是用来进行方向切换的。
如果UART只有RX、TX两个信号,要流控的话只能是软流控;如果有RX,TX,CTS,RTS四个信号,则多半是支持硬流控的UART;如果有RX,TX,CTS,RTS,DTR,DSR六个信号的话,RS232标准的可能性比较大。
顺便提一下:
DCD( Data Carrier Detect, 数据载波检测):DCE向DTE指示,线路上检测到载波。
RI(Ring Indicator,振铃指示):DCE向DTE指示,有呼叫接入
3.Modem
调制解调器(英文名Modem),俗称“猫”,是一种计算机硬件。它能把计算机的数字信号翻译成可沿普通电话线传送的脉冲信号,而这些脉冲信号又可被线路另一端的另一个调制解调器接收,并译成计算机可懂的语言。
3.1计算机与modem连接
3.2计算机与非modem连接
3.3特殊情况
4.调试问题
4.1UART 帧错误
在测试使用DMA将UART接收到的数据搬运到SRAM中的case时,发现接收中断已经产生,但是RX FIFO的数据迟迟没有被搬运到sram中。调试发现,第一个字节接收过程中产生了帧错误,导致帧错误中断位被置高,且一直没有处理,所以阻碍了接收数据搬运,将帧错误标志位清除后,case正常。
4.2 UART 中断屏蔽寄存器
比较坑的一点,就是UART中断屏蔽寄存器的使用。虽然手册上描述,写入1代表屏蔽该中断。但是结合IP代码和使用测试,实际上是写入1代表使能该中断,而写入0代表屏蔽该中断!