[DSP编程] UART通讯

[复制链接]
 楼主| work67 发表于 2013-11-8 15:52 | 显示全部楼层 |阅读模式
本帖最后由 work67 于 2013-11-8 16:08 编辑

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

  34. interrupt void timer0Isr(void)
  35. {
  36.         temp = REG_PCR1;

  37.         //Send
  38.         if(uart_sendflag==1)
  39.         {
  40.                 if(uart_sendcnten==0)
  41.                 {
  42.                         REG_PCR1 &= 0xffdf;
  43.                         uart_bitsend = 1;
  44.                         uart_sendcnten = 1;
  45.                 }
  46.                 if(uart_sendcnten==1)
  47.                 {
  48.                         uart_bitsendcnt++;
  49.                         if(uart_bitsendcnt==10)
  50.                         {
  51.                                 uart_sendbitcnt++;
  52.                                 if(uart_sendend==1)
  53.                                 {
  54.                                         uart_sendflag = 0;
  55.                                 }
  56.                                 else
  57.                                 {
  58.                                         if(uart_sendbitcnt<9)
  59.                                         {
  60.                                                 if((uart_send & uart_bitsend)==0)
  61.                                                 {
  62.                                                         REG_PCR1 &= 0xffdf;
  63.                                                 }
  64.                                                 else
  65.                                                 {
  66.                                                         REG_PCR1 |= 0x0020;
  67.                                                 }
  68.                                                 uart_bitsend <<= 1;
  69.                                         }
  70.                                         else
  71.                                         {
  72.                                                 REG_PCR1 |= 0x0020;
  73.                                                 uart_sendflag = 0;
  74.                                         }
  75.                                 }
  76.                                 uart_bitsendcnt = 0;
  77.                         }
  78.                 }
  79.         }
  80.         
  81.         //Receive
  82.         if((uart_bitcnt==0)&&(uart_recstart==0))
  83.         {
  84.                 if((temp&0x0010)==0)
  85.                 {
  86.                         timer0_cnt = 0;
  87.                         timer0_cnten = 1;
  88.                         uart_bitscan = 0;
  89.                         uart_rec = 0;
  90.                         uart_recstart = 1;
  91.                 }
  92.         }
  93.         if(timer0_cnten==1)
  94.         {
  95.                 timer0_cnt++;
  96.                 if((temp&0x0010)!=0)
  97.                 {
  98.                         uart_bitscan++;
  99.                 }
  100.                 if(timer0_cnt==10)
  101.                 {
  102.                         timer0_cnt = 0;
  103.                         if(uart_bitscan>5)
  104.                         {
  105.                                 switch(uart_bitcnt)
  106.                                 {
  107.                                         case 0:  uart_rec = 0;
  108.                                                  timer0_cnten = 0;
  109.                                                          uart_recstart = 0;
  110.                                                          break;
  111.                                         case 1:  uart_bitcnt++;
  112.                                                          uart_rec |= 0x01;
  113.                                                          break;
  114.                                         case 2:  uart_bitcnt++;
  115.                                                          uart_rec |= 0x02;
  116.                                                          break;
  117.                                         case 3:  uart_bitcnt++;
  118.                                                          uart_rec |= 0x04;
  119.                                                          break;
  120.                                         case 4:  uart_bitcnt++;
  121.                                                          uart_rec |= 0x08;
  122.                                                          break;
  123.                                         case 5:  uart_bitcnt++;
  124.                                                          uart_rec |= 0x10;
  125.                                                          break;
  126.                                         case 6:  uart_bitcnt++;
  127.                                                          uart_rec |= 0x20;
  128.                                                          break;
  129.                                         case 7:  uart_bitcnt++;
  130.                                                          uart_rec |= 0x40;
  131.                                                          break;
  132.                                         case 8:  uart_bitcnt++;
  133.                                                          uart_rec |= 0x80;
  134.                                                          break;
  135.                                         case 9:  uart_bitcnt = 0;
  136.                                                          timer0_cnten = 0;
  137.                                                          uart_recflag = 1;
  138.                                                          uart_recstart = 0;
  139.                                                          break;
  140.                                         default: break;
  141.                                 }
  142.                         }
  143.                         else
  144.                         {
  145.                             uart_bitcnt++;
  146.                                 if(uart_bitcnt>9)
  147.                                 {
  148.                                         uart_bitcnt = 0;
  149.                                         timer0_cnten = 0;
  150.                                 }
  151.                         }
  152.                         uart_bitscan = 0;
  153.                 }               
  154.         }

  155. }
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
谢谢,这个是网上下的程序,是挺乱的,而且发数据也是在中断里面,搞得我很混乱。不过功能是实现了发送接 ...

慢慢来  加油
 楼主| work67 发表于 2013-11-11 14:26 | 显示全部楼层
zhangmangui 发表于 2013-11-8 22:49
慢慢来  加油

zhangmangui 发表于 2013-11-11 23:54 | 显示全部楼层
work67 发表于 2013-11-11 14:26

我也在学习5509  多多交流
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中尽心该处理的过程不明白。。。
zhangmangui 发表于 2014-10-14 23:52 | 显示全部楼层
yangmm11 发表于 2014-10-14 16:12
对于这个程序中的一些步骤,我也有不明白的地方,第37行的程序temp = REG_PCR1;中,temp为REG_PCR1中的值 ...

他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视频   我有分享
yangmm11 发表于 2014-10-15 08:59 | 显示全部楼层
zhangmangui 发表于 2014-10-14 23:52
他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...

你说的视频时5509A中的UART通信实验的视频吗?我就是参考UART通信试验中的McBSP配置和软件模拟异步通信这连个视频,理解的这个程序,但是对于程序中的temp里面的值到底怎么改变的,没弄明白。。
yangmm11 发表于 2014-10-15 10:08 | 显示全部楼层
zhangmangui 发表于 2014-10-14 23:52
他这种配置应该只能一次发送一位
要先熟悉UART的原理   相当预计GPIO模拟采集的吧
你看看 有专门讲解的视 ...

gpio模式没找到
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连接起来?
zhangmangui 发表于 2014-10-15 22:12 | 显示全部楼层
yangmm11 发表于 2014-10-15 10:08
gpio模式没找到

您好  这个链接中有很多资料  请查看
有相关视频
https://bbs.21ic.com/icview-689506-1-1.html
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;
                                }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yangmm11 发表于 2014-10-16 15:26 | 显示全部楼层



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yangmm11 发表于 2014-10-16 18:18 | 显示全部楼层
yangmm11 发表于 2014-10-16 15:26
比如上面的例子中,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 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

65

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部