您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF53x技术支持专区 -> Blackfin入门教程---BF53x_UART
本帖共有1722个阅读者
发表帖子 发表投票 回复主题
Blackfin入门教程---BF53x_UART
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
Blackfin入门教程---BF53x_UART

接口功能介绍

UART(Universal Asynchronous Receiver/Transmitter (UART) port)接口,是全双工通用的串行接口,由RX和TX两根线组成,扩展RS232芯片可以直接和计算机串口通讯,通常作为调试用的命令和数据通讯接口。

ADSP-BF53x的UART接口,除了支持标准串口功能外,还支持IrDA模式,在硬件上增加一个红外通讯模块可以进行红外数据传输。

当设置IrDA模式后,输出的波形会与原数据相反,且信号宽度变窄。

UART接口通讯的波特率配置值可以通过下面公式进行计算:

BAUD RATE = SCLK/(16 x Divisor)

接口寄存器说明



寄存器

功能

UART_THR

UART传输数据寄存器

UART_RBR

UART接收缓存寄存器

UART_DLL

UART波特率配置低8位寄存器

UART_DLH

UART波特率配置高8位寄存器

UART_IER

UART中断使能寄存器

UART_IIR

UART中断识别寄存器

UART_LCR

UART线路控制寄存器

UART_MCR

UART调制控制寄存器

UART_LSR

UART线路状态寄存器

UART_SCR

UART暂存寄存器

UART_GCTL

UART全局控制寄存器

例子代码分析

       *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中的字符串通过串口发送出,当接收到数据后,会进入中断函数读取数据。

测试结果


上传的附件
   2011682061952.rar [ 341.69 KB ]


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/6/8 20:06:38
zhangchen64d(论坛新手)
zhangchen64d
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:115
积分:3
注册时间:2011/9/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

为什么我运行代码之后看到的是一堆乱码呢。。。而且我向THR里面直接写了一个16进制的数,比如*pUART_THR = 0x0f;显示的也还是乱码?

        


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/7 14:09:49
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

1. 超级终端显示使用的是ASCII码,并非16进制数据。

2.你板卡使用的晶振和代码匹配板卡的晶振频率不同,导致波特率错误,应重新计算匹配波特率。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/9/7 14:22:05
zhangchen64d(论坛新手)
zhangchen64d
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:115
积分:3
注册时间:2011/9/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

是不是由于内核频率不同,经过DIV,所以实际的波特率就不是9600了?


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/7 14:37:25
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
UART的波特率与系统时钟有关,由于内核和系统时钟都是由VCO分出来的,配置不同的内核时钟必然要改变VCO值,同时也会影响系统时钟,可根据现在的系统时钟用 BAUD RATE = SCLK/(16 x Divisor),算出索要配置的值, 写入*pUART_DLL 和*pUART_DLH 寄存器。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/9/7 15:05:45
zhangchen64d(论坛新手)
zhangchen64d
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:115
积分:3
注册时间:2011/9/7
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
OK,谢谢,我看过PLL那一章了,现在不显示乱码了

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/7 15:21:13
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154309 Call, 1 Queries, Processed in 0.035156 second(s),