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.

发贴,寻求帮助, 28335ADC 的DMA方式



问题:

     对ADC的某 一个 通道用DMA方式采样。 怎么做, ADC的模式,和DMA的参数怎么配合。  看了有关TI上的例程, 还是理解不是很好;  

下面是一个对两通道采样的代码, 调试能过了,  但有有些东西还是不明白。

// 采样方式设置
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 0 双排序 1 级联模式
AdcRegs.ADCTRL3.bit.SMODE_SEL= 0; // 0 顺序采样 1 同步采样
AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 0 启停模式 1 连续模式

//采样通道设置
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;

AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 1; // Set up ADC to perform 4 conversions for every SOC

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x1;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x1;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x0;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x1;

DMA部分

volatile int16 debugDB[16]={1, 2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16};       // 用于替代ADC结果寄存器, 速度在太快时不能分辨结果值时用。

// DMACH1AddrConfig(DMADest,DMASource);
DMACH1AddrConfig(pDest,debugDB);
// DMACH1AddrConfig(pDest,DMASource);
DMACH1BurstConfig(1,1,SAMPLE_SIZE);
DMACH1TransferConfig(SAMPLE_SIZE-1,-1,0);
DMACH1WrapConfig(3,0,0,1);
DMACH1ModeConfig(DMA_SEQ1INT,PERINT_ENABLE,ONESHOT_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);

StartDMACH1();

extern void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);
extern void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);
extern void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);
extern void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);
那位能明确的介绍下这几个函数及参数的意义吗

  • 楼主你好!

    DMA作用是不需要CPU参与而将某些数据从一个地址搬运到另一个地址,DMA并不能触发ADC采样。

    我先楼主的意思应该是ADC转换完后,有DMA将ADC结果寄存器内容搬运到RAM中吧?

    关于那个几个函数功能和参数含义,楼主可以仔细看DSP2833x_DMA.c以及DMA模块功能,应该就很容易弄清楚了!

  • AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 1; // Set up ADC to perform 4 conversions for every SOC

    这句的含义明明是,每次SOC,完成2路转换,注释有问题啊!

    DMACH1WrapConfig(3,0,0,1);

    我觉得你这句有问题啊,每进行完4次burst以后,源地址回到初始位置,每进行完1次burst,目的地址变为起始地址+1,如果这样的话,第一次burst完成以后,目的地址本来应该指向debugDB[1],执行了wrap以后,目的地址还是指向debugDB[1],也就是说,下次burst以后,会把你上一次的结果覆盖掉一个。源地址的设置讲得通。