UART通信实验.docx

上传人:b****4 文档编号:4381967 上传时间:2022-12-01 格式:DOCX 页数:16 大小:4.39MB
下载 相关 举报
UART通信实验.docx_第1页
第1页 / 共16页
UART通信实验.docx_第2页
第2页 / 共16页
UART通信实验.docx_第3页
第3页 / 共16页
UART通信实验.docx_第4页
第4页 / 共16页
UART通信实验.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

UART通信实验.docx

《UART通信实验.docx》由会员分享,可在线阅读,更多相关《UART通信实验.docx(16页珍藏版)》请在冰豆网上搜索。

UART通信实验.docx

UART通信实验

计算机与外部设备之间的通信一般采用两种方式:

并行方式和串行方式。

所谓的并行方式就是各个位同时进行传输的通信方式,这种方式通信主要特点是通信的速度快,但当距离远且位数多的时候并行通信的成本就会高很多。

串行通信分为异步与同步串行通信。

UART(通用异步收发器)就是所谓的异步串行通信协议。

只要通信的双方采用相同的数据帧格式(数据位,开始位,校验位,停止位)和波特率就能在未共享同步时钟信号的情况下通过两根据数据线(RX和TX)进行数据通信。

采用这种方式,当数据传输结束后可以通过置位中断位通知处理器进行相应的处理。

STELLARIS系列ARM芯片的UART具有完全可编程,16C550型串口接口的特性(但并不兼容)。

独立发送FIFO(16B)和接收的FIFO(16B)(firstinfirstout),可以将两个FIFO配置成不同程序的触发中断,可供选择的触发深底见下图中。

如:

接收FIFO配置成1/4触发深度,则当UART收到4个数据时,产生接收中断。

UART模块的特性如下:

下面是PC机的COM接口与ARM芯片的UART接口的典型电路。

注意:

图中的电阻不能省略,否则会影响数据的传输。

U1是Exar(原sipex)公司出产的UART转RS232C的接口芯片SP3232E。

可在3.3V下工作。

 

UART的功能概述:

发送:

发送逻辑从发送FIFO读取的数据执行并->串转换。

控制逻辑执行输出起始位在前的串行流,根据控制寄存器中已编程的配置,后面紧跟数据位(注:

LSB最低位先输出),奇偶校验位,停止位。

接收:

在检测到一个有效的起始脉冲时,接收逻辑对收到以的位流执行串->并转换,此外还会对溢出错误,奇偶校验错误,帧错误和线中止(line-break)错误进行检测。

并将检测到的状态一起写入到接收FIFO中。

波特率的产生:

baud-ratedivisor(波特率除数)是一个22位数,16位整数和6位小数。

波特率发生器利用这个数来决定位周期。

在带有小数的波特率发生器下,UART可以产生所有标准的波特率,且误差小。

数据的收发过程:

#defineUARTConfigSet(ulBase,ulBand-rate,ulConfig)UARTConfigSetExpClk(ulBase,ulUARTClk,ulBaud,ulConfig)

在调用这个宏函数之前,应先调用时钟配置函数,不要使用误差太大的内部振荡器IOSC、IOSC/4、INT30等。

关于ulConfig这个参数的配置:

数据位UART_CONFIG_WLEN_5/6/7/8,停止位UART_CONFIG_STOP_ONE/TWO,

校验位UART_CONFIG_PAR_NONE/ODD/EVEN/ONE/ZERO

UARTEnable();和UARTDisable();这两个是用来使能和禁止UART收发功能的,一般是先将UART配置好后再使能,如果要修改UART配置的话,一般要先禁止再配置再使能。

VoidUARTCharPut(ulBase,ulChar);

LongUARTCharGet(ulBase);这两个函数都是以轮询的方式发送和接收数据的。

如果发送FIFO中有空位则填充要发送的数据,否则等待。

如果接收FIFO中有数据则读出数据并返回,否则等待。

不管是UARTCharPut(ulBase,ulChar)还是UARTCharPutNonBlocking(),在发送数据时实际都是将数据往发送FIFO一丢就走,而并非真正在UNTX管脚意义上真正发送完毕。

函数UARTBusy()则是判断UART发送操作是否忙,可用来判断发送FIFO中的数据是否真正发送完毕。

在UART转半双工的RS-485通信里面,需要在发送完一批数据之后将传输方向切换为接收,如果此时发送FIFO中仍然存在数据未真正被发送出去,则过早的切换方向会破坏发送的过程。

所以此时用UARTBusy()函数是必要的。

在要用到GPIO口的第二功能时就要用相应的配置函数将GPIO口配置成第二功能,如GPIO口用作UART功能时应该用GPIOPinTypeUARTT(ulBase,ulPins);这个函数。

 

UART中断:

UART的回环操作(loopback):

所谓的回环操作就是TX发送的数据被RX输入端接收。

这样有利于调试和检测。

UART的IrDA串行红外(SIR)编码器/解码器模块:

SIR具有的两种模式:

以发送0X59为例,原始数据的0信号被转换成3/16位周期的高脉冲被发射出去,而1信号不会对发射管产生任何的响应。

可以看出开启发射管的时间是相当短的,因而可以节省功耗。

在UNRX接收端,接收管的开启时间同样很短,这也达到了降低功耗的目的。

收发深度触发设置库函数:

UART的SIR模块的使能与禁止:

UART的DMA操作的使能与禁止:

 

UART的收发FIFO是否存在空位的探测函数:

UART的无阻塞形式的数据的收发:

 

UART的线中止的产生与撤销:

注意:

这是函数是控制UnTX引脚的电平状态,从而控制对方的UnRX引脚是否产生一个线中止条件。

 

UART的中断源:

发送FIFO原理(程序):

UART的FIFO的关闭与开启问题:

首先,UART的FIFO是可以关闭的。

FIFO有FIFO的用处,但也有必须关掉FIFO用处。

像我们的设备,UART0用于和电脑连接,进行监测和调试,用FIFO就很不错。

但UART1和UART2需要和别的设备进行通讯,而在通讯协议中必须检测两个字符之间的间隔,这时就不能开FIFO。

所以,一个设计得好的CPU应该既能开FIFO也能关掉。

    Datasheet上也说,复位完成后,两个FIFO都被禁能,提供传统双缓冲接口的1字节深的操作,那为什么很多人感觉FIFO关不掉呢?

其实的原因很简单:

在初始化UART时的一些功能调用打开了FIFO,最主要的是UARTEnable,而UARTConfigSetExpClk在完成了速率等配制后,又调用了UARTEnable。

所以要关掉FIFO很简单,只要在初始化UART的最后加一句:

HWREG(UART1_BASE + UART_O_LCRH) &= ~(UART_LCRH_FEN);

并且LM的UART的FIFO是没有空中断的。

不过当关闭FIFO后,发中断就相当于空中断。

另外ZLG的9616中文翻译关于UART有个错误:

中文版 PAGE292:

在UARTLCRH的位1、位2和位7置位时,发送奇偶校验位,且检测结果为0。

在位1和位7都置位且位2清零时,发送奇偶校验位,且检测结果为1。

英文版PAGE 305:

When bits 1, 2, and 7 of UARTLCRH are set, the parity bit is transmitted and checked as a 0. When bits 1 and 7 are set and 2 is cleared,the parity bit is transmitted and checked as a 1.

这里意思是当bit7置1时,根据bit2强制发送效验位为1或0。

也就是通用串口常用奇偶效验位配置中的 MARK、 SPACE方式。

2008年新出的DustDevil系列(LM3S3000/5000等)已支持DMA!

 

新版的《STELLARIS外设驱动库函数》中新增的UARTBusy()函数。

 

UART的IrDA接收和发送数据:

收发的框架:

实验原理:

UART数据流与半双工红外串行通信脉冲信号转换示意图:

关于用KEIL调试UART串行通信实验:

编译无错后,进入KEIL的DEBUG界面,打开KEIL自带的4个UART#工具中的任一一个,然后打开pripherals中的UART0,因为程序中所用到的是UART0。

然后复位,设置UART0的界面。

开始设置,数据和状态我们是在程序里在实现的,所以不用设置。

我们要设置的是COTROL项和BAUDRATE项,CONTROL中的UARTLCRH寄存器的位设置,FEN选中,WLEN设置为8位,UARTCTL寄存器的位设置,TXE和UARTEN位设置为1.COTROL设置的结果如图:

然后我们要设置的是BUADRATE项:

在这项里面是根据程序中对UART0的通信速率配置参数而定,一般用9600bps,IBRD是波特率除数的整数部分,而FBRD是波特率除数的小数部分。

根据公式BRD=IBRD.FBRD=SYSTEMCLOCK/(16*BUADRATE);而算得IBRD=0X24,设置结果为:

由于程序中未用到中断,所以INTERRUPT项就可以不设置。

经过全局运行可以看到发送FIFO中的数据:

从图中我们可以看到这是我们在主程序里面发送的16B字符,但是在TXFIFO中只有15个?

而且如果我们将这个发送的程序放在WHILE

(1)前执行,那么会发现TXFIFO中的所有数据都被发送了,我们就看不到了,为了看到,我们可以在WHILE

(1)中设置一个断点。

这样我们就可以看见上图了。

当然也可以在WHILE

(1)中不断地发送数据。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1