work67 发表于 2013-11-8 15:52

UART通讯

本帖最后由 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 static/image/common/back.gif
将McBSP配置为串口   你的代码有些乱
没看出头绪   先看看这本书   
https://bbs.21ic.com/icview-633042- ...

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

zhangmangui 发表于 2013-11-8 22:49

work67 发表于 2013-11-8 17:00 static/image/common/back.gif
谢谢,这个是网上下的程序,是挺乱的,而且发数据也是在中断里面,搞得我很混乱。不过功能是实现了发送接 ...

慢慢来加油

work67 发表于 2013-11-11 14:26

zhangmangui 发表于 2013-11-8 22:49 static/image/common/back.gif
慢慢来加油

zhangmangui 发表于 2013-11-11 23:54

work67 发表于 2013-11-11 14:26 static/image/common/back.gif


我也在学习5509多多交流

yangmm11 发表于 2014-10-14 16:12

zhangmangui 发表于 2013-11-11 23:54 static/image/common/back.gif
我也在学习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中尽心该处理的过程不明白。。。

zhangmangui 发表于 2014-10-14 23:52

yangmm11 发表于 2014-10-14 16:12 static/image/common/back.gif
对于这个程序中的一些步骤,我也有不明白的地方,第37行的程序temp = REG_PCR1;中,temp为REG_PCR1中的值 ...

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

yangmm11 发表于 2014-10-15 08:59

zhangmangui 发表于 2014-10-14 23:52 static/image/common/back.gif
他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...

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

yangmm11 发表于 2014-10-15 10:08

zhangmangui 发表于 2014-10-14 23:52 static/image/common/back.gif
他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...

gpio模式没找到

yangmm11 发表于 2014-10-15 14:32

yangmm11 发表于 2014-10-15 08:59 static/image/common/back.gif
你说的视频时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连接起来?

zhangmangui 发表于 2014-10-15 22:12

yangmm11 发表于 2014-10-15 10:08 static/image/common/back.gif
gpio模式没找到

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

yangmm11 发表于 2014-10-16 15:15

zhangmangui 发表于 2014-10-15 22:12 static/image/common/back.gif
您好这个链接中有很多资料请查看
有相关视频
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;
                              }

yangmm11 发表于 2014-10-16 15:26




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

yangmm11 发表于 2014-10-16 18:18

yangmm11 发表于 2014-10-16 15:26 static/image/common/back.gif
比如上面的例子中,case的结果分别是uart_rec的每一位“或”之后的结果,那uart_rec的值从程序中可以看 ...

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

yangmm11 发表于 2014-10-30 09:03

自己给自己顶一下,哪位好心人给解答一下阿,困扰我好久了

songdaxuan 发表于 2019-5-24 10:40

13年的帖子 19年顶

songdaxuan 发表于 2019-5-24 10:41

页: [1]
查看完整版本: UART通讯