您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 如何通过配置寄存器来实现MDMA的Descri... 
本帖共有846个阅读者
发表帖子 发表投票 回复主题
如何通过配置寄存器来实现MDMA的Descriptor List Flow 模式
ai754012(论坛新手)
ai754012
头衔:社区公民
帮派:无帮无派
帖数:20
金钱:256
积分:24
注册时间:2013/7/25
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如何通过配置寄存器来实现MDMA的Descriptor List Flow 模式
急求  如何通过配置寄存器来实现MDMA的Descriptor List Flow 模式(不用ADI的库函数)?
我按照数据手册来做完全错了,OP有最简单的配置例程吗?


虚心向学
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/11 0:24:36
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
不好意思,没有这个代码

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2014/7/12 21:11:01
ai754012(论坛新手)
ai754012
头衔:社区公民
帮派:无帮无派
帖数:20
金钱:256
积分:24
注册时间:2013/7/25
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
我配置成功了,发一下代码,回馈一下OPENADSP
该代码是在BF609运行的
#pragma pack(4)
typedef struct DmaDescListMode
{
    struct DmaDescListMode       *pNext;             /*!< Next list descriptor work unit in the chain */
    void                            *pStartAddress;     /*!< Start address of the data buffer to be processed */
    uint32_t                        Config;             /*!< DMA Configuration register - Specify Transfer word size (MSIZE/PSIZE) and Trigger configuration */
    uint32_t                        XCount;             /*!< Inner loop count start value in number of DMA data bus width (MSIZE) transfers */
    int32_t                         XModify;            /*!< Inner loop address increment in bytes */
    uint32_t                        YCount;             /*!< Outer loop count start value in number of rows */
    int32_t                         YModify;            /*!< Outer loop address increment in bytes */
    bool                            bCallbackWhenDone;  /*!< TRUE to notify application via callback on completion of this work unit */
} DMA_DESC_LIST_MODE;
#pragma pack()

DMA_DESC_LIST_MODE  ScrList[3];
DMA_DESC_LIST_MODE  DesList[3];
//section ("sdram0_bank3") unsigned char DestDataBuf[900000];
/***** Instances to handle List descriptor transfers ******/
/*=============  C O D E  =============*/
volatile int InProgress=1;
void DEST_MDMA_Handler0 (void);
void MemCopyListMode(unsigned char *SrcDataBufXC,unsigned char *DestDataBufXC)
{
adi_int_InstallHandler(INTR_MDMA0_DST, DEST_MDMA_Handler0, 0, true);
/* Prepares data buffers for Memory DMA copy */
//配置需要注意事项:1.把最后的一组描述符配置为stop模式。
//2.Config要配置成(ENUM_DMA_CFG_DSCLIST | ENUM_DMA_CFG_ADDR2D | ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_EN)
for (char i = 0; i <2; i++)
    {
ScrList[i].pStartAddress         = SrcDataBufXC+i * 200;
ScrList[i].Config                = ENUM_DMA_CFG_EN | ENUM_DMA_CFG_ADDR2D  | ENUM_DMA_CFG_READ| ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_DSCLIST;
//ENUM_DMA_CFG_DSCLIST | ENUM_DMA_CFG_ADDR2D | ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_EN
ScrList[i].XCount                = 200;
ScrList[i].XModify               = 1;
ScrList[i].YCount                = 1000;
ScrList[i].YModify               = 1;
ScrList[i].bCallbackWhenDone     = false;

//DMA Config - only specify memory transfer size

DesList[i].pStartAddress        = DestDataBufXC+i * 200;
DesList[i].Config               = ENUM_DMA_CFG_EN | ENUM_DMA_CFG_ADDR2D  | ENUM_DMA_CFG_WRITE| ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_DSCLIST;
DesList[i].XCount               = 200;
DesList[i].XModify              = 1;
DesList[i].YCount               = 1000;
DesList[i].YModify              = 1;//
DesList[i].bCallbackWhenDone    = false;


    ScrList[i].pNext = &ScrList[i+1];
    DesList[i].pNext = &DesList[i+1];

    }

ScrList[2].pNext = NULL;
    DesList[2].pNext = NULL;
ScrList[2].pStartAddress         = SrcDataBufXC+2*200;
ScrList[2].Config                = ENUM_DMA_CFG_EN | ENUM_DMA_CFG_ADDR2D  | ENUM_DMA_CFG_READ| ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_DSCLIST;
//ENUM_DMA_CFG_DSCLIST | ENUM_DMA_CFG_ADDR2D | ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_EN
ScrList[2].XCount                = 200;
ScrList[2].XModify               = 1;
ScrList[2].YCount                = 1000;
ScrList[2].YModify               = 1;
ScrList[2].bCallbackWhenDone     = false;

//DMA Config - only specify memory transfer size
DesList[2].pStartAddress        = DestDataBufXC+2 * 200;
DesList[2].Config               = ENUM_DMA_CFG_EN | ENUM_DMA_CFG_ADDR2D  | ENUM_DMA_CFG_WRITE| ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_DSCLIST;
DesList[2].XCount               = 200;
DesList[2].XModify              = 1;
DesList[2].YCount               = 1000;
DesList[2].YModify              = 1;//
DesList[2].bCallbackWhenDone    = false;
    /* IF (End of list) */
    ScrList[2].Config &= ~BITM_DMA_CFG_FLOW;//把最后一组描述符置为stop
    DesList[2].Config &= ~BITM_DMA_CFG_FLOW;//
    DesList[2].Config |= ENUM_DMA_CFG_YCNT_INT;//
    DesList[2].bCallbackWhenDone = true;

    ssync();
/* Prepares descriptors for Memory DMA copy */
/* configure source registers */
*pREG_DMA21_DSCPTR_NXT=ScrList;
*pREG_DMA21_CFG = ENUM_DMA_CFG_EN | ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_READ  | ENUM_DMA_CFG_DSCLIST ;//| ENUM_DMA_CFG_SYNC;
/* configure destination registers */
*pREG_DMA22_DSCPTR_NXT=DesList;
*pREG_DMA22_CFG = ENUM_DMA_CFG_EN | ENUM_DMA_CFG_FETCH07 | ENUM_DMA_CFG_WRITE  | ENUM_DMA_CFG_DSCLIST; //| ENUM_DMA_CFG_SYNC;
/* enable DMA */
//*pREG_DMA22_STAT |= ENUM_DMA_STAT_IRQDONE ;//clear the bit
ssync();
while(InProgress);
}

虚心向学
等级:论坛新手 参考IP地址:*.*.*.*
2014/7/14 20:58:19
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢分享

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/7/15 8:23:27
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154597 Call, 1 Queries, Processed in 0.015625 second(s),