UART通信实验Word格式.docx
《UART通信实验Word格式.docx》由会员分享,可在线阅读,更多相关《UART通信实验Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
![UART通信实验Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/30/19ddd6a3-ae09-4f86-b92e-fe2482a1c548/19ddd6a3-ae09-4f86-b92e-fe2482a1c5481.gif)
注意:
图中的电阻不能省略,否则会影响数据的传输。
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
checked
as
a
0.
1
set
2
cleared,the
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)中不断地发送数据。