DSP28335 ADC采集 DMA搬数据

[复制链接]
1991|2
 楼主| williamzjy 发表于 2017-3-15 16:02 | 显示全部楼层 |阅读模式
本帖最后由 williamzjy 于 2017-3-15 16:07 编辑

我用f28335 的PWM触发AD采集数据,用DMA搬移数据,发现仿真时cmd文件用28335_RAM_lnk.cmd
,DMA缓冲数组是对的,而用F28335.cmd时,AD值变成两倍了,求各位指点,实在想不通

  1. #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
  2. #include "DSP2833x_Examples.h" // DSP2833x Examples Include File

  3. // Determine when the shift to right justify the data takes place
  4. // Only one of these should be defined as 1.
  5. // The other two should be defined as 0.


  6. // ADC start parameters
  7. #if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
  8. #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
  9. #endif
  10. #if (CPU_FRQ_100MHZ)
  11. #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
  12. #endif
  13. #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz
  14. #define ADC_SHCLK 0xf // S/H width in ADC module periods = 2 ADC cycle




  15. // Global variable for this example



  16. #define CPU_FREQ 150E6
  17. #define LSPCLK_FREQ CPU_FREQ/4
  18. #define SCI_FREQ 115200
  19. #define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1




  20. #define BUF_SIZE 160 // Sample buffer size

  21. // Global variable for this example
  22. Uint16 j = 0,ADC_END = 0; // ADC finish flag



  23. #pragma DATA_SECTION(ADC_Result,"DMARAML4");
  24. volatile float ADC_Result[160];

  25. #pragma DATA_SECTION(DMABuf1,"DMARAML4");
  26. volatile Uint16 DMABuf1[160];

  27. volatile Uint16 *DMADest;
  28. volatile Uint16 *DMASource;
  29. interrupt void local_DINTCH1_ISR(void);


  30. main()
  31. {
  32. Uint16 i;

  33. InitSysCtrl();

  34. // InitSciGpio();

  35. EALLOW;
  36. SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
  37. EDIS;


  38. DINT;

  39. InitPieCtrl();

  40. // Disable CPU interrupts and clear all CPU interrupt flags:
  41. IER = 0x0000;
  42. IFR = 0x0000;

  43. InitPieVectTable();
  44. EALLOW;
  45. // PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
  46. PieVectTable.DINTCH1= &local_DINTCH1_ISR;
  47. EDIS;


  48. // PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
  49. //PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, int1
  50. // IER = 0x100; // Enable CPU INT
  51. IER = M_INT7 ; //Enable INT7 (7.1 DMA Ch1)
  52. EnableInterrupts();




  53. InitAdc(); // For this example, init the ADC




  54. // Specific ADC setup for this example:
  55. AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC clock in ns]
  56. // = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)
  57. // = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)
  58. // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
  59. AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
  60. AdcRegs.ADCTRL1.bit.CPS = 0; //
  61. AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode
  62. AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;
  63. AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
  64. // AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run

  65. // AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature
  66. AdcRegs.ADCCHSELSEQ1.all = 0x0; // Initialize all ADC channel selects to A0
  67. AdcRegs.ADCCHSELSEQ2.all = 0x0; // Initialize all ADC channel selects to A0
  68. AdcRegs.ADCCHSELSEQ3.all = 0x0; // Initialize all ADC channel selects to A0
  69. AdcRegs.ADCCHSELSEQ4.all = 0x0; // Initialize all ADC channel selects to A0

  70. AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 15; // convert and store in 8 results registers

  71. AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
  72. //AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS)

  73. // Assumes ePWM1 clock is already enabled in InitSysCtrl();
  74. EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
  75. EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount
  76. EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
  77. EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value
  78. EPwm1Regs.TBPRD = 0xFFFF; // Set period for ePWM1




  79. // Clear SampleTable
  80. for (i=0; i<BUF_SIZE; i++)
  81. {
  82. DMABuf1[i] = 0x0000;
  83. }


  84. // Configure DMA Channel
  85. DMADest = &DMABuf1[0]; //Point DMA destination to the beginning of the array
  86. DMASource = &AdcMirror.ADCRESULT0; //Point DMA source to ADC result register base
  87. DMACH1AddrConfig(DMADest,DMASource);
  88. DMACH1BurstConfig(15,1,10);
  89. DMACH1TransferConfig(9,-15,(-150 + 1));
  90. DMACH1WrapConfig(100,100,100,100); //Don't use wrap function
  91. DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
  92. OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);


  93. StartDMACH1();
  94. EPwm1Regs.TBCTL.bit.CTRMODE = 0; // count up and start








  95. // Waiting ADC finish
  96. while(!ADC_END);
  97. // Translate DMABuf to ADC_Result
  98. for (i=0; i<BUF_SIZE; i++)
  99. {
  100. ADC_Result[i] = (float)DMABuf1[i] * 3.0 / 4096.0;
  101. }

  102. for(;;);



  103. }






  104. // INT7.1
  105. interrupt void local_DINTCH1_ISR(void) // DMA Channel 1
  106. {

  107. // To receive more interrupts from this PIE group, acknowledge this interrupt
  108. PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;
  109. ADC_END = 1;
  110. }






  111. //===========================================================================
  112. // No more.
  113. //===========================================================================



sdlls 发表于 2017-3-17 20:46 | 显示全部楼层
数据宽度对不对?
sdlls 发表于 2017-3-17 20:55 | 显示全部楼层
是不是ADC转换的时候有问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

72

帖子

8

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