硬件准备
ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接
接口功能介绍
UART(Universal Asynchronous Receiver/Transmitter (UART) port)接口,是全双工通用的串行接口,由 RX 和TX 两根线组成,扩展 RS232 芯片可以直接和计算机串口通讯,通常作为调试用的命令和数据通讯接口。
ADSP-BF533的 UART 接口,除了支持标准串口功能外,还支持 IrDA 模式,在硬件上增加一个红外通讯模块可以进行红外数据传输。
当设置 IrDA 模式后,输出的波形会与原数据相反,且信号宽度变窄,下图是 IrDA 模式下和正常模式下的比较。
UART 接口通讯的波特率配置值可以通过下面公式进行计算:
BAUD RATE = SCLK/(16 x Divisor)
接口寄存器说明
核心代码分析
*pUART_GCTL=0x0009;
*pUART_LCR=0x0080;// DLAB=1 允许访问 DLL 和 DLH
*pUART_DLL=div; //将变量 div 的值写入波特率配置寄存器
*pUART_DLH=div>>8; //DLL DLH 分别赋值
*pUART_LCR=0x0003;// 允许访问 RBR THR 和 IER
*pUART_IER=0x0001;// 接收中断允许
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xf3ffffff; // UART 中断等级设置
*pSIC_IAR2 = 0xffffffff;
register_handler(ik_ivg10, UART_ISR); // 注册 UART 中断等级为 10,标志为 UART_ISR
*pSIC_IMASK = 0x00004000; //使能 UART 中断
*pUART_THR=TXbuf[i]; //向 UART 传输数据寄存器写数据
while(!(*pUART_LSR&0x0020)); //等待传输完成
EX_INTERRUPT_HANDLER(UART_ISR) //UART 接收数据中断函数
{
if(*pUART_LSR&DR) //判断是否有新的数据。
{
if(cont>512) //防止 buff 溢出,测试代码,将接收到的数据重复写入 512 字节的 buff
cont = 0;
RXbuf[cont]=*pUART_RBR; //读取数据
cont++;
}
}
代码实现功能
代码实现了配置波特率为 9600,设定了数据接收中断,运行代码后,会将数组 Txbuf 中的字符串通过串口发送出,当接收到数据后,会进入中断函数读取数据。
完整代码
#include
#include
unsigned char RXbuf[512];
unsigned char TXbuf[50]={“\nTest UART in ADSP-EDU-BF53x Board\r\n\n”};
int cont;
void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}
void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}
void UARTinit(unsigned int rate,unsigned int system_clk)
{
unsigned int div;
div = system_clk/rate/16;
*pUART_GCTL=0x0009;
*pUART_LCR=0x0080; // DLAB=1 允许访问DLL 和DLH
*pUART_DLL=div;
*pUART_DLH=div>>8; //DLL DLH分别赋值
*pUART_LCR=0x0003; //允许访问 RBR THR 和IER
*pUART_IER=0x0001; //接收中断允许
}
EX_INTERRUPT_HANDLER(UART_ISR)
{
if(*pUART_LSR&DR) //判断是否有新的数据。
{
if(cont>512) //防止buff溢出,测试代码,将接收到的数据重复写入512字节的buff
cont = 0;
RXbuf[cont]=*pUART_RBR;
cont++;
}
}
void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xf3ffffff; // UART 中断等级定义
*pSIC_IAR2 = 0xfffFFffF;
register_handler(ik_ivg10, UART_ISR); // UART ISR -> IVG 10
*pSIC_IMASK = 0x00004000;
}
void Test_TX(void)
{
int i;
for(i=0;i<50;i++) //发送测试函数,将生成的数据通过IR发送出去。
{
*pUART_THR=TXbuf[i];
while(!(*pUART_LSR&0x0020));
}
}
main()
{
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
UARTinit(9600,1e8); //9600波特率,100MHz系统时钟
Init_Interrupts();
while(1)
Test_TX();
}