第10章通用异步收发器本章重点:⑴UART组成;⑵UART操作:包括数据发送/接收、自动流控制、非自动流控制、RS-232C接口、中断及DMA请求、UART错误状态FIFO、波特率发生器、回送方式、红外方式等;⑶各特殊功能寄存器的含义及设置。10.1概述S3C44B0X中通用异步收发器(UniversalAsynchronousReceiverandTransmitter,UART)提供了两个独立的异步串行I/O(SerialInputOutput,SIO)端口,每个可以使用基于中断(含查询)或基于DMA的方式操作,也就是说UART通过产生中断请求或DMA请求,在CPU(或内存)和UART之间传送数据。UART支持最高波特率为115.2Kbps。每个UART通道含一个16字节的接收FIFO(FirstInFirstOut,先进先出)寄存器组,一个16字节的发送FIFO寄存器组。数据发送和接收可以使用FIFO,也可以不使用FIFO。不使用FIFO时,CPU(或内存)要发送的数据写到UART的发送保持(缓冲区)寄存器,UART接收到的数据保存在接收保持(缓冲区)寄存器。可以对S3C44B0X中UART以下参数进行设置:波特率;红外IR(InfraRed)发送/接收模式;1位或2位停止位;5~8位数据位;奇偶校验位。如图10.1所示,每个UART含1个波特率发生器、发送器、接收器和控制单元。系统时钟MCLK可以作为时钟源送到波特率发生器。发送器和接收器各有1个16字节的FIFO和数据移位寄存器。要发送的数据写到FIFO后被拷贝到发送移位寄存器,通过发送数据引脚TxDn移位输出。接收数据从接收引脚RxDn移入接收移位寄存器,然后拷贝到FIFO。图10.1带FIFO的UART框图S3C44B0X中UART有以下特点:⑴RxD0、TxD0、RxD1和TxD1可以基于中断(含查询)或DMA方式操作;⑵UART通道0带有IrDA1.0,并且有16字节FIFO;⑶UART通道1带有IrDA1.0,并且有16字节FIFO;⑷支持发送/接收握手方式。10.2UART操作UART操作包含数据发送、数据接收、自动流控制(AutoFlowControl,AFC)、中断和DMA请求产生、错误状态FIFO、波特率发生器、红外方式等内容。⒈数据发送发送数据的帧格式是可编程的,由1位起始位,5~8位数据位,1位可选择的奇偶校验位和1~2位停止位组成,能够在UART线控制寄存器ULCONn中指定。发送器也能产生断开条件(breakcondition),断开条件迫使串行输出成为0状态,持续时间比1帧传送时间更长。⒉数据接收像发送一样,接收的数据帧格式也是可编程的,由1位起始位,5~8位数据位,1位可选择的奇偶校验位和1~2位停止位组成,能够在ULCONn中指定。接收器能够检查溢出错误(overrunerror)、奇偶校验错误(parityerror)、帧错误(frameerror)和断开条件(breakcondition),并分别设置错误标记。⑴溢出错误⑵奇偶校验错误⑶帧错误⑷断开条件接收超时条件出现的情况。⒊自动流控制S3C44B0X的UART使用nRTS和nCTS信号支持自动流控制(AutoFlowControl,AFC),在这种情况下必须将UATR连到另一个UART。如果用户连接UART到调制解调器,应该在UMCONn寄存器中禁止AFC位,由软件控制nRTS信号。自动流控制接口见图10.2。图10.2UARTAFC接口⒋非自动流控制(由软件控制nRTS和nCTS)⑴接收操作①选择接收方式基于中断或BDMA方式。②检查UFSTATn寄存器中接收FIFO计数值,如果小于15,用户必须设UMCONn[0]为1,使nRTS激活;如果大于等于15,用户将该值设为0,使nRTS不激活。③重复②⑵发送操作①选择发送方式基于中断或BDMA方式。②检查UMSTATn[0]的值,如果等于1,nCTS被激活,用户写数据到发送缓冲区或发送FIFO寄存器。⒌RS-232C接口如果用户希望连接到调制解调器接口,需要使用nRTS、nCTS、nDSR、nDTR、DCD和nRI信号,在这种情况下,用户能够使用通用I/O端口(GPIO)由软件控制这些信号,AFC不支持RS-232C接口。⒍中断/DMA请求产生每个UART有7种状态信号:溢出错、奇偶校验错、帧错、断开(break)、接收FIFO或接收保持(缓冲区)寄存器数据准备好、发送FIFO或发送保持(缓冲区)寄存器空、发送移位寄存器空。在对应的UART状态寄存器UTRSTATn/UERSTATn中,有相应位作为指示。溢出错、奇偶校验错、帧错和断开都被看作是接收错误状态,如果在控制寄存器UCONn中接收错误状态中断允许位设置为1,它们中的每一种都能引起接收错误状态中断请求。当一个接收错误状态中断请求被检出,通过读UERSTATn能够识别这4种中哪一个提出了中断请求。与FIFO有关的中断见表10.1。(P264)⒎UART错误状态FIFO除了接收FIFO寄存器,UART还有状态FIFO。状态FIFO表示在FIFO寄存器中的数据是否带有错误。例如,假定UARTFIFO顺次收到F、G、H、I、J字符,当收到字符G时出现帧错误,当收到字符I时出现奇偶校验错误。参见表10.2和图10.3。(P264、265)⒏波特率发生器每个UART的波特率发生器为发送器和接收器提供串行的时钟信号。波特率发生器使用的时钟源,能够选择S3C44B0X内部系统时钟。时钟源除以16,然后由UART中波特率分频寄存器UBRDIVn中16位分频系数再分频,作为波特率时钟。UBRDIVn中系数由以下公式确定:UBRDIVn=(round_off)(MCLK/(bps*16))-1(式10-1)比如波特率是115200bps,MCLK是40MHz,则UBRDIVn为:UBRDIVn=(int)(40000000/(115200*16)+0.5)-1=(int)(21.7+0.5)-1=22-1=21⒐回送方式(loopbackmode)S3C44B0X的UART提供了一种测试方式,也称回送方式,用于在通讯链中辅助隔离故障。⒑红外方式S3C44B0X支持红外(InfraRed,IR)发送和接收,通过在UART线控制寄存器ULCONn中设置红外方式位选择红外方式。红外方式的实现如图10.4所示。图10.4IrDA功能框图10.3UART特殊功能寄存器⒈UART线控制寄存器在UART中有2个线控制寄存器ULCON0和ULCON1,地址分别是0x01D00000和0x01D04000,可读写,Reset值为0x00,具体含义见表10.3。(P266)⒉UART控制寄存器在UART中有2个控制寄存器UCON0和UCON1,地址分别是0x01D00004和0x01D04004,可读写,Reset值为0x00,具体含义见表10.4。(P267)⒊UART的FIFO控制寄存器UFCON0和UFCON1是UART通道0和通道1的FIFO控制寄存器,地址分别是0x01D00008和0x01D04008,可读写,Reset值为0x00,具体含义见表10.5。(P268)⒋UART调制解调器控制寄存器UMCON0和UMCON1是调制解调器控制寄存器,地址分别是0x01D0000C和0x01D0400C,可读写,Reset值为0x00,具体含义见表10.6。(P268)⒌UART发送/接收状态寄存器UTRSTAT0和UTRSTAT1分别是UART通道0和通道1的发送和接收状态寄存器,地址分别是0x01D00010和0x01D04010,只读,Reset值为0x6,具体含义见表10.7。(P269)⒍UART错误状态寄存器UART中有2个接收错误状态寄存器,分别是UERSTAT0和UERSTAT1,对应地址是0x01D00014和0x01D04014,只读,Reset值为0x0,具体含义见表10.8。(P269)⒎UARTFIFO状态寄存器UART中有2个UARTFIFO状态寄存器,分别是UFSTAT0和UFSTAT1,对应地址是0x01D00018和0x01D04018,只读,分别用于通道0和通道1,Reset值为0x0000,具体含义见表10.9。(P269)⒏UART调制解调器状态寄存器UART中有2个UART调制解调器状态寄存器,分别是UMSTAT0和UMSTAT1,对应地址是0x01D0001C和0x01D0401C,只读,Reset值为0x0,具体含义见表10.10和图10.8。(P270)⒐UART发送保持(缓冲区)寄存器与FIFO寄存器在表10.5中,如果UFCONn[0]=0,禁止使用FIFO,由处理器送来的数据,保存到发送保持(缓冲区)寄存器;如果UFCONn[0]=1,FIFO方式,允许使用FIFO,由处理器送来的数据,保存到FIFO寄存器。发送保持(缓冲区)寄存器和FIFO寄存器有相同的地址。UART通道0和通道1各有一个8位的发送保持(缓冲区)寄存器与FIFO寄存器,分别是UTXH0和UTXH1,具体内容见表10.11。(P270)UTXHn中位[7:0]称为TXDATAn字段。⒑UART接收保持(缓冲区)寄存器与FIFO寄存器在表10.5中,如果UFCONn[0]=0,禁止使用FIFO,UART接收到的数据保存在接收保持(缓冲区)寄存器;如果UFCONn[0]=1,FIFO方式,允许使用FIFO,UART接收到的数据保存在FIFO寄存器。接收保持(缓冲区)寄存器和FIFO寄存器有相同的地址。UART通道0和通道1各有一个8位的接收保持(缓冲区)寄存器与FIFO寄存器,分别是URXH0和URXH1,具体内容见表10.12。(P271)URXHn中位[7:0]称为RXDATAn字段。⒒UART波特率分频寄存器UART有2个波特率分频寄存器UBRDIV0和UBRDIV1,用于确定每个通道的发送/接收波特率,具体含义见表10.13。(P271)⒓UART特殊功能寄存器使用举例【例10.1】下面给出了使用C语言编写的对UART初始化,选择通道,不使用FIFO,通过查询UTRSTATn(非DMA)接收和发送数据的程序片段,开始部分定义了特殊功能寄存器的地址,请注意大端或小端时一些寄存器的地址不同。请读者对照前文所述寄存器的含义,阅读并理解程序的含义。假定MCLK、__BIG_ENDIAN已经定义过了。(P271-273)END