您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 问一个有关bf533 MDMA的问题
本帖共有732个阅读者
发表帖子 发表投票 回复主题
问一个有关bf533 MDMA的问题
taotaost(论坛新手)
taotaost
头衔:社区公民
帮派:无帮无派
帖数:16
金钱:244
积分:24
注册时间:2012/3/17
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
问一个有关bf533 MDMA的问题
1、定义了一个descriptor的数组,那么数组元素的顺序是不是固定的?
2、*pMDMA_S0_NEXT_DESC_PTR    = descriptor;后,是不是还要指定一下start_addr?

上传的图片
  2012872324729.jpg [ 17.68 KB 160×203 ] (缩略时请点击查看原图)

 



3、这里如果我按照这个顺序来安排数组descriptor的元素次序,只是没有Y_Count和Y_Modify这两项是不是也可以的?
谢谢啦!

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/8/7 23:03:17
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

1.元素顺序是固定的,通常是由结构体来表述这些描述符。

2.描述符的下一个起始地址可以事先定义好,也可以在代码中生成而更新,需要指定。

3.如果你的描述符是1维的,需要X就可以了,无需Y。

发一个描述符描述的部分代码例子:


typedef struct
{
unsigned short NDPL;  // next descriptor pointer (lower 16-bits)
unsigned short NDPH;  // next descriptor pointer (upper 16-bits)
unsigned short SAL;  // start address (lower 16-bits)    
unsigned short  SAH;        // start address (upper 16-bits)    
unsigned short CFG;     // DMA config                      
unsigned short XCNT;       // X Count                          
unsigned short XMOD;       // X Mod                            
unsigned short YCNT;       // Y Count                          
unsigned short YMOD;       // Y Mod                            
} sDMA_Descriptor_Long;

extern sDMA_Descriptor_Long current_des[2];

//////////////////////////////////////////////////

while(1)
{
  ((audio_list_t *)sport_input_ptr)->des.SAL = (unsigned long)ptr;
  ((audio_list_t *)sport_input_ptr)->des.SAH = ((unsigned long)ptr)>>16;
  ((audio_list_t *)sport_input_ptr)->des.CFG = 0x7900 | WDSIZE_16|DMAEN|DI_EN;
  ((audio_list_t *)sport_input_ptr)->des.XCNT = 1024*16;
  ((audio_list_t *)sport_input_ptr)->des.XMOD = 2;
  ((audio_list_t *)sport_input_ptr)->flag = 1;
  sport_input_ptr = ((audio_list_t *)sport_input_ptr)->next;
  current_play_buffer ++;
  
  ptr += 1024*16*2;

}

/////////////////////////////////////////////////

EX_INTERRUPT_HANDLER(Sport0_TX_ISR)
{
*pDMA2_IRQ_STATUS = 0x0001;

if(current_play_buffer == 0)
{
  if(*pDMA2_NEXT_DESC_PTR == &des1)
  {
   des1.SAL = mute_des.SAL;
   des1.SAH = mute_des.SAH;
   des1.CFG = mute_des.CFG;
   des1.XCNT = mute_des.XCNT;
   des1.XMOD = mute_des.XMOD;
  }else
  {
   des2.SAL = mute_des.SAL;
   des2.SAH = mute_des.SAH;
   des2.CFG = mute_des.CFG;
   des2.XCNT = mute_des.XCNT;
   des2.XMOD = mute_des.XMOD;
  }  
}else
{
  flag = 1;
  if(*pDMA2_NEXT_DESC_PTR == &des1)
  {
   des1.SAL = ((audio_list_t *)sport_output_ptr)->des.SAL;
   des1.SAH = ((audio_list_t *)sport_output_ptr)->des.SAH;
   des1.CFG = ((audio_list_t *)sport_output_ptr)->des.CFG;
   des1.XCNT = ((audio_list_t *)sport_output_ptr)->des.XCNT;
   des1.XMOD = ((audio_list_t *)sport_output_ptr)->des.XMOD;
   ((audio_list_t *)sport_output_ptr)->flag = 0;
  }else
  {
   des2.SAL = ((audio_list_t *)sport_output_ptr)->des.SAL;
   des2.SAH = ((audio_list_t *)sport_output_ptr)->des.SAH;
   des2.CFG = ((audio_list_t *)sport_output_ptr)->des.CFG;
   des2.XCNT = ((audio_list_t *)sport_output_ptr)->des.XCNT;
   des2.XMOD = ((audio_list_t *)sport_output_ptr)->des.XMOD;
   ((audio_list_t *)sport_output_ptr)->flag = 0;
  }
  current_play_buffer --;
  sport_output_ptr = ((audio_list_t *)sport_output_ptr)->next;
}
}



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/8/8 21:59:07
taotaost(论坛新手)
taotaost
头衔:社区公民
帮派:无帮无派
帖数:16
金钱:244
积分:24
注册时间:2012/3/17
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢2楼的回答

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/8/8 22:14:45
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159187 Call, 1 Queries, Processed in 0.031738 second(s),