给楼主推荐一篇**:7.6 WAV声音文件的播放

[复制链接]
6092|26
农民讲习所 发表于 2008-6-25 13:44 | 显示全部楼层

这个是硬件自己控制的,每次DMA16字节,PDF上有

  
农民讲习所 发表于 2008-6-25 13:45 | 显示全部楼层

当LCD的FIFO空的时候,会发出一个中断,中断中只要几个空延

  
high 发表于 2008-6-25 17:23 | 显示全部楼层

所长

22楼的说法,&nbsp;我认为,&nbsp;就算会发出中断不代表在使用中断机制.不存在相关isr来处理dma的计数值和reload操作.我同意21楼说法.可是,如果是硬件控制的,而且不是普通意义的中断处理流程,&nbsp;那不很大可能就是握手机制了?<br /><br />dma存在req和ack控制<br /><br />所以...第一点我觉得是正确的.
农民讲习所 发表于 2008-6-25 17:40 | 显示全部楼层

资料上找不到IIS和DMA的握手部分资料

不好说。所以LZ的第一问俺没回答。<br /><br />关于LCD的DMA,每次都是硬件自己控制的。至于LCD中断,是处理FIFO为空时刻,防止别的DMA占用总线的一个处理方法。俺测试过,如果此中断不打开,显示会抖动。<br /><br />IIS使用DMA大量传送数据,也可能对LCD的DMA产生影响,俺是这么推测的。<br />
农民讲习所 发表于 2008-6-26 09:56 | 显示全部楼层

昨天仔细想了下

应该是DMA都FIFO的触发自动控制,包括握手。<br />那么LZ的情况出现,只能有一个解释:调入的WAVE数据格式不对,会测试时输入了过分的数值。<br /><br />如果LZ能把细节描述出来,说不定能找到问题
 楼主| 1dqmoon 发表于 2008-6-26 22:46 | 显示全部楼层

这两天没来上网, 不好意思

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

测试程序

https://bbs.21ic.com/upfiles/img/20078/200781417305255.rar<br /><br />这个文件是我测试播放wav的程序.&nbsp;ads下直接编译,dnw下载就可以用.&nbsp;里面有个文件系统,wav文件是放在sd卡里的,&nbsp;11.2M,&nbsp;&nbsp;等下看哪里能传上去.<br />这个wav文件是22&nbsp;khz,&nbsp;双声道的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部