下载此文档

深刻理解UART.doc


文档分类:高等教育 | 页数:约11页 举报非法文档有奖
1/11
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/11 下载此文档
文档列表 文档介绍
该【深刻理解UART 】是由【小吴】上传分享,文档一共【11】页,该文档可以免费在线阅读,需要了解更多关于【深刻理解UART 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。.UART异步串行口UART异步串行口简介数据通信的根本方式可分为并行通信与串行通信两种:*并行通信:是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度快,适用于短距离通信,但要求通讯速率较高的应用场合。*串行通信:是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低本钱,适用于远距离通信,但传输速度慢的应用场合。UART异步串行口的传输格式异步通信以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然而在同一个字符中的两个相邻位代码间的时间间隔是固定的。通信协议〔通信规程〕:是指通信双方约定的一些规那么。在使用异步串口传送一个字符的信息时,对资料格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。通讯时序图如下:*开始前,线路处于空闲状态,送出连续“1〞。传送开始时首先发一个“0〞作为起始位,然后出现在通信线上的是字符的二进制编码数据。*每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1〞的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。*最后是表示停止位的“1〞信号,这个停止位可以约定持续1位、。*至此一个字符传送完毕,线路又进入空闲,持续为“1〞。经过一段随机的时间后,下一个字符开始传送才又发出起始位。*每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为110,150,300,600,1200,2400,4800,9600等。S3C2410的异步串行口S3C2410的UART〔通用异步串行口〕单元提供三个独立的异步串行I/O端口,每个都可以在中断和DMA两种模式下进行。。每个UART通道包含2个16位FIFO分别提供应接收和发送。每个UART包含波特率发生器,接收器,发送器和控制单元。。波特率发生器以PCLK或UCLK为时钟源。发送器和接收器包含16字节FIFO存放器和移位存放器,当发送数据的时候,数据先写到FIFO然后拷贝到发送移位存放器,然后从数据输出端口〔TxDn〕依次被移位输出。被接收的数据也同样从接收端口〔RxDn〕移位输入到移位存放器,然后拷贝到FIFO中。异步串行口的操作*数据发送操作数据发送帧的格式是可编程的,它包含一个开始位,5到8个数据位,一个可选的奇偶位和一个或两个停止位,这些可以通过线性控制器〔ULCONn〕来设置。发送器也能够产生发送中止条件。中止条件迫使串口输出保持在逻辑0状态,这种状态保持一个传输帧的时间长度。通常在一帧传输数据完整地传输完之后,在通过这个全0状态将中止信号发送给对方。中止信号发送之后,传送数据连续放到FIFO中〔在不使用FIFO模式下,将被放到输出保持存放器〕。*数据接收操作与数据发送一样,数据接收的帧也是可以编程的,它包含一个开始位,5到8个数据,一个可选的奇偶位和一位或两位停止位,它们都是通过线性控制器〔ULCONn〕来设置的。接收器能够检测溢出错误,奇偶校验错误,帧错误和中止状况,每种情况下都将会将一个错误标志置位。UART异步串行口的波特率发生器每个UART的波特率发生器为传输提供了串行移位时钟。波特率产生器的时钟源可以从S3C2410的内部系统时钟或UCLK中来选择。。波特率由时钟源〔PCLK或UCLK〕16分频然后被UART波特率除数存放器〔UBRDIVn〕指定的16位除数决定。因此,UBRDIVn的值可以按照下式确定:UBRDIVn=(int)〔PCLK/〔bps*16〕〕-1,其中bps为波特率。例如,如果波特率为115200bps且PCLK或UCLK为40MHz,那么UBRDIVn为:UBRDIVn=〔int〕(40000000)(115200*16))-1=(int)()-1=21-1=%〔3/160〕。tUPCLK=(UBRDIVn+1)x16x10/PCLK实际的传输10bit所需时间。tUEXACT=10/baud-rate理想情况下传输10位需要的时间。UARTerror=(tUPCLK–tUEXACT)/tUEXACTx100%异步串行口的相关存放器*线路控制存放器〔ULCON〕线性控制存放器,主要用来规定传输帧的格式。下面表格是线控制存放器的地址和位定义:存放器地址读/写描述重置值ULCON00x50000000读/写UART通道0线路控制存放器0x00ULCON10x50004000读/写UART通道1线路控制存放器0x00ULCON20x50008000读/写UART通道2线路控制存放器0x00ULCONn位描述初始状态保存[7]0Infra-RedMode[6]决定是否用红外模式。0=正常模式操作1=红外Tx/Rx模式0ParityMode[5:3]指定奇偶产生的类型并在UART的传输与接收操作中检查。0xx=非奇偶100=奇101=偶110=强制奇偶/选中为1111=强制奇偶/选中为0000NumberofStopBit[2]指定多少个停止位将被使用对于帧结束信号。0=每帧一个停止位1=每帧两个停止位0WordLength[1:0]显示每帧传输或接收的数据位的数目。00=5位,01=6位10=7位,11=8位00*控制存放器〔UCON〕存放器地址读/写描述重置值UCON00x50000004读/写UART通道0控制存放器0x00UCON10x50004004读/写UART通道1控制存放器0x00UCON20x50008004读/写UART通道2控制存放器0x00UCONn位描述初始状态ClockSelection[10]选择PCLK或UCLK对于UART的波特率。0=PCLK:UBRDIVn=(int)(PCLK/(bpsx16))-11=UCLK(***@GPH8):UBRDIVn=(int)(UCLK/(bpsx16))-10TxInterruptType[9]中断请求类型。0=脉冲型(当Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)1=电平型(当Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)0RxInterruptType[8]中断请求类型。0=脉冲型(当Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)1=电平型(当Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)0RxTimeOutEnable[7]当UART的输入输出被使能时,使Rx的定时中断使能/失能。这个中断是一个接收中断。0=失能,1=使能0RxErrorStatusInterruptEnable[6]使UART在一个例外上产生中断是使能的,例如一个暂停,帧出错,奇偶出错或溢出出错在一个接收操作中。0=不产生接收出错的状态中断1=产生接收出错的状态中断0LoopbackMode[5]设置回溯位为1将引起UART参加到回溯模式中。这种模式只是为测试目的而提供的。0=正常操作,1=回溯模式0SendBreakSignal[4]设置这个位将引起UART在一帧的时间内传送一个暂停。这个位在送出暂停信号后会被自动去除。0=正常传输,1=传送暂停信号0TransmitMode[3:2]决定哪一个函数当前能够对Tx写入数据到UART传输缓冲存放器。00=失能01=中断请求或轮流检测模式10=DMA0请求〔只对于UART0〕,DMA3请求〔只对于UART2〕11=DMA1请求〔只对于UART1)00ReceiveMode[1:0]决定哪一个函数当前能够读取数据从UART接收缓冲存放器。00=失能01=中断请求或轮流检测模式10=DMA0请求〔只对于UART0〕,DMA3请求〔只对于UART2〕11=DMA1请求〔只对于UART1)00*FIFO控制存放器〔UFCON〕存放器地址读/写描述重置值UFCON00x50000008读/写UART通道0FIFO控制存放器0x0UFCON10x50004008读/写UART通道1FIFO控制存放器0x0UFCON20x50008008读/写UART通道2FIFO控制存放器0x0UFCONn位描述初始状态TxFIFOTriggerLevel[7:6]决定传输FIFO的触发电平。00=空,01=4字节10=8字节,11=12字节00RxFIFOTriggerLevel[5:4]决定接收FIFO的触发电平。00=4字节,01=8字节10=12字节,11=16字节00保存[3]0TxFIFOReset[2]在重新设置FIFO后自动去除。0=正常,1=TxFIFO重置0RxFIFOReset[1]在重新设置FIFO后自动去除。0=正常,1=RxFIFO重置0FIFOEnable[0]0=失能1=使能0*MODEM控制存放器〔UMCON〕存放器地址读/写描述重置值UMCON00x5000000C读/写UART通道0Modem控制存放器0x0UMCON10x5000400C读/写UART通道1Modem控制存放器0x0保存0x5000800C-保存未定义UMCONn位描述初始状态保存[7:5]这些位必须是000AutoFlowControl(AFC)[4]0=失能1=使能0保存[3:1]这些位必须是000RequesttoSend[0]如果AFC位是使能的,这个值将被忽略。在这种情况下S3C2410X将自动控制nRTS。如果AFC位是失能的,nRTS必须由软件控制。0=‘H’电平(不激活nRTS),1=‘L’电平(激活nRTS)0*发送/接收状态存放器〔UTRSTAT〕RegisterAddressR/WDescriptionResetValueUTRSTAT00x50000010RUART通道0Tx/Rx状态存放器0x6UTRSTAT10x50004010RUART通道1Tx/Rx状态存放器0x6UTRSTAT20x50008010RUART通道2Tx/Rx状态存放器0x6UTRSTATnBitDescriptionInitialStateTransmitterempty[2]当传输缓冲存放器中没有有效的值传输并且传输转换存放器中为空的时候,=不为空1=传输器(传输缓冲器&转换存放器)为空1Transmitbufferempty[1]当传输缓冲存放器中没有有效的值传输时自动置10=缓冲存放器不为空1=为空(在非FIFO模式中,中断和DMA被请求,在FIFO模式中,只有当TxFIFO的触发级被设置为00的时候,中断和DMA被请求)如果UART使用FIFO,[0]当接受缓冲存放器中没有有效的值传输时自动置10=为空1=缓冲存放器接受到数据(在非FIFO模式中,中断和DMA被请求)如果UART使用FIFO,用户应当检查UFSTAT存放器的RxFIFO计数位代替检查该位0*错误状态存放器〔UERSTAT〕RegisterAddressR/WDescriptionResetValueUERSTAT00x50000014RUART通道0Rx错误状态存放器0x0UERSTAT10x50004014RUART通道1Rx错误状态存放器0x0UERSTAT20x50008014RUART通道2Rx错误状态存放器0x0UERSTATnBitDescriptionInitialStateReserved[3]0=接受中没有帧错误1=帧错误(中断请求)0FrameError[2]=接受中没有帧错误1=帧错误(中断请求)0Reserved[1]0=接受中没有帧错误1=帧错误(中断请求)0OverrunError[0]在接受操作中发生了溢出错误后自动置10=接受中没有溢出错误1=溢出错误(中断请求)0*FIFO状态存放器〔UFSTAT〕RegisterAddressR/WDescriptionResetValueUFSTAT00x50000018RUART通道0FIFO状态存放器0x00UFSTAT10x50004018RUART通道1FIFO状态存放器0x00UFSTAT20x50008018RUART通道2FIFO状态存放器0x00UFSTATnBitDescriptionInitialStateReserved[15:10]0TxFIFOFull[9]当传输过程中传输FIFO为满的时候自动置100=0-byte≤TxFIFO数据≤15-byte1=FullRxFIFOFull[8]当接收过程中接收FIFO为满的时候自动置100=0-byte≤RxFIFO数据≤15-byte1=FullTxFIFOCount[7:4]TxFIFO中数据的个数0RxFIFOCount[3:0]RxFIFO中数据的个数0*MODEM状态存放器〔UMSTAT〕RegisterAddressR/WDescriptionResetValueUMSTAT00x5000001CRUART通道0Modem状态存放器0x0UMSTAT10x5000401CRUART通道1Modem状态存放器0x0Reserved0x5000801C–保存的未定义UMSTAT0BitDescriptionInitialStateReserved[3]0DeltaCTS[2]该位指示输入到S3C2410X的nCTS信号自从上次读后已经改变状态0=没有被改变1=被改变0Reserved[1]0CleartoSend[0]0=CTS信号没有被激活(nCTSpinishigh.)1=CTS信号被激活(nCTSpinislow.)0*发送缓冲存放器〔UTXHn〕RegisterAddressR/WDescriptionResetValueUTXH00x50000020(L)0x50000023(B)W(bybyte)UART通道0发送缓冲存放器–UTXH10x50004020(L)0x50004023(B)W(bybyte)UART通道1发送缓冲存放器–UTXH20x50008020(L)0x50008023(B)W(bybyte)UART通道3发送缓冲存放器–UTXHnBitDescriptionInitialStateTXDATAn[7:0]UARTn的传输数据–*接收缓冲存放器〔URXHn〕RegisterAddressR/WDescriptionResetValueURXH00x50000024(L)0x50000027(B)R(bybyte)UART通道0接收缓冲存放器–URXH10x50004024(L)0x50004027(B)R(bybyte)UART通道1接收缓冲存放器–URXH20x50008024(L)0x50008027(B)R(bybyte)UART通道2接收缓冲存放器–URXHnBitDescriptionInitialStateRXDATAn[7:0]UARTn接受的数据–*波特率除数存放器RegisterAddressR/WDescriptionResetValueUBRDIV00x50000028R/W波特率除数存放器0–UBRDIV10x50004028R/W波特率除数存放器1–UBRDIV20x50008028R/W波特率除数存放器2–UBRDIVnBitDescriptionInitialStateUBRDIV[15:0]波特率除数值–UBRDIVn>0实验内容根据前面的原理介绍,写一个程序来测试串口的根本功能。异步串口实验步骤从上面的存放器介绍可以看到,与UART有关的存放器共有11*3〔因为有3个UART通道〕之多。本实验使用UART0。、GPH3定义为TXD0、RXD0:GPHCON|=0xa0GPHUP|=0x0c(上拉)ULCON0(UARTchannel0linecontrolregister):设为0x03此值含义为:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-RedMode,此模式表示0、1的方式比拟特殊)。UCON0(UARTchannel0controlregister):设为0x245除了位[3:0],其他位都使用默认值。位[3:0]=0b0101表示:发送、接收都使用“中断或查询方式〞——本实验使用查询方式。UFCON0(UARTchannel0FIFOcontrolregister):设为0x00每个UART内部都有一个16字节的发送FIFO和接收FIFO,但是本实验不使用FIFO,设为默认值0UMCON0(UARTchannel0Modemcontrolregister):设为0x00本实验不使用流控,设为默认值0UBRDIV0(R/WBaudratedivisiorregister0):设为12本实验未使用PLL,PCLK=12MHz,设置波特率为115200,那么由公式UBRDIVn=(int)(PCLK/(bpsx16))–1可以计算得UBRDIV0,请使用S3C2410数据手册第314页的误差公式验算一下此波特率是否在可容忍的误差范围之内,如果不在,那么需要更换另一个波特率(本实验使用的115200是符合的)。(UARTchannel0Tx/Rxstatusregister):位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。位[1]:发送FIFO是否为空,本实验未用此位位[0]:接收缓冲区是否有数据,假设有,此位设为1。本实验中,需要不断查询此位一判断是否有数据已经被接收。UTXH0(UARTchannel0transmitbufferregister):把要发送的数据写入此存放器。:如同上述“2、发送数据〞所列,我们用到位[0]URXH0(UARTchannel0receivebufferregister):异步串口实验代码*主函数voidMain(void){inti,j;sysinit();//系统初始化代码,在这里不关心它Uart_Init(0,115200); //初始化串口,115200是波特率定义见下面说明Uart_Select(0); //选择串口0,标准库函数,可直接调用 Uart_Printf("\toUartTest!\n");//在屏幕打印,标准库函数,可直接调用。Uart_Printf("Baudrate=115200,noflowcontrol\n");i=0;while(1){Uart_Printf("i=%d\n",i++); //从串口格式化输出for(j=0;j<0xffffff;j++); //延时}}*主函数中调用的函数的定义voidUart_Init(intpclk,intbaud){inti;if(pclk==0)pclk=PCLK;//参数pclk为0表示选用的时钟为PCLK。rUFCON0=0x0;//UART通道0FIFOcontrolregister,FIFO禁止,不使用。rUFCON1=0x0;//UART通道1FIFOcontrolregister,FIFO禁止,不使用。rUFCON2=0x0;//UART通道2FIFOcontrolregister,FIFO禁止,不使用。rUMCON0=0x0;//UART通道0MODEMcontrolregister,AFC禁止,不使用。rUMCON1=0x0;//UART通道1MODEMcontrolregister,AFC禁止,不使用。//UART0rULCON0=0x3;//Linecontrolregister,对照存放器的定义,可以知道这样赋值定义了数据传输格式:工作在正常模式,没有校验位,1个停止位每帧,每帧8位数据。rUCON0=0x245;//发送和接收都采用查询或中断模式。rUBRDIV0=((int)(pclk/16./baud+)-1);//波特率divisiorregister0,根据公式计算,注意要验证误差范围,误差计算公式文档中已经给出。//UART1,与UART0相似rULCON1=0x3;rUCON1=0x245;rUBRDIV1=((int)(pclk/16./baud)-1);//UART2,与UART0相似rULCON2=0x3;rUCON2=0x245;rUBRDIV2=((int)(pclk/16./baud)-1);for(i=0;i<100;i++);//延时一小会儿}该实验成功后的结果可参看文件夹中的图片。因此,在异步串口实验中,我们需要做的就是完成串口的初始化工作,设定各个控制存放器,波特率等等。有兴趣的读者可以查看该实验中所调用的库函数的具体实现,可以帮助读者理解更多的串口实现的具体细节。查看方法:用ADS翻开该实验的工程文件,在主函数中找到标准库函数的调用处,鼠标右键点击,选择GotofunctiondefinitionofXXX,即可到达指定的库函数定义处。

深刻理解UART 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数11
  • 收藏数0 收藏
  • 顶次数0
  • 上传人小吴
  • 文件大小230 KB
  • 时间2024-04-13