查看: 3456|回复: 2

[MPC] [求助]MPC5554中通过DMA读取ADC不正确

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
5
最后登录
1970-1-1
发表于 2013-9-1 16:14:53 | 显示全部楼层 |阅读模式
先谢谢各位大神了
求助:我编的MPC5554代码,目的是用DMA循环读取AN4 AN5的电压,但是我发现读回来的都是AN4的电压,不知道为什么
附上代码,如果我只让DMA运行一次主循环(D_REQ=1),可以读取AN4,AN5两个电压,我看了Rappid Toolbox自动生成的代码,里面的DMA根本没有设置为循环队列,为什么可以实现循环读取:
#include "MPC5554.h"
#define CFIFO0_PUSH 0xfff80010
#define RFIFO0_POP  0xfff80032
vint32_t CQUEUE0[4];
vint16_t RQUEUE0[8];
void dma_init_fcn(void);
void eqadc_init_fcn(void);
void dma_init_fcn(void)
{
EDMA.CR.R=0x0000e400;    //用于设置DMA的优先级
EDMA.ERQRL.R=0x00000000; //DMA使能高32位
EDMA.ERQRL.R=0x0000000f; //DMA使能低32位
//DMA错误中断使能寄存器
EDMA.EEIRH.R=0x00000000;
EDMA.EEIRL.R=0x00000000;

EDMA.TCD[0].SADDR=(vuint32_t)&CQUEUE0;  //dma源地址
EDMA.TCD[0].DADDR=CFIFO0_PUSH;        //dma目标地址
EDMA.TCD[0].SMOD=0x00;                //源地址掩码
EDMA.TCD[0].DMOD=0x00;                //目标地址掩码
EDMA.TCD[0].DSIZE=0x02;               //目标传输大小 32位
EDMA.TCD[0].SSIZE=0x02;               //源传输大小 32位   理论上目标与源传输大小应该是一样的
EDMA.TCD[0].SOFF=0x4;                 //源偏移大小 字节
EDMA.TCD[0].DOFF=0x0;                 //目标偏移量 字节
EDMA.TCD[0].NBYTES=0x4;               //次循环一次传输个数
EDMA.TCD[0].SLAST=-8;         //主巡环结束后源地址偏移量,形成循环队列
EDMA.TCD[0].DLAST_SGA=0;              //主循环结束后目标地址偏移量
EDMA.TCD[0].BITER=2;                  //主循环迭代初始值
EDMA.TCD[0].CITER=2;                  //主循环迭代当前值
EDMA.TCD[0].BWC=0;                    //带宽控制,无DMA传输暂停
EDMA.TCD[0].MAJORLINKCH=0;            //
EDMA.TCD[0].MAJORE_LINK=0;
EDMA.TCD[0].DONE=0;
EDMA.TCD[0].ACTIVE=0;
EDMA.TCD[0].E_SG=0;
EDMA.TCD[0].D_REQ=0;
EDMA.TCD[0].INT_HALF=0;
EDMA.TCD[0].INT_MAJ=0;
EDMA.TCD[0].START=0;                  //通道开始
 
    EDMA.TCD[1].SADDR=RFIFO0_POP;  //dma源地址
EDMA.TCD[1].DADDR=(vuint32_t)&RQUEUE0;        //dma目标地址
EDMA.TCD[1].SMOD=0x00;                //源地址掩码
EDMA.TCD[1].DMOD=0x00;                //目标地址掩码
EDMA.TCD[1].DSIZE=0x01;               //目标传输大小 16位 按字记
EDMA.TCD[1].SSIZE=0x01;               //源传输大小 16位   理论上目标与源传输大小应该是一样的
EDMA.TCD[1].SOFF=0x0;                 //源偏移大小 字节
EDMA.TCD[1].DOFF=0x2;                 //目标偏移量 字节
EDMA.TCD[1].NBYTES=2;               //次循环一次传输个数
EDMA.TCD[1].SLAST=0x00;               //主巡环结束后源地址偏移量
EDMA.TCD[1].DLAST_SGA=-8;     //主循环结束后目标地址偏移量,形成循环队列
EDMA.TCD[1].BITER=4;                  //主循环迭代初始值
EDMA.TCD[1].CITER=4;                  //主循环迭代当前值
EDMA.TCD[1].BWC=0;                    //带宽控制,无DMA传输暂停
EDMA.TCD[1].MAJORLINKCH=0;            //
EDMA.TCD[1].MAJORE_LINK=0;
EDMA.TCD[1].DONE=0;
EDMA.TCD[1].ACTIVE=0;
EDMA.TCD[1].E_SG=0;
EDMA.TCD[1].D_REQ=0;
EDMA.TCD[1].INT_HALF=0;
EDMA.TCD[1].INT_MAJ=0;
EDMA.TCD[1].START=0;                  //通道开始

}

void eqadc_init_fcn(void)
{
CQUEUE0[0]=0x000a0400;  //读取AN4电压
CQUEUE0[1]=0x800a0500;  //读取AN5电压

EQADC.MCR.R=0x00000000;
EQADC.NMSFR.R=0x00000000;
EQADC.ETDFR.R=0x00000000;
EQADC.CFCR[0].R=0x0010;
EQADC.IDCR[0].R=0x0000;

//完成DAC配置
EQADC.CFPR[0].B.CFPUSH=0x00000802;
EQADC.CFPR[0].B.CFPUSH=0x00000003;
EQADC.CFPR[0].B.CFPUSH=0x00801f01;
EQADC.CFPR[0].B.CFPUSH=0x82801f01;
EQADC.CFCR[0].B.SSE=1; 
while(EQADC.CFSR.B.CFS0==0x3)
{
}

EQADC.FISR[0].B.EOQF=0x01;
EQADC.CFCR[0].R=0x0000; 
while(EQADC.CFSR.B.CFS0!=0x0)
{
}

EQADC.IDCR[0].R=0x0303; 
EQADC.CFCR[0].R=0x0090;  //连续读取模式

}
int main(void)
{
  volatile int i = 0;

  eqadc_init_fcn();
    for(i=0;i
我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
5
最后登录
1970-1-1
 楼主| 发表于 2013-9-7 17:58:18 | 显示全部楼层

回复:[求助]MPC5554中通过DMA读取ADC不正确

问题解决,Thank me
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
2
最后登录
1970-1-1
发表于 2013-10-28 17:06:53 | 显示全部楼层

回复:[求助]MPC5554中通过DMA读取ADC不正确

我这边也遇到类似问题 能交流一下吗qq547154525
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-8 04:23 , Processed in 0.082688 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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