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 p)
{
*pUART_GCTL=0x0009;----(1)
*pUART_LCR=0x0080;----(2)
*pUART_DLL=p;----(3)
*pUART_DLH=p>>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的串口通信的学习也就告一段落了,呵呵,仅供参考。