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;
}
}