第8章串行通信_第1页
第8章串行通信_第2页
第8章串行通信_第3页
第8章串行通信_第4页
第8章串行通信_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要内容1324S3C2410简介I/O口时钟与定时器中断5UART6DMA第8章UART8.1UART工作原理1、UART(UniversalAsynchronousReceiverandTransmitter)通用异步收发器,是广泛使用的串行数据传输方式。2、串行数据传输接口标准RS232C是通用的串行数据传输接口标准,常用DB9引脚,DB9引脚定义如下:3、串口之间的连接远距离:串口->调制解调器后连接需要连接串口的各个引脚,串口完全连接近距离:串口之间直接连接常用简单连接(三线连接),只连接发送数据线,接收数据线,地线波特率9600,传输距离不超过15米简单连接完全连接4、UART字符传输格式

UART以字符为单位进行数据传输,每个字符的传输格式如下,一帧数据:

空闲位:高电平起始位:低电平数据位:5-8位校验位:可选停止位:1或2位8.2S3C2410A的UART一、S3C2410UART端口简介1、S3C2410提供3个独立的异步串行端口UARTUART0,UART1,UART22、每个UART都可以运行于中断模式或DMA模式,发出中断请求和DMA请求实现在UART,CPU间的数据传递3、每个UART由波特率发生器、发送器、接收器以及控制单元组成。

UART数据传输过程:s2410UART的每个通道都有16字节的发送FIFO和16字节的接收FIFO。发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到“发送移位器”中,发送移位器将数据一位一位地发送到TXDn上。接收数据时,“接收移位器”将RXDn上的数据一位一位接收过来,然后复制到接收FIFO中,CPU即可从中读取数据。

二、UART相关操作和模式包括数据发送、数据接收、中断产生、波特率产生、回送模式、红外模式和自动流控制1、数据发送数据的格式设置由ULCONn寄存器指定2、数据接收数据的格式设置由ULCONn寄存器指定3、自动流控制(AutoFlowControlAFC)两个数据流控制信号nRTS(请求发送信号),nCTS(允许发送)自动流控制就是由nRTS和nCTS控制数据的发送注意:如UART与调制解调器相连,则必须禁止AFC

4、波特率发生器功能:为每个Uart的发送器和接收器提供时钟波特率发生器操作:波特率时钟=PCLK(UEXTCLK)/(16*16位因子)16位因子由波特率寄存器指定,UBRDIVnUBRDIVn=(int)(PCLK/(bps*16))-1UBRDIVn=(int)(UEXTCLK/(bps*16))-1例:波特率是115200,PCLK是40MHZ,那么UBRDIVn的值为:UBRDIVn=(int)(40000000/(115200*16))-1=(int)(27.1)-1=265、回送模式(测试模式)s2410的UART提供一种测试模式,可用于发现通信连接中的孤立错误。RXD与TXD直接相连发送的数据直接通过RXD接受,从而测试整个系统通过UCONn寄存器设置6、红外模式s2410的UART支持红外的发送和接受,通过ULCONn寄存器设置三、UART使用流程1、选择涉及引脚位UART功能,GPH2~GPH7对应三个UART的RXD,TXD引脚2、设置波特率,传输格式(多少个数据位,校验位,和停止位等)3、选择UART通道的工作模式位查询,中断或DMA模式4、发送写入发送寄存器接受读接收寄存器的值6、查询状态寄存器或设置中断来了解数据是否发送完毕或是否接受完毕实例1:使用2410的UART0实现数据的发送和接受,从UART0接受到PC机发送的数据后,通过UART0发送到PC机,在终端上进行显示。波特率115200,1位停止位,无奇偶校验,8位数据位,使用查询方式。四、与UART相关的寄存器UART行控制寄存器(ULCONn)UART控制寄存器(UCONn)UARTFIFO控制寄存器(UFCONn)UARTModem控制寄存器(UMCONn)UARTTX/RX状态寄存器(UTRSTATn)UART发送缓冲寄存器(UTXHn)UART接收缓冲寄存器(URXHn)UART波特率因子寄存器(UBRDIVn)

四、与UART相关的寄存器1、UBRDIVn(UARTbandratedivisor)功能:设置波特率发生器n=0,1,2地址:UBRDIV0:0x50000028UBRDIV1:0x50004028UBRDIV2:0x50008028UBRDIVn=(int)(PCLK/(bps*16))-1UBRDIVn=(int)(UEXTCLK/(bps*16))-1#definerULCON0(*(volatileunsigned*)0x50000000)//UART0行控制寄存器#definerUCON0(*(volatileunsigned*)0x50000004)//UART0控制寄存器#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFO控制寄存器#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modem控制寄存器#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rx状态寄存器#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rx错误状态寄存器#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFO状态寄存器#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modem状态寄存器#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0波特率因子寄存器……voidUart_Init(intpclk,intbaud){inti;if(pclk==0)pclk=PCLK;rUFCON0=0x0;//UART0FIFO控制寄存器,FIFO禁止rUFCON1=0x0;//UART1FIFO控制寄存器,FIFO禁止rUFCON2=0x0;//UART2FIFO控制寄存器,FIFO禁止rUMCON0=0x0;//UART0MODEM控制寄存器,AFC禁止rUMCON1=0x0;//UART1MODEM控制寄存器,AFC禁止//UART0rULCON0=0x3;//行控制寄存器:正常模式,无奇偶校验,1位停止位,8位数据位。rUCON0=0x245;//控制寄存器

rUBRDIV0=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

……}1、ULCONn(UARTlinecontrol)UART行控制寄存器功能:设置传输格式地址:表8.1位【6】:红外/正常模式选择

0--正常模式;1--红外模式位【5:3】:奇偶校验模式选择

0xx--无奇偶校验;100--奇校验;101--偶校验110--强制校验1;111--强制校验0位【2】:停止位选择

0--1个停止位;1—2个停止位位【1:0】:字长00—5位;01---6位;10---7位;11—8位Uart_Init函数中:rULCON0=0x3;//行控制寄存器:正常模式,无奇偶校验,1位停止位,8位数据位。2、UCONn(UARTcontrol)UART控制寄存器功能:用于选择UART时钟源,设置UART中断方式地址:表8.2位【10】:选择使用的时钟

0—使用PCLK1----使用UEXTCLK位【9】:发送中断类型0—脉冲1---电平位【8】:接受中断类型

0—脉冲1---电平位【7】:使能/禁止RX接收超时中断

0—禁止1----使能位【6】:使能/禁止接收错误中断(如帧错误,溢出错误)0—禁止1----使能位【5】:回送模式选择

0---正常模式1----回送模式位【4】:选择是否在一帧数据中发送间隔信号

0----不发送1------发送位【3:2】:选择如何将TX数据发送到缓冲寄存器中00---禁止01---中断方式或查询方式10---DMA0,DMA3请求11----DMA1请求位【1:0】:选择如何将RX数据接收到缓冲寄存器中00---禁止01---中断方式或查询方式10---DMA0,DMA3请求11----DMA1请求

rUCON0=(0<<10)|(1<<9)|(0<<8)|(0<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<3)|(1<<2)|(1);或rUCON0=0x245;3、UFCONn寄存器(UARTFIFOCONTROL)UARTFIFO控制寄存器功能:用于设置是否使用FIFO,设置FIFO的触发阈值地址:表8.3注意:不使用FIFO时,FIFO深度位1寄存器各位描述见表8.3本例中,不使用FIFO

rUFCON0=0x0;//UART0FIFO控制寄存器,FIFO禁止rUFCON1=0x0;rUFCON2=0x0;即发送FIFO中有多少个数据时产生中断,接收FIFO中有多少个数据时产生中断4、UMCONn(UARTmodemcontrol)UARTMODEM控制器功能:用于设置调制解调器相连的控制信号地址:表8.4位含义:表8.4关键:设置使用AFC,还是调制解调器,使用调制解调器则用软件控制RTS等信号。程序中:AFC(自动流控制)禁止rUMCON0=0x0;//UART0MODEM控制寄存器,AFC禁止rUMCON01=0x0;5、URTSTATn寄存器(UARTTX/RXstatus)发送/接收状态寄存器功能:用来指示发送和接收的状态,见表8.5地址:URTSTAT0->0x50000010URTSTAT1->0x50004010URTSTAT2->0x50008010位【1】:发送缓冲区空位当发送缓冲区中没有数据时,此位由硬件自动设为11---发送缓冲器空0----不空位【0】:接收缓冲区数据就绪位当接收到数据时,此位由硬件自动设为11----接到数据0----未接到数据说明:查询法实现串口数据发送和接收,主要时查询这些位数据是否发送完毕,是否已经接收到数据程序中(1)发送的查询

while(!(rUTRSTAT0&0x2));

语句解释:判断UTRSTAT0[1]位是否为0,为0则条件为真,执行while语句,为1则条件为假,执行while语句下面的语句。引申:判断发送缓冲器是否空,“不空”相应为0,条件为真则继续执行while语句等待,“空”相应位为1,条件为假,执行while语句下面的语句。(2)接收的查询

while(!(rUTRSTAT0&0x1))

语句解释:判断UTRSTAT0[0]是否为0,为‘0’则执行while语句,等待,为‘1’则向下执行引申:判断接受缓冲器是否有数据,无接受的数据,继续执行while语句,等待,有接受数据,向下执行位【1】:发送缓冲区空位1---发送缓冲器空0----不空位【0】:接收缓冲区数据就绪位

1----接到数据0----未接到数据6、UERSTATn(UART错误状态寄存器)见表8.6功能:反应UART的错误状态7、UFSTATn(UARTFIFO状态寄存器)见表8.7功能:反应FIFO状态8、UTXHn寄存器(UART发送缓冲寄存器),cpu将数据写入这个寄存器中,UART即会将数据自动发送出去,见表8.8地址UTXH00x50000023UTXH10x50004023UTXH20x50008023【7..0】:存放要发送的数据(8位)9、URXHn寄存器(UART接收缓冲寄存器)UART接收到数据时,cpu读取这个寄存器,即可获得接受数据到的数据,见表8.9URXH00x50000027URXH10x50004027URXH20x50008027【7..0】:存放接受到的数据(8位)程序中:#definerUTXH0(*(volatileunsignedchar*)0x50000023)#definerURXH0(*(volatileunsignedchar*)0x50000027)

10、UBRDIVn(UARTbandratedivisor)功能:设置波特率发生器n=0,1,2地址:UBRDIV0:0x50000028UBRDIV1:0x50004028UBRDIV2:0x50008028见表8.10UBRDIVn=(int)(PCLK/(bps*16))-1UBRDIVn=(int)(UEXTCLK/(bps*16))-1#definerULCON0(*(volatileunsigned*)0x50000000)//UART0行控制寄存器#definerUCON0(*(volatileunsigned*)0x50000004)//UART0控制寄存器#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFO控制寄存器#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modem控制寄存器#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rx状态寄存器#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rx错误状态寄存器#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFO状态寄存器#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modem状态寄存器#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0波特率因子寄存器……实例1:使用2410的UART0实现数据的发送和接受,从UART0接受到PC机发送的数据后,通过UART0发送到PC机,在终端上进行显示。波特率115200,1位停止位,无奇偶校验,8位数据位,使用查询方式。程序举例:使用2410的UART0实现数据的发送和接受,从UART0接受到PC机发送的数据后,通过UART0发送到PC机,在终端上进行显示。从UART0接收数据,然后分别从UART0发送出去。

波特率115200,1位停止位,无奇偶校验,8位数据位,使用查询方式。

1.定义与UART相关的寄存器。#definerULCON0(*(volatileunsigned*)0x50000000)//UART0行控制寄存器#definerUCON0(*(volatileunsigned*)0x50000004)//UART0控制寄存器#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFO控制寄存器#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modem控制寄存器#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rx状态寄存器#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rx错误状态寄存器#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFO状态寄存器#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modem状态寄存器#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0波特率因子寄存器#definerUTXH0(*(volatileunsignedchar*)0x50000020)//发送缓冲寄存器#definerURXH0(*(volatileunsignedchar*)0x50000024)//接收缓冲寄存器#defineWrUTXH0(*(volatileunsignedchar*)0x500000020)#defineRdURXH0(*(volatileunsignedchar*)0x50000024)…2.对串口进行初始化操作。参数pclk为时钟源的时钟频率,band为数据传输的波特率。voidUart_Init(intpclk,intbaud){inti;if(pclk==0)pclk=PCLK;

rUFCON0=0x0;//UART0FIFO控制寄存器,FIFO禁止rUFCON1=0x0;//UART1FIFO控制寄存器,FIFO禁止rUFCON2=0x0;//UART2FIFO控制寄存器,FIFO禁止

rUMCON0=0x0;//UART0MODEM控制寄存器,AFC禁止rUMCON1=0x0;//UART1MODEM控制寄存器,AFC禁止//UART0

rULCON0=0x3;//行控制寄存器:正常模式,无奇偶校验,1位停止位,8位数据位。rUCON0=0x245;//控制寄存器rUBRDIV0=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

//UART1

rULCON1=0x3;rUCON1=0x245;//控制寄存器rUBRDIV1=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

//UART2

rULCON2=0x3;rUCON2=0x245;//控制寄存器rUBRDIV2=((int)(pclk/16./baud+0.5)-1);//波特率因子寄存器

for(i=0;i<100;i++);}

voidUart_Select(intch){whichUart=ch;}3.选择通道whichUart为全局变量,指示当前选择的UART通道,如用通道0,则whichUart=04.使用串口发送数据使用串口发送一个字节的代码如下:voidUart_SendByte(intdata){

if(whichUart==0){if(data==‘\n’){//如果输入数据为换行while(!(rUTRSTAT0&0x2));//判断发送缓冲器是否为空,不空则等待,空则向下执行Delay(10);//延时,因为超级终端速度较慢

WrUTXH0=‘\r’;(发送回车符))(或者rUTXH0=‘\r’;

)}while(!(rUTRSTAT0&0x2));//等待直到发送缓冲器不空Delay(10);

WrUTXH0=data;

(发送数据)(或者rUTXH0=data;

)}elsif(whichUart==1){if(data==‘\n’){//如果输入数据为换行while(!(rUTRSTAT1&0x2));//判断发送缓冲器是否为空,不空则等待,空则向下执行)Delay(10);//延时,因为超级终端速度较慢WrUTXH0=‘\r’;(发送回车符))(或者rUTXH1=‘\r’;)}while(!(rUTRSTAT1&0x2));//等待直到发送缓冲器不空Delay(10);WrUTXH0=data;(发送数据)(或者rUTXH1=data;)}elsif(whichUart==2){if(data==‘\n’){//如果输入数据为换行while(!(rUTRSTAT2&0x2));//判断发送缓冲器是否为空,不空则等待,空则向下执行)Delay(10);//延时,因为超级终端速度较慢rUTXH2=‘\r’;(发送回车符))(或者WrUTXH0=‘\r’;)}while(!(rUTRSTAT2&0x2));//等待直到发送缓冲器不空Delay(10);WrUTXH0=data;(发送数据)(或者rUTXH2=data;)}5、串口发送字符串voidUart_SendString(char*pt){while(*pt)Uart_SendByte(*pt++);}6、串口屏幕打印,串口发送数据voidUart_Printf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论