ClearPending(BIT_DMA2); <br /> rINTMOD = 0x0;<br /> <br /> // initialize philips UDA1341 chip<br /> init_1341(PLAY); <br /><br /> // set BDMA interrupt<br /> pISR_DMA2 = (unsigned)dma2_done;<br /> rINTMSK &= ~(BIT_DMA2);<br /> <br />// initialize variables<br /> f_nDMADone = 0;<br /> <br /> //DMA2 Initialize<br /> rDISRCC2 = (0<<1) + (0<<0); //AHB, Increment<br /> rDISRC2 = ((INT32T)(pWavFile)); <br /> rDIDSTC2 = (1<<1) + (1<<0); //APB, Fixed<br /> rDIDST2 = ((INT32T)IISFIFO); //IISFIFO<br /> rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(1<<20)+nSoundLen/2;<br /> //Handshake, sync PCLK, TC int, single tx, single service, I2SSDO, I2S request, <br /> //Auto-reload, half-word, size/2<br /> rDMASKTRIG2 = (0<<2)+(1<<1)+0; //No-stop, DMA2 channel on, No-sw trigger <br /><br /> //IIS Initialize<br /> //Master,Tx,L-ch=low,iis,16bit ch.,CDCLK=384fs,IISCLK=32fs<br /> rIISCON = (1<<5)+(0<<4)+(0<<3)+(1<<2)+(1<<1);<br /> rIISMOD = (0<<8) + (2<<6) + (0<<5) + (0<<4) + (1<<3) + (1<<2) + (1<<0); <br /> rIISPSR = (2<<5) + 2; //Prescaler_A/B=3 <br /> <br /> //Tx DMA enable,Rx DMA disable,Tx not idle,Rx idle,prescaler enable,stop<br /> rIISFCON = (1<<15) + (1<<13); //Tx DMA,Tx FIFO --> start piling....<br /> <br /> rIISCON |= 0x1; // enable IIS <br /> while( f_nDMADone == 0); <br /> rINTMSK |= BIT_DMA2; <br /> rIISCON = 0x0; // IIS stop<br /><br /><br /><br /><br />void __irq dma2_done(void)<br />{<br /> ClearPending(BIT_DMA2); // clear pending bit<br /> f_nDMADone = 1;<br />}<br /><br /><br /><br /><br />不懂为什么一到while( f_nDMADone == 0); 程序就跑飞呢? |
|