http://blog.chinaaet.com/detail/25424.html
今天继续学习ADSP-BF533的串口通信,UART(Universal Asynchronous Receiver/Transmitter (UART) port)接口,是全双工通用的串行接口,由RX 和TX 两根线组成,扩展RS232 芯片可以直接和计算机串口通讯,通常作为调试用的命令和数据通讯接口。
ADSP-BF533的串口作为一种异步串行通信,可以通过相关寄存器进行以下的配置:
1. 5-8位数据位;
2. 1, 1½,或者2位停止位;
3. 奇、偶校验或者不要检验;
串口通信的波特率可以通过以下公式计算得出:
Baud rate = SCLK/(16 *Divisor)
其中的SCLK是系统时钟频率,Divisor值的范围为1-65536.
通过串口传输的数据至少需要一个起始位和至少一个停止位,再回可有可无的校验位,每一个数据的长度大概为7-12位。传输的数据帧的格式由UART_LCR寄存器进行控制,通常是从数据的最低位LSB开始发送和接收,如下图所示:
跟学习单片机一样,在使用ADSP-BF533的串口功能之前,我们还是先了解和其相关的各个寄存器的功能以及用法。如下为各个寄存器介绍:
1. UART_LCR寄存器:Line Control register (UART_LCR).
该寄存器为线路控制寄存器,主要用于控制传输的数据帧的格式。包括数据位的长度,停止位的长度,校验位的设置等等,寄存器的具体描述如下图所示:
2. UART_LSR寄存器:Line Status register (UART_LSR)
该寄存器为线路状态寄存器,用于获取串口通信过程中的各个标志位的状态,具体的描述如下图,
其中最常用的是第5位THRE和第1位DR,
第5位用于判断数据寄存器THR是否为空的,
如果该位为1则表示数据已经发送出去了。
第1位用于判断UART接收缓存寄存器是否已经接收到新的数据,如果为1表示数据已经接收完成了。其他位还可以判断例如帧错误、校验码错误等状态。
3. UART_THR寄存器和UART_RBR寄存器
Transmit Holding register (UART_THR), the Receive Buffer register (UART_RBR),
分别为传输数据寄存器和接收缓存寄存器,
UART_THR用于串口发送时的数据存放,UART_RBR用于串口接收时数据接收。
4. UART_IER寄存器: Interrupt Enable register (UART_IER).
该寄存器为串口中断使能寄存器,寄存器的具体描述如下图所示,第0位和第1位分别用于使能串口的接收中断使能和发送中断使能。
5. UART_GCTL寄存器:
该寄存器为串口全局控制寄存器,寄存器的具体描述如下图所示,第0位和第3位用得比较多,第0位用于使能内部的串口时钟,第3位则用于控制串口通信接口在空闲时的高低状态。
6. UART_DLL寄存器和UART_DLH寄存器:
这两个寄存器非常重要,用于设置串口通信的波特率,计算公式如下:
Baud rate = SCLK/(16 *Divisor),
Divisor即为DL的值,而DL=UART_DLH<<8|UART_DLL。
下面给出一个官方软件上给出的计算好的波特率表,系统时钟为100MHZ:
根据上表的数据,我们也可以来验证一下计算公式,以最后一个为例,系统时钟为100MHZ,波特率为6250000,根据公式DL=100000000/(16*625000)=1,可知该公式正确。
//××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
//××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
继之前对ADSP-BF533的串口的初次了解,今天继续对其用法进行深入学习。ADSP-BF533处理器提供1个通用异步接收/发送(UART)端口,它与PC标准的UART完全兼容。UART端口为其他外设或主机提供了一个简化的UART接口,支持全双工、有DMA能力的异步串行数据传输。UART端口支持5至8个数据位、1或2个停止位以及无校验、奇校验、偶校验位。下面将从硬件和软件两方面对UART的使用进行学习。
首先是硬件电路的连接,ADSP-BF533的串口电路跟单片机的基本上是一样的,如图1所示,在BF533的芯片管脚上,有两个专用的串口IO TX和RX,然后在图2上,这两个管脚通过一个电平转换芯片MAX232之后转换成计算机电平,然后连接到输出端口DB9,我们再通过串口线连接DB9端口和电脑的串口端,就可以进行串口通信了。
图1
细看图2,我们还可以看出,当BF533往串口发送数据时,数据被送到TX管脚,然后经过芯片转换成RS232_TX,RS232_TX上的数据再通过串口交叉线连接到了PC机的RX管脚,从而被PC接收了,特别注意是要用串口交叉线连接BF533的串口和PC。类似地,当PC发送数据时,数据从PC机上的TX管脚出发,经过交叉线到达RS232_RX管脚,然后再经过MAX232转换成RX信号,从而被BF533接收。以上就是ADSP-BF533与PC机之间进行串口通信的整个过程啦。
图2
接下来是串口通信软件程序的设计。
1.首先是串口初始化函数,如下为BF533的串口初始化程序:
void UARTinit(unsigned short div)
{
*pUART_GCTL=0x0009;----(1)
*pUART_LCR=0x0080;----(2)
*pUART_DLL=div;----(3)
*pUART_DLH=div>>8; ----(4)
*pUART_LCR=0x0003; ----(5)
*pUART_IER=0x0001; ----(6)
}
通过之前对串口各个寄存器的学习,我们可以很容易地看懂每一个语句的作用。第1句的作用是使能串口时钟,并且当串口处于空闲状态时串口线被拉高;第2句的意思是DLAB等于1,即允许访问UART_DLL和UART_DLH寄存器;第3句和第4句是对DLL和DLH寄存器进行赋值,对串口波特率进行设定,对于波特率的计算公式,可以参照前一篇文章(ADSP-BF533 串口通信学习);第5句的作用是设置串口通信的数据位为8位,停止位为1位,无校验,然后还有在设置好波特率后清除DLAB位,从而允许UART_THR、UART_RBR和UART_IER寄存器的访问,这个在后面的数据发送和接收中非常重要。最后一句则是允许串口接收中断。
2.接着是串口发送程序,如下为BF533的串口发送程序:
void Test_TX(void)
{
int i;
for(i=0;i<50;i++) //发送测试函数,将生成的数据通过IR发送出去。
{
*pUART_THR=TXbuf[i];----(1)
while(!(*pUART_LSR&0x0020));----(2)
}
}
BF533的串口发送步骤是非常简单的,只要把数据赋值给UART_THR寄存器,然后判断串口状态寄存器UART_LSR的第6位THRE位,该位是用于判断THR寄存器是否为空,当寄存器为空时,THR被置1,通过第2句,我们知道,当寄存器为空时,程序将退出while循环,从而继续发送其他数据。
3.最后是串口接收程序,串口数据接收一般通过串口中断来实现,如下为串口接收中断程序:
EX_INTERRUPT_HANDLER(UART_ISR)
{
if(*pUART_LSR&DR) //判断是否有新的数据。
{
RXbuf[cont]=*pUART_RBR;
cont++;
}
}
当BF533接收到数据后,如果内部有使能串口接收中断,系统将自动进入中断处理函数,进入函数后,首先判断串口状态寄存器的第1位DR位是否为1,如果该位为1则表示UART_RBR寄存器上保存有新的数据,这时将进行数据接收存放,即把UART_RBR寄存器上的数据存储起来,这样就实现串口数据的接收。感觉是不是很简单,好像比单片机还简单,记得51单片机在接收完串口数据后,还得软件清除中断标志位,而BF533却不用,于是我又查了BF533的官方资料,发现了下面这一句话:“The Break Interrupt (BI), Overrun Error (OE), Parity Error (PE) and Framing Error (FE) bits are cleared when the UART Line Status register (UART_LSR) is read. The Data Ready (DR) bit is cleared when the UART Receive Buffer register (UART_RBR) is read.” 意思是说,中断标志位、溢出标志位、校验位出错标志位、帧错误标志位在串口状态寄存器UART_LSR被读取后将全部被清除。DR位在UART_RBR寄存器被读取后也会自动被清除。基于以上原理,BF533的串口读写程序就显得非常简单了。
至此,对于BF533的串口通信的学习也就告一段落了,呵呵,仅供参考。