第四章 UART UART即Universal Asynchronous Receiver/Transmitter的缩写,中文翻译为通用异步接收/发送装置UART是一种通用串行数据总线,用于异步通信,该总线双向通信,可以实现全双工传输和接收UART通信速度慢,有效传输距离短,但是其通信硬件电路具备简单的有点,在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信 LPC2214的UART结构如图4.1所示,LPC2214有两个UART,图中寄存器的x分别对应相应的UART,如UxTHR分别代表U0THR和U1THR UxTSRUxTHRUxLCRUxLSRUxRSRUxRBRUxFCRUxIERUxIIRUxDLLUxDLMVPB控制 模块内 部 总 线中 断 系 统内 部 总 线中 断 系 统TxDRxD图4.1 LPC2214的UART结构 LPC2214的UART分别由发送模块、接受模块、中断控制模块、波特率控制模块和FIFO控制模块构成 4.1 物理连接的准备物理连接的准备 UART通信方式目前主要应用于短距离的线通信领域,在使用之前必须建立收发双方之间的物理有线连接。
根据是否需要进行电平转换,目前常用的连接方式有两种,第一种如图4.2所示 TxDRxDTxDRxDLPC2214其他设备其他设备图4.2 UART设备间的直接物理连接 这是一种最简单的物理连接,在这种连接方式中,收发双方分别将自己的发送端(TxD)与对方的接收端(RxD)直接相接,同时双方地线相接,构成共同的零电平参考点, 从而构成通信的物理链路 收发双方能否使用这种物理连接方式,取决与通信的双方使用通信电平是否能够相互兼容,而不需要进行电平转换所谓电平相互兼容, 通俗地说即发送放发送的高电平和低电平可以被接收方判别还原成1和0,接收方不会无法区别发送放发送的是高电平还是低电平这种通信方式常见于电路板上的IC之间的相互通信,即俗称的板级通信 当通信的双方的电平不相互兼容时, 就需要在两者之间串入一个电平转换设备,从而让两者的电平实现兼容,在嵌入式系统中,这种物理连接方式常见于嵌入式系统与PC之间的连接,其原理图如图4.3所示 TxDRxDTxDRxDLPC2214PC电平转换电平转换图4.3 UART设备间的电平转换物理连接 这种物理连接方式主要应用与电平无法兼容的设备之间的通信LPC2214的串口电平是TTL电平,逻辑1为高电平为不低于3.0V,逻辑0为低电平不高于0.5V。
而PC的串口使用的RS232电平,其逻辑1为负电平(-3~-15V) ,逻辑0为正电平(3~15V) 显然,这两者之间的电平不能相互兼容为了让两者能顺利通信,在两者之间的物理线路上加入了一个电平转换单元,目的是实现TTL电平和RS232电平之间的变换 试验板与PC之间的连接是通过USB转换成的串口来实现的,其框图如图4.4所示 P0.0RxDTxDP0.1LPC2214PCPL2303USBTxDRxD图4.4 实验板与PC之间的物理连接 在实验板上,PL2303实现的是USB口与TTL电平UART之间的电平和协议转换关键P0.0和管脚P0.1是一个复用管脚,必须使用引脚控制寄存器将他们连接连接到TxD和RxD模块上去,经过查询PINSELx表,可知,需要执行下面的程序才能实现: PINSEL0 = (PINSEL0 4.2 通信协议的准备通信协议的准备 物理连接的建立使收发双方具备了通信的通路,但是在进行通信之前,还必须约定双方通信的一些规定,比如通信的速度、通信的格式等,这部分规定即通信协议在UART通信方式中,收发双方需要约定的主要是通信速度和通信格式两个参数PC上关于这部分的约定可以在软件界面上直接设定,但是对于嵌入式系统而言,则需要通过设定相关的寄存器来控制以上两个参数。
首先要设定的是通信的速度,在串行通信中,只有速度相同的双方才能成功通信在UART通信模式中,通信速度称为波特率波特率是指数据信号对载波的调制速率,如果数据信号是二进制调制的,波特率即比特率,即每秒钟传输的二进制位数 在LPC2214中,波特率是通过UxDLM和UxDLL两个寄存器来控制的,这两个寄存器决定波特率时钟的频率,UxDLM即UARTx Divisor Latch MSB Register,UART除数锁存LSB寄存器;UxDLL即UARTx Divisor Latch LSB Register,UART除数锁存MSB寄存器这两个寄存器如表4.1所示 名称 描述 复位值 UxDLL[7:0] 除数锁存寄存器低字节 两个寄存器一起构成一个 16 位 的除数,决定 UART0 的波特率未定义 UxDLM[7:0] 除数锁存寄存器高字节 表4.1 波特率控制 UxDLL 和UxDLM 寄存器一起构成一个16 位除数,UxDLL 包含除数的低8 位,UxDLM包含除数的高8 位值0x0000被看作是0x0001,因为除数是不允许为0 的波特率时钟必须是波特率的16倍,波特率计算公式如下: [,] 16FpclkBaudRateUxDLM UxDLL=×从上面的公式中,不能得到UxDLM和UxDLL的就算方法: [,]16FpclkUxDLM UxDLLBaudRate=×注意:由于UxDLL、UxDLM寄存器与其它寄存器的地址重叠,所以在访问它们时,UxLCR的除数锁存访问位(DLAB)必须为1。
在设定了通信速度之后,还需要进行通信格式的设置,所谓通信格式,指的是在通信过程数据传输的先后和如何启动、结束一次传输只有通信格式相同的收发双方才能实现成功通信在LPC2214中,通信格式是通过UxLCR(UART Line Control Register,线控制寄存器)来控制的,该寄存器的内容如表4.2所示 UxLCR 的位 功能 描述 复位值 1:0 数据长度选择 00:5 位字符长度 01:6 位字符长度 10:7 位字符长度 11:8 位字符长度 0 2 停止位选择 0:1 个停止位 1:2 个停止位(如果 U0LCR[1:0]=00 则 为 1.5) 0 3 校验允许 0:禁止奇偶产生和校验 1:使能奇偶产生和校验 0 5:4 校验类型选择 00:奇数 01:偶数 10:强制为 1 11:强制为 0 0 6 间隔控制 0:禁止间隔发送 1:使能间隔发送 当 U0LCR6=1 时,输出管脚 UART0 TxD 强 制为逻辑 0 0 7 除数锁存访问位 0:禁止访问除数锁存 1:使能访问除数锁存 0 表4.2 UxLCR寄存器 在物理连接已经建立的基础上如果收发双方都设置了相同的波特率和数据格式后,那么就可以进行数据的收发了。
4.3 数据的发送数据的发送 LPC2214的UART发送模块如图4.5所示 UxTSRUxTHRTxD内部数据总线内部数据总线图4.5 LPC2214发送模块 数据从内部数据总线输出到发送器保持寄存器(UxTHR)中,然后再拷贝到移位发送器(UxTSR)中,最后按照设定的波特率和格式从TxD引脚逐位发出如果需要发送数据,只需要把数据写进对应的如果需要发送数据,只需要把数据写进对应的UxTHR寄存器即可寄存器即可 UART作为一种低速传输接口,并不是任何时候都可以传输数据的,它必须在空闲的时候才能传输数据,如果其当前正在发送数据而且还没有发送完成,是不能启动一次新的数据发送的LPC2214的收发状态可以通过UxLSR(UARTx Line Status Register,UARTx线状态寄存器)来查看,该寄存器如表4.3所示 UxLSR 的位 功能 描述 复位值 0 接收数据就绪 (RDR) 0:UxRBR 为空 1:UxRBR 包含有效数据 当 UxRBR 包含未读取的字符时, UxLSR0 置 位;当 UART RBR FIFO 为空时,U0LSR0 清 零 0 1 溢出错误 (OE) 0:溢出错误状态未激活 1:溢出错误状态激活 溢出错误条件在错误发生后立即设置。
UxLSR 读操作清零该位当 UARTx RSR 已经有新 的字符就绪而 UART0 RBR FIFO 已满时, 该位置位此时 UARTx RBR FIFO 不会被 覆盖,UARTx RSR 中的字符将丢失 0 2 奇偶错误 (PE) 0:奇偶错误状态未激活 1:奇偶错误状态激活 当接收字符的奇偶位处于错误状态时产生一 个奇偶错误UxLSR 读操作清零该位奇偶 错误检测时间取决于 UxFCR0奇偶错误与 UART RBR FIFO 中读出的字符相关 0 3 帧错误 (FE) 0:帧错误状态未激活 1:帧错误状态激活 当接收字符的停止位为 0 时,产生帧错误 UxLSR 读操作清零该帧错误检测时间取决 于 UxFCR0帧错误与 UARTx RBR FIFO 中 读出的字符相关当检测到一个帧错误时, Rx 将尝试与数据重新同步并假设错误的停 止位实际是一个超前的起始位 但即使没有出 现帧错误, 它也不能假设下一个接收到的字节 是正确的 0 4 间隔中断 (BI) 0:间隔中断状态未激活 1:间隔中断状态激活 在发送整个字符(起始位、数据、奇偶位和停 止位)过程中 RxD0 如果都保持逻辑 0,则产 生间隔中断。
当检测到中断条件时, 接收器立 即进入空闲状态直到 RxD0 变为全 1 状态 UxLSR 读操作清零该状态位间隔检测的时0 间取决于 UxFCR0间隔中断与 UART RBR FIFO 中读出的字符相关 5 发送保持 寄存器空 (THRE) 0:UxTHR 包含有效数据 1:UxTHR 空 当检测到 UART THR 空时,THRE 置位, UxTHR 写操作清零该位 1 6 发送器空 (TEMT) 0:UxTHR 和/或 UxTSR 包含有效数据 1:UxTHR 和 UxTSR 空 当 UxTHR 和 UxTSR 都为空时, TEMT 置位 当 UxTSR 或 UxTHR 包含有效数据时,TEMT 清零 1 7 Rx FIFO 错误 (RXFE) 0 : UxRBR 中 没 有 UART Rx 错 误 , 或 UxFCR0=0 1:UxRBR 包含至少一个 UART Rx 错误 当一个带有 Rx 错误(例如帧错误、奇偶错误 或间隔中断)的字符装 入 UxRBR 时, UxLSR7 置位 当读取 UxLSR 寄存器并且 UART FIFO 中不再有错误时,UxLSR7 清零。
0 表4.3 UxLSR寄存器 这个寄存器的内容很多,在发送的时候,只需要关心其第5位发送保持器空和第6位发送器空即可,只要这两位其中一位为1,则意味这UART已经或者马上就要进入空闲状态一般情况下,当发送保持器空时即可以启动一次新的发送,此时只需要把待发送的数据写入到一般情况下,当发送保持器空时即可以启动一次新的发送,此时只需要把待发送的数据写入到UxTHR寄存器中,然后通过查询发送保持器是否为空确定数据是否成功发送即可寄存器中,然后通过查询发送保持器是否为空确定数据是否成功发送即可 比如使用UART0发送一个字节的子函数可以这样写: void UART0_SendByte(unsigned char data) { //等待UART1进入空闲状态 while((U0LSR //发送数据 U0THR = data; //等待发送完成 while((U0LSR } 4.4数据的接收数据的接收 LPC2214的UART接收模块如图4.6所示 UxRSRUxRBRRxD内部数据总线内部数据总线图4.6 UART接收模块 从RxD引脚输入的移位信号先在UART输入移位寄存器(UxRSR)中进行串并转换,得到一个字节的数据后拷贝到UxRBR(UART Receiver Bu。