1、第十一章 异步串口通信概述S3C2410 的 UART 提供 3 个独立的异步串行通信端口,每个端口可以基于中断或者 DMA 进行操作。换句话说,UART 控制器可以在 CPU 和 UART 之间产生一个中断或者 DMA 请求来传输数据。UART 在系统时钟下运行可支持高达 230.4K的波特率,如果使用外部设备提供的 UEXTCLK,UART 的速度还可以更高。每个UART 通道各含有两个 16 位的接收和发送 FIFO。S3C2410 的 UART 包括可编程的波特率,红外 接收/发送,一个或两个停止位插入,5-8 位数据宽度和奇偶校验。每个 UART 包括一个波特率发生器、一个发送器、一
2、个接收器和一个控制单元,如图 11-1 所示。波特率发生器的输入可以是 PCLK 或者 UEXTCLK。发送器和接收器包含 16 位的 FIFO 和移位寄存器,数据被送入 FIFO,然后被复制到发送移位寄存器准备发送,然后数据按位从发送数据引脚 TxDn 输出。同时,接收数据从接收数据引脚 RxDn 按位移入接收移位寄存器,并复制到 FIFO。特性 RxD0, TxD0, RxD1, TxD1, RxD2, 和 TxD2 基于中断或者 DMA 操作 UART Ch 0, 1, 和 2 具有 IrDA 1.0 & 16 字节 FIFO UART Ch 0 和 1 具有 nRTS0, nCTS0,
3、 nRTS1, 和 nCTS1 支持发生/接收握手图 11-1 UART 方框图串口操作下述部分描述了 UART 的一些操作,包括数据发送、数据接收、中断产生、波特率发生、loop-back 模式、红外模式和自动流控制。数据发送发送数据的帧结构是可编程的,它由 1 个起始位、5-8 个数据位、1 个可选的奇偶位和 1-2 个停止位组成,这些可以在线控制寄存器 ULCONn 中设定。接收器可以产生一个断点条件使串行输出保持 1 帧发送时间的逻辑 0 状态。当前发送字被完全发送出去后,这个断点信号随后发送。断点信号发送之后,继续发送数据到Tx FIFO(如果没有 FIFO 则发送到 Tx 保持寄存
4、器)。数据接收与数据发送一样,接收数据的帧格式也是可编程的。它由 1 个起始位、5-8 个数据位、1 个可选的奇偶位和 1-2 个停止位组成,这些可以在线控制寄存器ULCONn 中设定。接收器可以探测到溢出错误和帧错误。 溢出错误:在旧数据被读出来之前新的数据覆盖了旧的数据 帧错误: 接收数据没有有效的停止位当在 3 个字时间(与字长度位的设置有关)内没有接收到任何数据并且 Rx FIFO 非空时,将会产生一个接收超时条件。自动流控制(AFC)UART0 和 UART1 通过 nRTS and nCTS 信号支持自动流控制,例如连接到外部UART 时。如果用户希望将 UART 连接到一个 MO
5、DEM,可以在 UMCONn 寄存器中禁止自动流控位,并且通过软件控制 nRTS 信号。在 AFC 时, nRTS 由接收器的状态决定,而 nCTS 信号控制发送器的操作。只有当 nCTS 信号有效的时候(在 AFC 时,nCTS 意味着其它 UART 的 FIFO 准备接收数据)UART 发送器才会发送 FIFO 中的数据。在 UART 接收数据之前,当它的接收 FIFO 多于 2 字节的剩余空间时 nRTS 必须有效,当它的接收 FIFO 少于 1 字节的剩余空间时 nRTS 必须无效(nRTS 意味着它自己的接收 FIFO 开始准备接收数据)。图 11-2 UART AFC 接口注:UA
6、RT2 不支持 AFC 功能,因为 S3C2410 没有 nRTS2 和 nCTS2。无 AFC 的例子通过 FIFO 操作 Rx1、 选择接收模式(中断还是 DMA 模式)。2、 检查 UFSTATn 寄存器中 Rx FIFO 的值。如果值小于 15(RX FIFO未满),用户必须将 UMCONn0置 1(nRTS 生效),如果大于等于 15(RX FIFO 已满),用户必须将 UMCONn0清 0(nRTS 无效)。3、重复第 2 步。通过 FIFO 操作 Tx1、选择发送模式(中断还是 DMA 模式)。2、检查 UMCONn0的值,如果为 1(nRTS active),写数据到 Tx F
7、IFORS-232C 接口如果希望将UART连接到MODEM,nRTS, nCTS, nDSR, nDTR, DCD 和nRI信号是必须的。这种情况下用户可以通过GPIO控制这些信号因为AFC不支持RS-232C接口。中断/DMA请求的产生每个UART有5个状态(Tx/Rx/Error)信号:溢出错误、帧错误、接收缓冲满、发送缓冲空和发送移位寄存器空。这些状态体现在UART 状态寄存器中的相关位(UTRSTATn/UERSTATn)。溢出错误和帧错误与接收错误状态相关,每个错误可以产生一个接收错误状态中断请求,如果控制寄存器UCONn中的receive-error-status-interru
8、pt-enable 位被置1的话。如果探测到一个receive-error-status-interrupt-enable位,通过读UERSTSTn 的值可以识别这一中断请求。控制寄存器UCONn的接收器模式为1(中断或者循环检测模式):当接收器在FIFO模式下将一个数据从接收移位寄存器写入FIFO时,如果接收到的数据到达了Rx FIFO的触发条件,Rx 中断就产生了。在无FIFO 模式下,每次接收器将数据从移位寄存器写入接收保持寄存器都将产生一个RX中断请求。如果控制寄存器的接收和发送模式选择为DMAn请求模式,在上面的情况下则是DMAn请求发生而不是RX/Tx中断请求产生。UART错误状态
9、FIFOUART除了Rx FIFO外还有错误状态FIFO 。错误状态FIFO指示接收到的哪个数据有错误。只有当有错误的数据准备读出的时候才会产生错误中断。要清除错误状态FIFO ,URXHn 和UERSTATn必须被读出。例如:假设UART Rx FIFO顺序接收到ABCD4 个字符,在接收 B的时候发生了帧错误。事实上UART接收错误并未产生任务错误中断,因为错误的数据 B还没有被读出,只有当读B字符的时候才会发生错误中断。图11-3描述了这一例子。波特率发生器每个UART的波特率发生器提供串行时钟给接收器和发送器。波特率发生器的时钟源可以选择呢不系统时钟或者UEXTCLK。换句话说,通过设
10、置UCONn 的时钟选择被除数是可选的。波特率时钟通过对时钟源(PCLK OR UEXTCLK)进行16分频,然后进行一个16位的除数分频得到,这个分频数由波特率除数寄存器UBRDIVn指定。UBRDIVn可由下式得出:UBRDIVn = (int)(PCLK/(bps * 16) ) -1此除数应该在1-(2 的16方-1)之间。为了UART的精确性,S3C2410还支持UEXTCLK作为被除数。如果使用UEXTCLK (由外部UART设备或者系统提供),串行时钟能够精确地和UEXTCLK 同步,因此用户可以得到更精确的UART 操作,UBRDIVn 由下式决定:UBRDIVn = (int
11、)(UEXTCLK / (bps x 16) ) 1此除数应该在1-(2 的16方-1)之间,且UEXTCLK要比PCLK 低。例如,如果波特率为115200bps,而PCLK或者UEXTCLK为40MHz,则UBRDIVn为:UBRDIVn = (int)(40000000/(115200 x 16) -1= (int)(21.7) -1= 21 -1 = 20波特率错误容差UART的帧错误应该少于1.87%(3/160)。UART Frame error should be less than 1.87%(3/160).tUPCLK = (UBRDIVn + 1) x 16 x 1Fram
12、e / PCLK tUPCLK : Real UART ClocktUEXACT = 1Frame / baud-rate tUEXACT : Ideal UART ClockUART error = (tUPCLK tUEXACT) / tUEXACT x 100%注意:1、1帧=起始位+ 数据位 +奇偶位+停止位2、在特定条件下,波特率上限可达921.6K ,例如当PCLK为60MHZ 时,可以使用921.6K的波特率而误差为1.69%loop-back模式为了识别通讯连接中的故障,UART提供了一种叫 loop-back模式的测试模式。这种模式结构上使能了UART的TXD和RXD连接,因
13、此发送数据被接收器通过RXD接收。这一特性允许处理器检查每个SIO通道的内部发送到接收的数据路径。可以通过设置UART控制寄存器UCONn中的loopback 位选择这一模式。红外 (IR)模式UART支持红外 (IR) 接收和发送,可以通过设置 UART线控制寄存器ULCONn的Infra-red-mode位来进入这一模式。图11-4阐述了如何实现IR模式。在IR发送模式下,发送脉冲的比例是3/16正常的发送比率 (当发送数据位为0的时候) ;在 IR接收模式下,接收器必须检测3/16 的脉冲来识别0值(见图11-6和11-7所示的帧时序)。UART SFRUART线控制寄存器ULCONn有
14、3个UART线控制寄存器:ULCON0, ULCON1, and ULCON2UART控制寄存器UCONn有3个UART控制寄存器:UCON0, UCON1, and UCON2注意:DMA接收有FIFO模式下,当UART没有达到 FIFO触发条件而且3个字时间没有接收到数据时,Rx中断会产生,用户应该检查FIFO的状态并读出其它数据。UART FIFO控制寄存器UFCONn波特率除数寄存器UBRDIVn有3个波特率除数寄存器:UBRDIV0,UBRDIV1,UBRDIV2,存储于里面的值用于设置串口波特率:UBRDIVn = (int)(PCLK / (bps x 16) ) 1或 UBRDIVn = (int)(UEXTCLK / (bps x 16) ) 1此除数应该在1-(2 的16方-1)之间,且UEXTCLK要比PCLK 低。例如,如果波特率为115200bps,而PCLK或者UEXTCLK为40MHz,则UBRDIVn为:UBRDIVn = (int)(40000000/(115200 x 16) -1= (int)(21.7) -1= 21 -1 = 20