www.pudn.com > hf44b0_TEST.rar > extdma.c
#include#include "..\inc\44b.h" #include "..\inc\44blib.h" #include "..\inc\def.h" void _Zdma0XdreqHandshake(void); #define BUS8 (0) #define BUS16 (1) #define BUS32 (2) #define ENWAIT (1) #define SRAMBE03 (1) //PG3 = DMAMODE0 //PG4 = DMAMODE1 //PE4 = nDMASTART //PE5 = reserved #define SET_XDREQ16() rPDATG=(rPDATG&~(3<<3))|(0x1<<3) #define SET_XDREQ1() rPDATG=(rPDATG&~(3<<3))|(0x2<<3) #define START_XDREQ() {rPDATE=(rPDATE&~(1<<4))|(0x0<<4);\ rPDATE=(rPDATE&~(1<<4))|(0x1<<4);} //DMAMODE[1:0]: 01b= one time request // 10b= 16 time requests #define B1_Tacs (0x0) //0clk #define B1_Tcos (0x0) //0clk #define B1_Tacc (0x1) //2clk #define B1_Tcoh (0x0) //0clk #define B1_Tah (0x0) //0clk #define B1_Tacp (0x0) //2clk #define B1_PMC (0x0) //no page mode volatile int isZdma0Done; void __irq IsrZdma0Done(void) { rI_ISPC=BIT_ZDMA0; isZdma0Done=1; } void Test_ZDma0Xdreq(void) { rBWSCON=rBWSCON&(~0xf0)|(BUS16<<4); rBANKCON1=((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)); rINTMSK|=BIT_GLOBAL; pISR_ZDMA0=(U32)IsrZdma0Done; rINTMSK=~(BIT_GLOBAL|BIT_ZDMA0); rPCONF=rPCONF&(~(0xf<<6))|(0xf<<6);//PF3=nXDACK0,PF4=nXDREQ0 rPCONE=rPCONE&(~(3))|(3); //PE0=CLKOUT rPDATG=rPDATG&(3<<3); rPCONG=rPCONG&~(0xf<<6)|(5<<6); //PG3,4=OUTPUT rPDATE=rPDATE&~(1<<4)|(1<<4); //PE4=H rPCONE=rPCONE&~(3<<8)|(1<<8); //PE4=OUTPUT _Zdma0XdreqHandshake(); } void _Zdma0XdreqHandshake(void) { int i; static U16 bufDst[16]; static U16 bufSrc[16]; Uart_Printf("[ZDMA0,HandShake,unit,16bit Test]\n"); for(i=0;i<16;i++){bufSrc[i]=i;bufDst[i]=0;} isZdma0Done=0; rNCACHBE0=( ( (((unsigned)bufDst+16*4)>>12) +1 )<<16 )|((unsigned)bufDst>>12); rINTMSK=~(BIT_GLOBAL|BIT_ZDMA0); rZDISRC0=(U32)bufSrc|(1<<30)|(1<<28); // half-word,inc rZDIDES0=(U32)bufDst|((U32)2<<30)|(1<<28); // normal,inc rZDICNT0=32|(0x0<<30)|(0x0<<28)|(0x1<<26)|(0x2<<24)|(0x3<<22)|(0x1<<21)|(0x1<<20); //nXDREQ0,handshake,unit,terminal_int,auto-reload,enable DMA, rZDCON0=0x0; // nXDREQ0 enable,CMD=no_command. SET_XDREQ16(); START_XDREQ(); while(isZdma0Done==0);//Uart_Printf("ZDCCNT0=%08x \r",rZDCCNT0); for(i=0;i<16;i++)Uart_Printf("%x,",*((U16 *)bufDst+i)); Uart_Printf("\n"); Cache_Flush(); rNCACHBE0=0; }