这两天没来上网, 不好意思
我觉得虽然IIS的fifo容量虽然小, 但应该是个循环方式的吧, 也就是说这个fifo不会被填满, 有数据送到播放那边去了。要不然, 64字节的大小,还不够1ms的声音, 然后还要去处理中断, 那播放出来的声音还能连续吗?<br /><br /><br />我的具体经过是这样的, 我看到2410test中有个播放IISTEST的函数, 可以播放wav, 但要用DNW来传文件, 速度很慢, 我就试着用文件系统来做, 先将wav文件全部读入内存, 然后将指针再做处理. <br /><br />这里有个问题, DNW传输时,前4个字节是文件长度, 所以IISTEST函数在处理wav数据时, 是将指针多加了4个字节. 我在处理的时候故意将指针多加了4个字节, 然后再保存数据. (既DNW存储wav文件的地址是rec_buf = (unsigned short *)0x31000000, <br />我的是既DNW存储wav文件的地址是rec_buf = (unsigned short *)0x31000004)<br />这样得到的wav数据大小(size)和采样率(fs)是正确,然后程序往下走,就到了我1楼帖的程序了, 计算size/4的大小, 开启dma传输.<br /><br /><br />声音什么的都是正常的, 唯一的就是老是循环播放一段音乐, 大概是10s左右的样子. 我试着更改下面的程序, 播放的起始地址变了, 但播放长度没变.<br />rDISRC2 = (int)(Buf + 0x30+1765674); //0x31000030~(Remove header) <br /><br /><br />然后我试着更改下面的程序, 就开始出现变调现象, 而播放时间还是10s<br /> rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(0<<20)+(size/4);<br /><br /><br />同样的, 我也试着在DMA传送完成的那个中断中更改DMA传送的数据,<br />void __irq DMA2_Done(void)<br />{<br /> rSRCPND = BIT_DMA2; //Clear pending bit<br /> rINTPND = BIT_DMA2;<br /> rINTPND;<br /><br /> WrUTXH0('@');<br /> if(!which_Buf)<br /> which_Buf = 1;<br /> else<br /> which_Buf = 0;<br />}<br />就是这段程序中, 我更改为<br />void __irq DMA2_Done(void)<br />{<br /> rSRCPND = BIT_DMA2; //Clear pending bit<br /> rINTPND = BIT_DMA2;<br /> rINTPND;<br /><br />//DMA2 Initialize<br /> rDISRC2 = (int)(Buf + 0x30+3765674); //0x31000030~(Remove header) <br /> rDISRCC2 = (0<<1) + (0<<0); //The source is in the system bus(AHB), Increment <br /> rDIDST2 = ((U32)IISFIFO); //IISFIFO <br /> rDIDSTC2 = (1<<1) + (1<<0); //The destination is in the peripheral bus(APB), Fixed <br /> rDCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(0<<20)+(size/4);<br /><br /><br /> WrUTXH0('@');<br /> if(!which_Buf)<br /> which_Buf = 1;<br /> else<br /> which_Buf = 0;<br />}<br /><br />加入了重设DMA的操作, 更改了DMA传输的起始地址, 但没有效果,就是说DMA传输的起始地址没变, 声音播放的长度也没变.<br /><br />最后, 我才考虑, 是不是这个IISTEST程序中在其他地方又重新设置了DMA或其他什么的<br /><br /><br />至于前面所长所说的, "FIFO是64字节啊,你传多了会FIFO会溢出 <br /><br />传少了没问题,效率低点而已。"<br />我看一下2410test里自带的t1.wav文件,这个文件是463k, 播放时间是5s, size/4的话有100多k, 而程序却能很好的播放这个文件, 所以fifo应该是不会溢出才对<br /> <br /> <br />我翻规格书时, IIS部分对DMA传输的描述是这样的:<br />DMA Transfer<br />In this mode, transmit or receive FIFO is accessible by the DMA controller. DMA service request in transmit or<br />receive mode is made by the FIFO ready flag automatically.<br />我觉得传输数据这部分是由DMA自己完成的, 并没有软件的干预.<br /><br />我的那个问题还没解决, 如果这部分不是很清楚的话,估计是很难解决了...
|
|