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