打印
[DSP编程]

UART通讯

[复制链接]
2580|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
work67|  楼主 | 2013-11-8 15:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 work67 于 2013-11-8 16:08 编辑

这是我找的一个UART的通讯例程,DSP实现将接收到的数据转发回去,不过我对这UART通讯的本质还是弄不清楚,先改成自由发送跟接收的程序,但感觉拎不出来单纯发数据的那部分代码,哪位帮忙给解释一下,感激不尽啊
void main(void)
{
    /* Initialize CSL library - This is REQUIRED !!! */
    /*初始化CSL库*/
    CSL_init();        
    /*设置系统的运行速度为144MHz*/
    PLL_config(&myConfig);
    /*初始化McBSP1*/
    hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
    /*设置McBSP1*/
    MCBSP_config(hMcbsp,&Mcbsp1Config);
    MCBSP_getConfig(hMcbsp,&Mcbsptest);
    settimer();                       
/*************************以下程序实现软件Uart************************/
/* 参考:HX-5509A 开发板使用手册                                     */
        while(TRUE)
        {
                if(uart_recflag==1)
                {
                        uart_recflag = 0;
                        if(uart_sendflag==0)
                        {
                                uart_bitsendcnt = 0;
                                uart_sendend = 0;
                                uart_sendcnten = 0;
                                uart_bitsend = 0;
                                uart_send = 0x41;
                                uart_sendflag = 1;
                                uart_sendbitcnt = 0;
                        }
                }
        };                                                                             
}

interrupt void timer0Isr(void)
{
        temp = REG_PCR1;

        //Send
        if(uart_sendflag==1)
        {
                if(uart_sendcnten==0)
                {
                        REG_PCR1 &= 0xffdf;
                        uart_bitsend = 1;
                        uart_sendcnten = 1;
                }
                if(uart_sendcnten==1)
                {
                        uart_bitsendcnt++;
                        if(uart_bitsendcnt==10)
                        {
                                uart_sendbitcnt++;
                                if(uart_sendend==1)
                                {
                                        uart_sendflag = 0;
                                }
                                else
                                {
                                        if(uart_sendbitcnt<9)
                                        {
                                                if((uart_send & uart_bitsend)==0)
                                                {
                                                        REG_PCR1 &= 0xffdf;
                                                }
                                                else
                                                {
                                                        REG_PCR1 |= 0x0020;
                                                }
                                                uart_bitsend <<= 1;
                                        }
                                        else
                                        {
                                                REG_PCR1 |= 0x0020;
                                                uart_sendflag = 0;
                                        }
                                }
                                uart_bitsendcnt = 0;
                        }
                }
        }
        
        //Receive
        if((uart_bitcnt==0)&&(uart_recstart==0))
        {
                if((temp&0x0010)==0)
                {
                        timer0_cnt = 0;
                        timer0_cnten = 1;
                        uart_bitscan = 0;
                        uart_rec = 0;
                        uart_recstart = 1;
                }
        }
        if(timer0_cnten==1)
        {
                timer0_cnt++;
                if((temp&0x0010)!=0)
                {
                        uart_bitscan++;
                }
                if(timer0_cnt==10)
                {
                        timer0_cnt = 0;
                        if(uart_bitscan>5)
                        {
                                switch(uart_bitcnt)
                                {
                                        case 0:  uart_rec = 0;
                                                 timer0_cnten = 0;
                                                         uart_recstart = 0;
                                                         break;
                                        case 1:  uart_bitcnt++;
                                                         uart_rec |= 0x01;
                                                         break;
                                        case 2:  uart_bitcnt++;
                                                         uart_rec |= 0x02;
                                                         break;
                                        case 3:  uart_bitcnt++;
                                                         uart_rec |= 0x04;
                                                         break;
                                        case 4:  uart_bitcnt++;
                                                         uart_rec |= 0x08;
                                                         break;
                                        case 5:  uart_bitcnt++;
                                                         uart_rec |= 0x10;
                                                         break;
                                        case 6:  uart_bitcnt++;
                                                         uart_rec |= 0x20;
                                                         break;
                                        case 7:  uart_bitcnt++;
                                                         uart_rec |= 0x40;
                                                         break;
                                        case 8:  uart_bitcnt++;
                                                         uart_rec |= 0x80;
                                                         break;
                                        case 9:  uart_bitcnt = 0;
                                                         timer0_cnten = 0;
                                                         uart_recflag = 1;
                                                         uart_recstart = 0;
                                                         break;
                                        default: break;
                                }
                        }
                        else
                        {
                            uart_bitcnt++;
                                if(uart_bitcnt>9)
                                {
                                        uart_bitcnt = 0;
                                        timer0_cnten = 0;
                                }
                        }
                        uart_bitscan = 0;
                }               
        }

}

相关帖子

沙发
zhangmangui| | 2013-11-8 16:45 | 只看该作者
将McBSP配置为串口   你的代码有些乱  
没看出头绪   先看看这本书   
https://bbs.21ic.com/icview-633042-1-1.html

使用特权

评论回复
板凳
work67|  楼主 | 2013-11-8 17:00 | 只看该作者
zhangmangui 发表于 2013-11-8 16:45
将McBSP配置为串口   你的代码有些乱  
没看出头绪   先看看这本书   
https://bbs.21ic.com/icview-633042- ...

谢谢,这个是网上下的程序,是挺乱的,而且发数据也是在中断里面,搞得我很混乱。不过功能是实现了发送接收到的数据,但是用不起来

使用特权

评论回复
地板
zhangmangui| | 2013-11-8 22:49 | 只看该作者
work67 发表于 2013-11-8 17:00
谢谢,这个是网上下的程序,是挺乱的,而且发数据也是在中断里面,搞得我很混乱。不过功能是实现了发送接 ...

慢慢来  加油

使用特权

评论回复
5
work67|  楼主 | 2013-11-11 14:26 | 只看该作者
zhangmangui 发表于 2013-11-8 22:49
慢慢来  加油

使用特权

评论回复
6
zhangmangui| | 2013-11-11 23:54 | 只看该作者
work67 发表于 2013-11-11 14:26

我也在学习5509  多多交流

使用特权

评论回复
7
yangmm11| | 2014-10-14 16:12 | 只看该作者
zhangmangui 发表于 2013-11-11 23:54
我也在学习5509  多多交流

对于这个程序中的一些步骤,我也有不明白的地方,第37行的程序temp = REG_PCR1;中,temp为REG_PCR1中的值,其中
ioport unsigned int *PCR_1=(unsigned int *)0x2c12;
#define REG_PCR1 (*PCR_1)

我弄不明白的是temp中的值应该是引脚上的值,比如输入0xAA,那temp中的值即为0xAA?
就是PC机上的数据如何传送到DSP中尽心该处理的过程不明白。。。

使用特权

评论回复
8
zhangmangui| | 2014-10-14 23:52 | 只看该作者
yangmm11 发表于 2014-10-14 16:12
对于这个程序中的一些步骤,我也有不明白的地方,第37行的程序temp = REG_PCR1;中,temp为REG_PCR1中的值 ...

他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视频   我有分享

使用特权

评论回复
9
yangmm11| | 2014-10-15 08:59 | 只看该作者
zhangmangui 发表于 2014-10-14 23:52
他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...

你说的视频时5509A中的UART通信实验的视频吗?我就是参考UART通信试验中的McBSP配置和软件模拟异步通信这连个视频,理解的这个程序,但是对于程序中的temp里面的值到底怎么改变的,没弄明白。。

使用特权

评论回复
10
yangmm11| | 2014-10-15 10:08 | 只看该作者
zhangmangui 发表于 2014-10-14 23:52
他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...

gpio模式没找到

使用特权

评论回复
11
yangmm11| | 2014-10-15 14:32 | 只看该作者
yangmm11 发表于 2014-10-15 08:59
你说的视频时5509A中的UART通信实验的视频吗?我就是参考UART通信试验中的McBSP配置和软件模拟异步通信这 ...

不明白的是temp中的数据时如何改变的?        temp = REG_PCR1;从这句话看出,应该是REG_PCR1中的值,结合
ioport unsigned int *PCR_1=(unsigned int *)0x2c12;
#define REG_PCR1 (*PCR_1)  它是不是指的是PCR_1中的值?若是的话,和输入DR引脚中寄存器中的值有何关系?即输入的值如何与*PCR_1连接起来?

使用特权

评论回复
12
zhangmangui| | 2014-10-15 22:12 | 只看该作者
yangmm11 发表于 2014-10-15 10:08
gpio模式没找到

您好  这个链接中有很多资料  请查看
有相关视频
https://bbs.21ic.com/icview-689506-1-1.html

使用特权

评论回复
13
yangmm11| | 2014-10-16 15:15 | 只看该作者
zhangmangui 发表于 2014-10-15 22:12
您好  这个链接中有很多资料  请查看
有相关视频
https://bbs.21ic.com/icview-689506-1-1.html

我看完视频之后,结合DR引脚中数据的传输方式,现在对程序是这样理解的:


DSP接收引脚DR中的数据存在了寄存器DRR中,通过访问IOPORT能够访问到DRR寄存器中的值,PCR_1寄存器中的标志位DRSTAT与DXSTAT可判断DR引脚中是否有数据传输,即判断temp中的第四位是否为零。数据未开始传输时,temp第4位为零,开始传输时,为1,其它位值不改变,这样理解是否正确呢?
还有就是,DR引脚中的数据一位一位的开始传输,那传输的值是赋给uart_rec 了?但是看下面switch时,uart_rec初始值为“00000000”,”或“操作完成之后,难道不是变成了全”11111111“,那DR引脚中的每位数据的值从哪体现出来?
switch(uart_bitcnt)
                                {
                                        case 0:  uart_rec = 0;
                                                 timer0_cnten = 0;
                                                         uart_recstart = 0;
                                                         break;
                                        case 1:  uart_bitcnt++;
                                                         uart_rec |= 0x01;
                                                         break;
                                        case 2:  uart_bitcnt++;
                                                         uart_rec |= 0x02;
                                                         break;
                                        case 3:  uart_bitcnt++;
                                                         uart_rec |= 0x04;
                                                         break;
                                        case 4:  uart_bitcnt++;
                                                         uart_rec |= 0x08;
                                                         break;
                                        case 5:  uart_bitcnt++;
                                                         uart_rec |= 0x10;
                                                         break;
                                        case 6:  uart_bitcnt++;
                                                         uart_rec |= 0x20;
                                                         break;
                                        case 7:  uart_bitcnt++;
                                                         uart_rec |= 0x40;
                                                         break;
                                        case 8:  uart_bitcnt++;
                                                         uart_rec |= 0x80;
                                                         break;
                                        case 9:  uart_bitcnt = 0;
                                                         timer0_cnten = 0;
                                                         uart_recflag = 1;
                                                         uart_recstart = 0;
                                                         break;
                                        default: break;
                                }

使用特权

评论回复
14
yangmm11| | 2014-10-16 15:26 | 只看该作者



比如上面的例子中,case的结果分别是uart_rec的每一位“或”之后的结果,那uart_rec的值从程序中可以看出,一开始为0,后来怎么改变的呢?

使用特权

评论回复
15
yangmm11| | 2014-10-16 18:18 | 只看该作者
yangmm11 发表于 2014-10-16 15:26
比如上面的例子中,case的结果分别是uart_rec的每一位“或”之后的结果,那uart_rec的值从程序中可以看 ...

为什么每次case之后的结果,就是所要传输的数据每一位的值,其中“或|”操作的步骤是如何改变uart_rec值的呢?

使用特权

评论回复
16
yangmm11| | 2014-10-30 09:03 | 只看该作者
自己给自己顶一下,哪位好心人给解答一下阿,困扰我好久了

使用特权

评论回复
17
songdaxuan| | 2019-5-24 10:40 | 只看该作者
13年的帖子 19年顶

使用特权

评论回复
18
songdaxuan| | 2019-5-24 10:41 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

65

帖子

2

粉丝