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

[复制链接]
6062|26
 楼主| 1dqmoon 发表于 2008-6-23 14:32 | 显示全部楼层 |阅读模式
程序段如下&nbsp;,&nbsp;来自2410test程序中的2410iis.c&nbsp;文件:<br /><br />rINTSUBMSK&nbsp;|=&nbsp;BIT_SUB_RXD0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;*(Buf&nbsp;+&nbsp;0x2c)&nbsp;|&nbsp;*(Buf&nbsp;+&nbsp;0x2d)&lt&lt8&nbsp;|&nbsp;*(Buf&nbsp;+&nbsp;0x2e)&lt&lt16&nbsp;|&nbsp;*(Buf&nbsp;+&nbsp;0x2f)&lt&lt24;<br />&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;=&nbsp;(size&gt&gt1)&lt&lt1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fs&nbsp;&nbsp;&nbsp;=&nbsp;*(Buf&nbsp;+&nbsp;0x1c)&nbsp;|&nbsp;*(Buf&nbsp;+&nbsp;0x1d)&lt&lt8&nbsp;|&nbsp;*(Buf&nbsp;+&nbsp;0x1e)&lt&lt16&nbsp;|&nbsp;*(Buf&nbsp;+&nbsp;0x1f)&lt&lt24;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Sample&nbsp;Size&nbsp;=&nbsp;0x%x\n&quot;,size/2);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;Sampling&nbsp;Frequency&nbsp;=&nbsp;%d&nbsp;Hz\n&quot;,fs);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;\n[&nbsp;Now&nbsp;play&nbsp;the&nbsp;wave&nbsp;file&nbsp;.....]\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;If&nbsp;you&nbsp;want&nbsp;to&nbsp;mute&nbsp;or&nbsp;no&nbsp;mute&nbsp;push&nbsp;the&nbsp;'EIN0'&nbsp;key&nbsp;repeatedly\n&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Init1341(PLAY);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//DMA2&nbsp;Initialize<br />&nbsp;&nbsp;&nbsp;&nbsp;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 />&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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Handshake[31],&nbsp;Sync&nbsp;PCLK[30],&nbsp;CURR_TC&nbsp;Interrupt&nbsp;Request[29],&nbsp;Single&nbsp;Tx[28],&nbsp;Single&nbsp;service[27],&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//I2SSDO[26:24],&nbsp;DMA&nbsp;source&nbsp;selected[23],Auto-reload[22],&nbsp;Half-word[21:20],&nbsp;size/2[19:0]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rDMASKTRIG2&nbsp;=&nbsp;(0&lt&lt2)&nbsp;+&nbsp;(1&lt&lt1)&nbsp;+&nbsp;(0&lt&lt0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//No-stop[2],&nbsp;DMA2&nbsp;channel&nbsp;On[1],&nbsp;No-sw&nbsp;trigger[0]&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IIS&nbsp;Initialize<br />&nbsp;&nbsp;&nbsp;&nbsp;if(fs==44100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//11.2896MHz(256fs)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIISPSR&nbsp;=&nbsp;(4&lt&lt5)&nbsp;+&nbsp;4;&nbsp;&nbsp;&nbsp;//Prescaler&nbsp;A,B=4&nbsp;&lt-&nbsp;FCLK&nbsp;112.896MHz(1:2:2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIISPSR&nbsp;=&nbsp;(2&lt&lt5)&nbsp;+&nbsp;2;&nbsp;&nbsp;&nbsp;//Prescaler&nbsp;A,B=2&nbsp;&lt-&nbsp;FCLK&nbsp;135.4752MHz(1:2:4)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIISPSR&nbsp;=&nbsp;(4&lt&lt5)&nbsp;+&nbsp;4;&nbsp;&nbsp;&nbsp;//Prescaler&nbsp;A,B=4&nbsp;&lt-&nbsp;FCLK&nbsp;225.792MHz(226MHz)(1:2:4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//fs=22050,&nbsp;5.6448MHz(256fs)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIISPSR&nbsp;=&nbsp;(9&lt&lt5)&nbsp;+&nbsp;9;&nbsp;&nbsp;&nbsp;//Prescaler&nbsp;A,B=9&nbsp;&lt-&nbsp;FCLK&nbsp;112.896MHz(1:2:2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIISPSR&nbsp;=&nbsp;(5&lt&lt5)&nbsp;+&nbsp;5;&nbsp;&nbsp;&nbsp;//Prescaler&nbsp;A,B=5&nbsp;&lt-&nbsp;FCLK&nbsp;135.4752MHz(1:2:4)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIISPSR&nbsp;=&nbsp;(9&lt&lt5)&nbsp;+&nbsp;9;&nbsp;&nbsp;&nbsp;//Prescaler&nbsp;A,B=9&nbsp;&lt-&nbsp;FCLK&nbsp;225.792MHz(226MHz)(1:2:4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;rIISCON&nbsp;=&nbsp;(1&lt&lt5)&nbsp;+&nbsp;(1&lt&lt2)&nbsp;+&nbsp;(1&lt&lt1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Tx&nbsp;DMA&nbsp;enable[5],&nbsp;Rx&nbsp;idle[2],&nbsp;Prescaler&nbsp;enable[1]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Master&nbsp;mode[8],Tx&nbsp;mode[7:6],Low&nbsp;for&nbsp;Left&nbsp;Channel[5],IIS&nbsp;format[4],16bit&nbsp;ch.[3],CDCLK&nbsp;256fs[2],IISCLK&nbsp;32fs[1:0]<br />&nbsp;&nbsp;&nbsp;&nbsp;rIISMOD&nbsp;=&nbsp;(0&lt&lt8)&nbsp;+&nbsp;(2&lt&lt6)&nbsp;+&nbsp;(0&lt&lt5)&nbsp;+&nbsp;(0&lt&lt4)&nbsp;+&nbsp;(1&lt&lt3)&nbsp;+&nbsp;(0&lt&lt2)&nbsp;+&nbsp;(1&lt&lt0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIISFCON&nbsp;=&nbsp;(1&lt&lt15)&nbsp;+&nbsp;(1&lt&lt13);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Tx&nbsp;DMA,Tx&nbsp;FIFO&nbsp;--&gt&nbsp;start&nbsp;piling....<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;\nPress&nbsp;any&nbsp;key&nbsp;to&nbsp;exit!!!\n&quot;);<br /><br /><br /><br />问题如下&nbsp;:<br /><br />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 />中,&nbsp;最后的(size/4)是用来决定传输数据多少的吧?&nbsp;为什么这个数不能改成其他的?&nbsp;我改成其他的后,&nbsp;播发出来的声音是变调的。但如果我改成0,&nbsp;反而还能正常播放.<br /><br /><br />另外,&nbsp;为什么这段程序只能循环播放一段音乐,&nbsp;我试着改变(size/4)的值使它能完整播发一个wav文件,却始终做不到。这个又是为什么啊。<br /><br /><br />关于2410的IIS,&nbsp;哪里能找到更多的解释?&nbsp;&nbsp;比如对那个Prescaler&nbsp;的解释等
阿南 发表于 2008-6-23 17:27 | 显示全部楼层

没记错的话,size是wav文件的大小,这里是设置DMA操作的内存大

单位是字,即4个字节
 楼主| 1dqmoon 发表于 2008-6-23 23:05 | 显示全部楼层

re

如果这里是设置DMA操作的内存大小的话,&nbsp;那我更改这个值,&nbsp;影响的只是播放时间的长度吧,&nbsp;但实际我在更改时,&nbsp;导致播放速度加快,&nbsp;进而使得播放时间加长,&nbsp;但这不是我想要的.<br /><br /><br />DMA操作的单位应该是由(0&lt&lt20)&nbsp;&nbsp;这个来决定的吧?&nbsp;&nbsp;有字节,&nbsp;半字,&nbsp;字三种.&nbsp;这个我也改过,&nbsp;结果还是一样,不能改变播放的内容.<br /><br />这段程序给我的感觉是,&nbsp;DMA操作的内存大小是固定.<br /><br />也许其他地方能做更改.
阿南 发表于 2008-6-24 10:46 | 显示全部楼层

楼主可以对着数据手册的寄存器设置仔细分析这段代码

  
 楼主| 1dqmoon 发表于 2008-6-24 14:01 | 显示全部楼层

re

分析出来就不用问了&nbsp;:(<br /><br />因为那个DMA传输字节数的问题,&nbsp;和表现出来的太远了。&nbsp;传输的数据多,&nbsp;播放的时间也就应该多,&nbsp;所以我怀疑是不是IIS那部分也有什么问题?
农民讲习所 发表于 2008-6-24 14:28 | 显示全部楼层

DMA每批传送数据是有限的

pDMA-&gtDCON&nbsp;&nbsp;&nbsp;=&nbsp;0x80000000|(1&lt&lt30)|(1&lt&lt27)|(1&lt&lt22)|(DMADEPTH)|(1&lt&lt28)|(0x10&lt&lt20);&nbsp;&nbsp;&nbsp;&nbsp;//握手、HCLK、全部、完成关闭、burst、字<br /><br />DMADEPTH就是DMA每次传送的大小,字模式下为4的倍数。不能太大,否则会冲掉其它位数据。
high 发表于 2008-6-24 14:54 | 显示全部楼层

所长好

我有异议,&nbsp;所长说的DMADEPTH应该是dma的总大小.&nbsp;但实际dma有握手机制,&nbsp;不会一次全发.&nbsp;这每次的大小究竟多少?&nbsp;是fifo的允许大小还是dma控制的计数?终究这个数是系统自己决定的,&nbsp;也可以不关心.&nbsp;但在dma传这1小片时候,&nbsp;系统是否能够响应中断?
农民讲习所 发表于 2008-6-24 16:15 | 显示全部楼层

IIS的FIFO是64字节的

是否这个原因?
阿南 发表于 2008-6-24 21:57 | 显示全部楼层

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

在《ARM&nbsp;Linux入门与实践》一书中,现在已经放在书友会中,让大伙先赌为快,呵呵
 楼主| 1dqmoon 发表于 2008-6-24 22:56 | 显示全部楼层

re

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 />2410的规格书中提到,&nbsp;<br />Note&nbsp;that&nbsp;the&nbsp;actual&nbsp;number&nbsp;of&nbsp;bytes&nbsp;that&nbsp;are&nbsp;transferred&nbsp;is&nbsp;computed&nbsp;by<br />the&nbsp;following&nbsp;equation:&nbsp;DSZ&nbsp;x&nbsp;TSZ&nbsp;x&nbsp;TC.&nbsp;Where,&nbsp;DSZ,&nbsp;TSZ&nbsp;(1&nbsp;or&nbsp;4),<br />and&nbsp;TC&nbsp;represent&nbsp;data&nbsp;size&nbsp;(DCONn[21:20]),&nbsp;transfer&nbsp;size&nbsp;(DCONn[28]),<br />and&nbsp;initial&nbsp;transfer&nbsp;count,&nbsp;respectively.<br /><br />如果<br />DSZ=1<br />TSZ为&nbsp;unit传输<br />则实际的传输字节数就是TC了,&nbsp;&nbsp;TC是20位,&nbsp;最大也就是0xfffff,&nbsp;约为1MB,&nbsp;<br />这个就是播放的音乐的长度.......<br /><br />---------<br />不知道这样理解是否正确,&nbsp;但还是没搞明白为什么播放的时间不能改变...
 楼主| 1dqmoon 发表于 2008-6-24 22:59 | 显示全部楼层

刚看到阿南斑主新书的目录

看来要解决我这个问题要等到斑主的书发售之后了....
农民讲习所 发表于 2008-6-24 23:04 | 显示全部楼层

FIFO是64字节啊,你传多了会FIFO会溢出

传少了没问题,效率低点而已。
dadong 发表于 2008-6-24 23:13 | 显示全部楼层

做个记号

rt
high 发表于 2008-6-25 05:14 | 显示全部楼层

所长好

可能我前面说的不够清楚.&nbsp;我存在2个疑问<br /><br />1.&nbsp;握手.&nbsp;因为dma有握手控制,&nbsp;所以dma的计数值可以远大于fifo,&nbsp;这样的内部控制机制使得实际'传多了'也不会溢出.&nbsp;一阵理想情况是发64个,&nbsp;让出总线,&nbsp;得到握手信号,&nbsp;继续发64个.&nbsp;<br /><br />2.&nbsp;因此dma的传输不是连续的,&nbsp;是一小片一小片的,&nbsp;(如1所说的一种情况下,&nbsp;64个字节一片),&nbsp;在发送这一小片期间,&nbsp;中断是否可以响应?是否影响实时性?
农民讲习所 发表于 2008-6-25 09:18 | 显示全部楼层

不是这样的

IIS只是触发了DMA的transmit,没有限制传递个数,也没有FIFO满停止功能。只是触发功能。<br />基本DMA都是这样的。
high 发表于 2008-6-25 09:28 | 显示全部楼层

可是实际情况如此

<br />1.&nbsp;握手&nbsp;<br />2.&nbsp;优先级<br /><br />如果推翻1.&nbsp;可驱动使用dma的size总是大于fifo,&nbsp;如何解释呢?<br />对于2,&nbsp;我得到的信息是dma优先级大于中断.&nbsp;如果推翻1也很糟糕.&nbsp;象lcd控制器的dma可是大段传输,&nbsp;1秒60frame,每个frame上百k的持续传输.&nbsp;lcd控制器不会有那么大的fifo.
农民讲习所 发表于 2008-6-25 10:30 | 显示全部楼层

对于2

LCD的DMA也是固定数目,好象也是64字节/次。
农民讲习所 发表于 2008-6-25 10:32 | 显示全部楼层

是16字节

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

你是显式地进行控制的吗?

退一步说,&nbsp;是否是这样的设计:dma&nbsp;传16个字节,&nbsp;然后触发dma中断,&nbsp;然后继续dma&nbsp;16个字节?&nbsp;那中断频率会很恐怖.&nbsp;
high 发表于 2008-6-25 13:38 | 显示全部楼层

楼主问题解决没有?

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

253

帖子

0

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