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.

28335 DMA寄存器配置问题

最近在学习28335,其中dma 的寄存器配置一直不大明白,希望有朋友能解答下:

利用DMA传输adc 的数据时

void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)   // bsize代表每一帧需要转换的通道数, srcbstep代表每传输一个通道后源地址增加数,desbstep代表每传输一个通道后目标地址增加数

void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)// tsize代表需要传输的帧数(16个通道轮流传输完算一次,总共需要传输的次数)。后面2个变量不懂

void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep) // 前面srcwsize为≥0整数时 当已经传递的脉冲数为srcwsize+1的整数倍时,上一帧的源地址+1作为这一次的源地址

当已经传递的脉冲数为deswsize+1的整数倍时,上一帧的目标地址+1作为这一次的源地址

不知道我的注释理解有没有问题,如果总共有16通道的ADC数据,每个通道采集BUF_SIZE个点(也就是采集BUF_SIZE次)那么如下配置对吗?每次传输16通道的数据,共传输BUF_SIZE次,但是,每次传输,是怎么控制DMA传输的呢?

                DMACH1BurstConfig(15,1,BUF_SIZE);
                DMACH1TransferConfig(BUF_SIZE-1,0,1); 
                DMACH1WrapConfig(0,0,0,1);    //Don't use wrap function

  • 凡高 说:

    最近在学习28335,其中dma 的寄存器配置一直不大明白,希望有朋友能解答下:

    利用DMA传输adc 的数据时

    void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep)   // bsize代表每一帧需要转换的通道数, srcbstep代表每传输一个通道后源地址增加数,desbstep代表每传输一个通道后目标地址增加数

    void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep)// tsize代表需要传输的帧数(16个通道轮流传输完算一次,总共需要传输的次数)。后面2个变量不懂

    void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep) // 前面srcwsize为≥0整数时 当已经传递的脉冲数为srcwsize+1的整数倍时,上一帧的源地址+1作为这一次的源地址

    当已经传递的脉冲数为deswsize+1的整数倍时,上一帧的目标地址+1作为这一次的源地址

    不知道我的注释理解有没有问题,如果总共有16通道的ADC数据,每个通道采集BUF_SIZE个点(也就是采集BUF_SIZE次)那么如下配置对吗?每次传输16通道的数据,共传输BUF_SIZE次,但是,每次传输,是怎么控制DMA传输的呢?

                    DMACH1BurstConfig(15,1,BUF_SIZE);
                    DMACH1TransferConfig(BUF_SIZE-1,0,1); 
                    DMACH1WrapConfig(0,0,0,1);    //Don't use wrap function

    也在学DMA传输,按照我的理解应该是

    DMACH1BurstConfig(BUF_SIZE-1,0,1);
    DMACH1TransferConfig(16*BUF_SIZE-1,1,1);
    DMACH1WrapConfig(15,0,15,0); //Don't use wrap function

    然后在中断中完成DMA的传输

  •  DMACH1BurstConfig(15,1,1);

    DMACH1TransferConfig(BUF_SIZE-1,0,1);

    DMACH1WrapConfig(65535,0,65535,0);

    这样配置出来的结果是:1,2,3,4,5……15,16,1,2,3,4,5……15,16,1,2,3……共BUF_SIZE个循环

    DMACH1BurstConfig(15,1,BUF_SIZE);

    DMACH1TransferConfig(BUF_SIZE-1,0,0);

    DMACH1WrapConfig(65535,0,0,1);

    这样配置出来的结果是:1,1,1,1,1……2,2,2,2,2……3,3,3,3,3……………………16,16,16,16

    前一种是我个人使用的方式,后一种是我按照寄存器说明理解的方式

  • 你好,我的方式和你第二种方式主要区别在   DMACH1TransferConfig(BUF_SIZE-1,0,0); 最后一个参数 我是1,你这是0,这个数据具体什么意思能说下嘛?

    DMACH1WrapConfig(65535,0,0,1);  第一个我觉得65535 和0 没啥区别,不知道是否这样

    另外 这三个寄存器配置能讲解下吗?你的方式 的配置方式不是很明白、

  • 不大明白 你的理解,DMACH1BurstConfig(BUF_SIZE-1,0,1);    BUF_SIZE应该是每个AD通道采集的点数吧,所以是不是应该放最后一个参数

  • 我用下面的配置

                    DMACH1BurstConfig(15,1,BUF_SIZE);
                    DMACH1TransferConfig(BUF_SIZE-1,0,0); 
                    DMACH1WrapConfig(0,0,0,1);    //Don't use wrap function

    发现效果是一样的。。。不明白啥意思