This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28377D: 28377d adc+dma

Part Number: TMS320F28377D
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

i want to utilize the adc module and DMA module to complete the sampling without cpu .i modify the codes in C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_examples_Cpu1\dma_gsram_transfer.and add the adc module in it. the C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_examples_Cpu1\adc_soc_continuous\cpu01 .i modify it's channel for my board.but it can not work ,the program will end at "

while (0==AdcaRegs.ADCINTFLG.bit.ADCINT1);",but when i mask the "dma_inlt()" fuction.the ADC can run normally.is the configuration of DMA conflict to the interruput of ADC? I can not understand .can somebody help me solve the problem? very appreciate you.


follow by codes that i modified a little

//###########################################################################

//

// FILE:   dma_gsram_transfer_cpu01.c

//

// TITLE:  DMA GSRAM Transfer

//

//! \addtogroup cpu01_example_list

//! <h1>DMA GSRAM Transfer (dma_gsram_transfer)</h1>

//!

//!  This example uses one DMA channel to transfer data from a buffer in

//!  RAMGS0 to a buffer in RAMGS1. The example sets the DMA channel

//!  PERINTFRC bit repeatedly until the transfer of 16 bursts (where each

//!  burst is 8 16-bit words) has been completed. When the whole transfer is

//!  complete, it will trigger the DMA interrupt.

//!

//!  \b Watch \b Variables \n

//!  - \b sdata - Data to send

//!  - \b rdata - Received data

//!

//

//###########################################################################

// $TI Release: F2837xD Support Library v210 $

// $Release Date: Tue Nov  1 14:46:15 CDT 2016 $

// $Copyright: Copyright (C) 2013-2016 Texas Instruments Incorporated -

//             http://www.ti.com/ ALL RIGHTS RESERVED $

//###########################################################################

 

//

// Included Files

//

#include "F28x_Project.h"

 

//

// DMA data sections

//

#pragma DATA_SECTION(sdata, "ramgs0");  // map the TX data to memory

#pragma DATA_SECTION(rdata, "ramgs1");  // map the RX data to memory

 

//

// Defines

//

#define BURST       7       // write 7 to the register for a burst size of 8

#define TRANSFER    15      // [(MEM_BUFFER_SIZE/(BURST + 1)) - 1]

#define RESULTS_BUFFER_SIZE 1024

//

// Globals

//

Uint16 sdata[1024];   // Send data buffer

Uint16 rdata[1024];   // Receive data buffer

Uint16 AdcaResult2[1024];

//Uint16 AdcaResult3[1024];

volatile Uint16 *DMADest;

volatile Uint16 *DMASource;

volatile Uint16 done;

 

//

// Function Prototypes

void ConfigureADC(void);

void dma_init(void);

//Setup the ADC for continuous conversions on channel 0

void SetupADCContinuous(void);

__interrupt void local_D_INTCH6_ISR(void);

//void dma_init(void);

void error();

 

//

// Main

//

void main(void)

{

 

   Uint16 resultsIndex;

//

// Step 1. Initialize System Control:

// PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the F2837xD_SysCtrl.c file.

//

   InitSysCtrl();

 

 

 

// Step 2. Initialize GPIO:

// This example function is found in the F2837xD_Gpio.c file and

// illustrates how to set the GPIO to it's default state.

    InitGpio(); // Skipped for this example

 

// Step 3. Clear all interrupts and initialize PIE vector table:

// Disable CPU interrupts

    DINT;

 

// Initialize the PIE control registers to their default state.

// The default state is all PIE interrupts disabled and flags

// are cleared.

// This function is found in the F2837xD_PieCtrl.c file.

    InitPieCtrl();

 

// Disable CPU interrupts and clear all CPU interrupt flags:

    IER = 0x0000;

    IFR = 0x0000;

 

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entire table, even if the interrupt

// is not used in this example.  This is useful for debug purposes.

// The shell ISR routines are found in F2837xD_DefaultIsr.c.

// This function is found in F2837xD_PieVect.c.

    InitPieVectTable();

 

 

 

    EALLOW;  // This is needed to write to EALLOW protected registers

    PieVectTable.DMA_CH6_INT= &local_D_INTCH6_ISR;

    EDIS;    // This is needed to disable write to EALLOW protected registers

 

    // Ensure DMA is connected to Peripheral Frame 2 bridge (EALLOW protected)

    //

    ConfigureADC();

 

            //Setup the ADC for continuous conversions on channel 0

    SetupADCContinuous();

    dma_init();  // set up the dma

    StartDMACH6();

    EALLOW;

    CpuSysRegs.SECMSEL.bit.PF2SEL = 1;

    EDIS;

   

    for(resultsIndex=0;resultsIndex<1024;resultsIndex++)

    {

       

        AdcaResult2[resultsIndex]=0;

    }

 

    //

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block

    PieCtrlRegs.PIEIER7.bit.INTx6 = 1;   // Enable PIE Group 7, INT 2 (DMA CH2)

    IER= M_INT7;                         // Enable CPU INT6

 

 

 

 

 

      EINT;  // Enable Global interrupt INTM

      ERTM;  // Enable Global realtime interrupt DBGM

// Step 5. User specific code, enable interrupts:

// Initialize the data buffers

 

 

//

// Enable interrupts required for this example

//

 

      resultsIndex=0;

      do

      {

 

                   //enable ADCINT flags    若不配置这里,ADC采样后中断不会置位

                   AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;

 

 

          AdcaRegs.ADCINTFLGCLR.all = 0x000F;

          //software force start SOCs

          AdcaRegs.ADCSOCFRC1.all = 0x000C;// initiate the software initiate conversition

 

          //keep taking samples until the results buffer is full

               while(resultsIndex < RESULTS_BUFFER_SIZE)

          {

              //wait for current set of 6 conversions to complete

              while(0 == AdcaRegs.ADCINTFLG.bit.ADCINT1);

              //clear INT flags generated by current 6 conversions

              AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

 

              //save results for current 6 conversions

              //

 

              AdcaResult2[resultsIndex] = AdcaResultRegs.ADCRESULT2;

            

              resultsIndex++;

          }

         

 

          //disable all ADCINT flags to stop sampling

          AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;

 

          asm("   ESTOP0");

         }while(1);

}

//

// When the DMA transfer is complete the program will stop here

//

 

 

 

//

// error - Error Function which will halt the debugger

//

void error(void)

{

   asm("     ESTOP0");  //Test failed!! Stop!

    for (;;);

}

 

//

// dma_init - DMA setup for both TX and RX channels.

//

void dma_init()

{

    //

    // Refer to dma.c for the descriptions of the following functions.

    //

 

    //

    //Initialize DMA

    //

    DMAInitialize();

 

    DMASource = (volatile Uint16 *)&AdcaResultRegs.ADCRESULT2;

    DMADest = (volatile Uint16 *)rdata;

 

    //

    // configure DMA CH6

    //

    DMACH6AddrConfig(DMADest,DMASource);

    DMACH6BurstConfig(BURST,1,1);

    DMACH6TransferConfig(TRANSFER,1,1);

    DMACH6ModeConfig(DMA_ADCAINT1,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,

                    SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,

                    CHINT_END,CHINT_ENABLE);

 

}

 

//

// local_D_INTCH6_ISR - DMA Channel6 ISR

//

__interrupt void local_D_INTCH6_ISR(void)

{

    Uint16 i;

 

    EALLOW;  // NEED TO EXECUTE EALLOW INSIDE ISR !!!

    DmaRegs.CH6.CONTROL.bit.HALT = 1;

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP7; // ACK to receive more interrupts

                                            // from this PIE group

    EDIS;

 

    for( i = 0; i < 1024; i++ )

    {

        //

        // check for data integrity

        //

        if (rdata[i] != i)

        {

            error();

        }

    }

 

    done = 1; // Test done.

    return;

}

 

//

// End of file

//

 

 

//Write ADC configurations and power up the ADC for both ADC A and ADC B

void ConfigureADC(void)

{

    EALLOW;

 

    //write configurations

    AdcaRegs.ADCCTL2.bit.PRESCALE = 15; //set ADCCLK divider to /4  配置ADC时钟,有系统时钟参考时钟

 

    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);

 

 

    //Set pulse positions to late

    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//设置ADC中断产生时机在转换完成后

 

 

    //power up the ADC

    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//上电需要掩饰1ms左右等待上电完成

 

    //delay for 1ms to allow ADC time to power up

    DELAY_US(1000);

 

    EDIS;

}

 

//setup the ADC to continuously convert on one channel

void SetupADCContinuous(void)

{

    Uint16 acqps;

 

    //determine minimum acquisition window (in SYSCLKS) based on resolution

    if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION){

        acqps = 511; //2560ns

    }

    else { //resolution is 16-bit

        acqps = 511; //320ns

    }

 

    EALLOW;

 

    AdcaRegs.ADCSOC2CTL.bit.CHSEL  = 2;  //SOC will convert on channel

    AdcaRegs.ADCSOC3CTL.bit.CHSEL  = 3;  //SOC will convert on channel

 

    AdcaRegs.ADCSOC2CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles

    AdcaRegs.ADCSOC3CTL.bit.ACQPS  = acqps;    //sample window is acqps + 1 SYSCLK cycles

 

    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0; //disable INT1 flag

 

    AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;

 

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 2;  //end of SOC5 will set INT1 flag  最后一个优先级的SOC即可,随时需要修改

   // AdcaRegs.ADCINTFLGCLR.bit.ADCINT1=1;

 

 

    //ADCINT1 will trigger SOCs

 

    AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1;

    AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1;

 

 

 

}

 

  • Hello,

    We have an example in a newer version of F2837xD device support in C2000Ware that does demonstrate how to use the DMA with the ADC. You should be able to access it through the TI cloud tools if you don't want to download the whole C2000Ware package.

    dev.ti.com/.../

    Please look at the example and see if you can use it to get your code working. I don't know of any reason why configuring the DMA would cause the ADC interrupt flag to stop working.

    Thanks,
    Whitney
  • helpful.appreciate you,