UPP内部回环 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5791|回复: 7

UPP内部回环

[复制链接]

5

主题

17

帖子

1124

积分

金牌会员

Rank: 6Rank: 6

积分
1124
发表于 2016-8-16 13:25:27 | 显示全部楼层 |阅读模式
我用的是TL138EVM-F的开发板,在用FPGA和DSP通信的时候遇到点问题。我看了创龙的例程有UPP的外部回环测试,上板也验证成功了。我现在需要做的是通过FPGA向DSP发送有符号整型数据,再通过DSP对该数据处理后,发送新的带符号整型数据给FPGA。我能否在例程的基础上做一些修改就能达到这样的功能。我尝试了修改FPGA那边的程序没有达到要求。DSP这边不知道该怎么改。创龙的工程师能不能指导下?
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
发表于 2016-8-17 11:29:14 | 显示全部楼层
传输的有符号整型数据是支持的,把数据类型定义成您要传的就行。
回复 支持 反对

使用道具 举报

5

主题

17

帖子

1124

积分

金牌会员

Rank: 6Rank: 6

积分
1124
 楼主| 发表于 2016-8-17 16:27:49 | 显示全部楼层
human 发表于 2016-8-17 11:29
传输的有符号整型数据是支持的,把数据类型定义成您要传的就行。

我看到例程里面通过两个通道发送和接收各都是8位的宽度,但是传输的数据upp_buffer_a中的数据是有大于8位的,那可以直接通过FPGA用8位的通道发送大于8位的数据,问不会出错吗?为什么例程的回环测试可以发送和传输大于接口宽度的数据。
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
发表于 2016-8-17 16:36:45 | 显示全部楼层
我觉得你应该好好看看C语言里的数组是一个什么东西,每一个数组在内存里存储都是连续的,数组在内存里体现出来的就是一片连续的二进制数据,这个跟数据是什么类型没有关系。UPP只需要把内存里的一整片数据以8bit的方式发送出去即可。
回复 支持 反对

使用道具 举报

2

主题

8

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2016-8-18 14:40:55 | 显示全部楼层
Lewis 发表于 2016-8-17 16:36
我觉得你应该好好看看C语言里的数组是一个什么东西,每一个数组在内存里存储都是连续的,数组在内存里体现 ...

请问我修改了UPP内部回环测试的FPGA程序,使FPGA发送固定8位二进制数据给DSP,可为什么DSP收到的数据却是高8位与低8位都是固定数据的16位的二进制数?我是通过将收到的数据读出到串口,发现这个现象的。
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
发表于 2016-9-21 10:24:04 | 显示全部楼层
dsp没有收到数据
回复 支持 反对

使用道具 举报

5

主题

17

帖子

1124

积分

金牌会员

Rank: 6Rank: 6

积分
1124
 楼主| 发表于 2016-9-24 20:51:42 | 显示全部楼层
请问下面这段UPP接收FPGA发来数据的代码,为什么一直进入不了窗口中断,也就是upp_interrupt_count的值一直为0。
  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*              uPP通信 A 通道接收                                                */
  4. /*                                                                          */
  5. /*              2015年06月24日                                              */
  6. /*                                                                          */
  7. /****************************************************************************/
  8. #include <stdio.h>
  9. #include <c6x.h>
  10. #include <math.h>

  11. #include "hw_types.h"                                // 宏命令
  12. #include "hw_syscfg0_C6748.h"            // 系统配置模块寄存器
  13. #include "soc_C6748.h"                            // DSP C6748 外设寄存器
  14. #include "psc.h"                                // 电源与睡眠控制宏及设备抽象层函数声明
  15. #include "interrupt.h"             // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
  16. #include "uartStdio.h"             // 串口标准输入输出终端函数声明
  17. #include "upp.h"
  18. #include "dspcache.h"
  19. /****************************************************************************/
  20. /*                                                                          */
  21. /*              宏定义                                                      */
  22. /*                                                                          */
  23. /****************************************************************************/
  24. // 使用缓存

  25. //配置 DMA
  26. #define upp_line_size        (20)
  27. #define upp_line_count       (20)
  28. #define upp_frame_size       (upp_line_size * upp_line_count)
  29. #define upp_line_offset      (upp_line_size)

  30. /****************************************************************************/
  31. /*                                                                          */
  32. /*              全局变量                                                    */
  33. /*                                                                          */
  34. /****************************************************************************/
  35. //全局变量
  36. volatile int upp_interrupt_count = 0;
  37. volatile int upp_error_count = 0;

  38. //接收缓存变量
  39. signed short data[upp_frame_size/2];



  40. uPPDMAConfig transposeParA;

  41. /****************************************************************************/
  42. /*                                                                          */
  43. /*              函数声明                                                    */
  44. /*                                                                          */
  45. /****************************************************************************/
  46. void InterruptInit(void);
  47. void uPPIntRegister(unsigned int cpuINT );
  48. void uPPIntSetUp(void);
  49. void uPPIsr(void);
  50. static void Delay(volatile unsigned int count);


  51. /****************************************************************************/
  52. /*                                                                          */
  53. /*              中断服务函数                                                */
  54. /*                                                                          */
  55. /****************************************************************************/
  56. void uPPIsr(void)
  57. {
  58.         unsigned int intr_dmai_status;

  59.         intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);

  60.         while (intr_dmai_status != 0)  
  61.         {
  62.                 if (intr_dmai_status & uPP_INT_EOL)
  63.                 {
  64.                         uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOL);
  65.                 }

  66.                 // 窗口接收完成
  67.                 if (intr_dmai_status & uPP_INT_EOW)
  68.                 {
  69.                         uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);
  70.                         upp_interrupt_count++;
  71.                 }

  72.                 if (intr_dmai_status & uPP_INT_ERR)
  73.                 {
  74.                         uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_ERR);
  75.                         upp_error_count++;
  76.                 }

  77.                 if (intr_dmai_status & uPP_INT_UOR)
  78.                 {
  79.                         uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_UOR);
  80.                         upp_error_count++;
  81.                 }

  82.                 if (intr_dmai_status & uPP_INT_DPE)
  83.                 {
  84.                         uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_DPE);
  85.                         upp_error_count++;
  86.                 }

  87.                 // make sure all interrupts are handled
  88.                 intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
  89.         }

  90.         // finally: write 0 to EOI register
  91.         uPPEndOfInt(SOC_UPP_0_REGS);
  92. }



  93. /****************************************************************************/
  94. /*                                                                          */
  95. /*              uPP注册中断                                                           */
  96. /*                                                                          */
  97. /****************************************************************************/
  98. void uPPIntRegister(unsigned int cpuINT )
  99. {
  100.         IntRegister(cpuINT, uPPIsr);
  101.         IntEventMap(cpuINT, SYS_INT_UPP_INT);
  102.         IntEnable(cpuINT);

  103. }


  104. /****************************************************************************/
  105. /*                                                                          */
  106. /*              初始化uPP                                                           */
  107. /*                                                                          */
  108. /****************************************************************************/
  109. void OmaplFpgauPPSetup(void)
  110. {
  111.         PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UPP, PSC_POWERDOMAIN_ALWAYS_ON,
  112.                                      PSC_MDCTL_NEXT_ENABLE);

  113.         // 引脚复用配置
  114.         uPPPinMuxSetup(uPP_CHA_8BIT);

  115.         // uPP复位
  116.         uPPReset(SOC_UPP_0_REGS);

  117.         // 数据格式配置
  118.         uPPDataFmtConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_DataPackingFmt_LJZE | uPP_DataPacking_FULL
  119.                                                         | uPP_InterfaceWidth_8BIT | uPP_DataRate_SINGLE);

  120.         // 通道配置
  121.         uPPChannelConfig(SOC_UPP_0_REGS, uPP_DDRDEMUX_DISABLE | uPP_SDRTXIL_DISABLE | uPP_CHN_ONE
  122.                                                         | uPP_ALL_RECEIVE);

  123.         // 引脚配置
  124.         uPPPinConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_PIN_TRIS | uPP_PIN_WAIT | uPP_PIN_ENABLE | uPP_PIN_START);

  125.         // 时钟配置
  126.         uPPClkConfig(SOC_UPP_0_REGS, uPP_CHB, 57000000, 228000000, uPP_PIN_PHASE_NORMAL);

  127.         // 中断使能
  128.         uPPIntEnable(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);

  129.         // 中断映射
  130.         IntRegister(C674X_MASK_INT5, uPPIsr);//DSP可屏蔽中断5
  131.         IntEventMap(C674X_MASK_INT5, SYS_INT_UPP_INT);//将UPP中断映射到cpu中断
  132.         IntEnable(C674X_MASK_INT5);//使能UPP外设

  133.         // uPP使能
  134.         uPPEnable(SOC_UPP_0_REGS);
  135. }



  136. /****************************************************************************/
  137. /*                                                                          */
  138. /*              DSP 中断初始化                                              */
  139. /*                                                                          */
  140. /****************************************************************************/
  141. void InterruptInit(void)
  142. {
  143.         // 初始化 DSP 中断控制器
  144.         IntDSPINTCInit();

  145.         // 使能 DSP 全局中断
  146.         IntGlobalEnable();
  147. }



  148. /****************************************************************************/
  149. /*                                                                          */
  150. /*              主函数                                                            */
  151. /*                                                                          */
  152. /****************************************************************************/
  153. void main(void)
  154. {
  155.         int i,j;
  156.         char ch[2];
  157.        
  158.         /* 初始化串口终端 使用串口2*/
  159.         UARTStdioInit();
  160.         UARTprintf( "\r\n" );
  161.         UARTprintf( "=================================================\r\n" );
  162.         UARTprintf( "=== uPP A Receive Demo : Start\r\n" );
  163.         UARTprintf( "=================================================\r\n" );

  164.         // DSP 中断初始化
  165.         InterruptInit();

  166.         // uPP 初始化
  167.         OmaplFpgauPPSetup();


  168.         UARTprintf ("\tStarting uPP transfers...\r\n");

  169.         // A通道参数 接收
  170.         transposeParA.WindowAddress = (unsigned int *)((int)data);
  171.         transposeParA.LineCount = upp_line_count;
  172.         transposeParA.ByteCount = (upp_line_size*sizeof(signed short )) ;
  173.         transposeParA.LineOffsetAddress = (upp_line_offset*sizeof(signed short));

  174.         while(1)
  175.         {
  176.                
  177.                 upp_error_count = 0;
  178.         upp_interrupt_count = 0;

  179.          //通道A启动传输
  180.         uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &transposeParA);
  181.                

  182.         //等待upp传输完毕       
  183.          while (upp_interrupt_count == 0 && upp_error_count == 0)
  184.                 {

  185.                         Delay(0x0ff);
  186.                         i++;
  187.                         if(i == 50)
  188.                         {
  189.                            UARTprintf( "ERROR : UPP timeout occurred, aborting transfer ...\r\n" );
  190.                            break;
  191.                         }
  192.                 }

  193.            UARTPuts("\tDo you want to print all the data?(y/n)",-2);
  194.            UARTGets(ch,2);
  195.           UARTPuts("\n", -2);

  196.                 /*打印全部读到的数据*/
  197.                 if(ch[0] == 'y')
  198.          {
  199.                 for(i=0; i<upp_frame_size/2;i++ )
  200.                  {
  201.                         for(j=1; j<=3; j++)
  202.                         {
  203.                                 UARTprintf("data[%d]=%d   ",i,data[i]);

  204.                                 if(i >= upp_frame_size/2)
  205.                                         break;
  206.                         }
  207.                         UARTPuts("\n",-2);
  208.                  }
  209.          }

  210.                 UARTPuts("\n",-2);
  211.                 UARTPuts("\n",-2);
  212.                 UARTPuts("\n",-2);
  213.                 UARTPuts("\n",-2);
  214.                 UARTPuts("\n",-2);
  215.                 UARTPuts("\n",-2);
  216.         }
  217. }



  218. /****************************************************************************/
  219. /*                                                                          */
  220. /*              延时                                                        */
  221. /*                                                                          */
  222. /****************************************************************************/
  223. static void Delay(volatile unsigned int count)
  224. {
  225.     while(count--);
  226. }

复制代码
回复 支持 反对

使用道具 举报

1

主题

3

帖子

1033

积分

金牌会员

Rank: 6Rank: 6

积分
1033
发表于 2017-1-5 16:50:49 | 显示全部楼层
TH_24 发表于 2016-8-17 16:27
我看到例程里面通过两个通道发送和接收各都是8位的宽度,但是传输的数据upp_buffer_a中的数据是有大于8位 ...

你好  解决了吗?我也在做这个  遇到一些问题  想和你讨论一下  我的QQ448916030   期待你的回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-4-17 04:41 , Processed in 0.043751 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表