|
以下是我写的一段通过IIS接口播放音频的程序<br /><br />void BoFangYinPing(U32 Addr)<br />{<br /> U16 *buf;<br /> U16 *buf_tmp;<br /> U32 size;<br /> U8 i;<br /> <br /> buf = (U16 *)Addr;<br /> buf_tmp = buf + 22;<br /> size = (*(buf + 21) << 16) | *(buf + 20);<br /> <br /> pllcon_save = rPLLCON;<br /> <br /> rPLLCON = (0x69 << 12) | (0x17 << 4) | 0; //如果不屏蔽不可播放<br /> Delay(10);<br /> <br /> rIISCON=0x02;<br /> //IIS interface enable: no<br /> //IIS prescaler enable: yes<br /> //receive channel idle command: IISLRCK is generated<br /> //transmit channel idle command: IISLRCK is generated<br /> //receive DMA service request enable:no<br /> //transmit DMA service request enable:no<br /> <br /> //Master,Tx,L-ch=low,iis,16bit ch.,codeclk=256fs,lrck=32fs rIISMOD=0x89;<br /> //Serial bit clock frequency slect:32fs<br /> //Master clock(CODECLK) frequency select:256fs<br /> //Serial data bit per channel:16 bit<br /> //Serial interface format: IIS compatible format<br /> //Active level of left/right channel:Low for left channel ( high for right channel)<br /> //Transmit/rec.eive mode select:transfer mode<br /> //Master/slave mode:master mode<br /> <br /> //Prescaler_A/B enable, value=3<br /> rIISPSR=0x33; <br /> //prescaler value B:3<br /> //Prescaler value A:3<br /><br /> //Tx/Rx normal,Tx FIFO enable--> start piling.... <br /> rIISFCON=0x200; <br /> //receive fifo enable:no<br /> //transmit fifo enable:yes<br /> //receive fifo access mode:normal access mode<br /> //transmite access mode select:normal access mode<br /> <br /> /****** IIS Tx Start ******/<br /> rIISCON |=0x1;<br /> while(Uart_Getch() != ESC_KEY) <br /> {<br /> if(IIS_FIFOREADY)<br /> {<br /> for(i=0;i<8;i++)<br /> { <br /> *rIISFIF = *buf_tmp++;<br /> } <br /> if( ((U32)buf_tmp-(U32)(buf+22)) > size )<br /> {<br /> buf_tmp = (U16 *)(buf+22);<br /> WrUTXH0('#');<br /> }<br /> }<br /> }<br /> /****** IIS Tx Stop ******/<br /> <br /> rIISCON=0x0; //IIS stop<br /> <br /> rPLLCON = pllcon_save;<br /> Delay(10);<br /> <br />}<br />一开始总是不能播放音频,经过检查,我发现问题出在Uart_Printf()函数。这个函数原先是这样定义的<br />char Uart_Getch(void)<br />{ <br /> while(!(rUTRSTAT0 & 0x1)); //Receive data ready<br /> return RdURXH0();<br />}<br />如果改为<br />char Uart_Getch(void)<br />{ <br /> if(rUTRSTAT0 & 0x1) //Receive data ready<br /> return RdURXH0();<br />}<br />就可以播放音频了。<br /><br />两种写法,逻辑上是一样的啊,为什么会有这么大的区别呢?<br />请高手指教,不胜感谢!<br /> |
|