打印

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

[复制链接]
5037|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1dqmoon|  楼主 | 2008-6-23 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序段如下 , 来自2410test程序中的2410iis.c 文件:

rINTSUBMSK |= BIT_SUB_RXD0;
    
   size = *(Buf + 0x2c) | *(Buf + 0x2d)<<8 | *(Buf + 0x2e)<<16 | *(Buf + 0x2f)<<24;
    size = (size>>1)<<1;

    fs   = *(Buf + 0x1c) | *(Buf + 0x1d)<<8 | *(Buf + 0x1e)<<16 | *(Buf + 0x1f)<<24;

    Uart_Printf("Sample Size = 0x%x\n",size/2);
    Uart_Printf("Sampling Frequency = %d Hz\n",fs);
    Uart_Printf("\n[ Now play the wave file .....]\n");
    Uart_Printf("If you want to mute or no mute push the 'EIN0' key repeatedly\n");

    Init1341(PLAY);

    //DMA2 Initialize
    rDISRC2  = (int)(Buf + 0x30+1765674);               //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);

      //Handshake[31], Sync PCLK[30], CURR_TC Interrupt Request[29], Single Tx[28], Single service[27], 
      //I2SSDO[26:24], DMA source selected[23],Auto-reload[22], Half-word[21:20], size/2[19:0]
      
    rDMASKTRIG2 = (0<<2) + (1<<1) + (0<<0);          //No-stop[2], DMA2 channel On[1], No-sw trigger[0] 

      //IIS Initialize
    if(fs==44100)               //11.2896MHz(256fs)
    {
//        rIISPSR = (4<<5) + 4;   //Prescaler A,B=4 <- FCLK 112.896MHz(1:2:2)
        rIISPSR = (2<<5) + 2;   //Prescaler A,B=2 <- FCLK 135.4752MHz(1:2:4)
//        rIISPSR = (4<<5) + 4;   //Prescaler A,B=4 <- FCLK 225.792MHz(226MHz)(1:2:4)        
    }
    else                        //fs=22050, 5.6448MHz(256fs)
    {
//        rIISPSR = (9<<5) + 9;   //Prescaler A,B=9 <- FCLK 112.896MHz(1:2:2)
        rIISPSR = (5<<5) + 5;   //Prescaler A,B=5 <- FCLK 135.4752MHz(1:2:4)
//        rIISPSR = (9<<5) + 9;   //Prescaler A,B=9 <- FCLK 225.792MHz(226MHz)(1:2:4)        
    }
    rIISCON = (1<<5) + (1<<2) + (1<<1);         //Tx DMA enable[5], Rx idle[2], Prescaler enable[1]
      //Master mode[8],Tx mode[7:6],Low for Left Channel[5],IIS format[4],16bit ch.[3],CDCLK 256fs[2],IISCLK 32fs[1:0]
    rIISMOD = (0<<8) + (2<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);
    
    rIISFCON = (1<<15) + (1<<13);        //Tx DMA,Tx FIFO --> start piling....

    Uart_Printf("\nPress any key to exit!!!\n");



问题如下 :

rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(0<<20)+(size/4);
中, 最后的(size/4)是用来决定传输数据多少的吧? 为什么这个数不能改成其他的? 我改成其他的后, 播发出来的声音是变调的。但如果我改成0, 反而还能正常播放.


另外, 为什么这段程序只能循环播放一段音乐, 我试着改变(size/4)的值使它能完整播发一个wav文件,却始终做不到。这个又是为什么啊。


关于2410的IIS, 哪里能找到更多的解释?  比如对那个Prescaler 的解释等

相关帖子

沙发
阿南| | 2008-6-23 17:27 | 只看该作者

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

单位是字,即4个字节

使用特权

评论回复
板凳
1dqmoon|  楼主 | 2008-6-23 23:05 | 只看该作者

re

如果这里是设置DMA操作的内存大小的话, 那我更改这个值, 影响的只是播放时间的长度吧, 但实际我在更改时, 导致播放速度加快, 进而使得播放时间加长, 但这不是我想要的.


DMA操作的单位应该是由(0<<20)  这个来决定的吧?  有字节, 半字, 字三种. 这个我也改过, 结果还是一样,不能改变播放的内容.

这段程序给我的感觉是, DMA操作的内存大小是固定.

也许其他地方能做更改.

使用特权

评论回复
地板
阿南| | 2008-6-24 10:46 | 只看该作者

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

使用特权

评论回复
5
1dqmoon|  楼主 | 2008-6-24 14:01 | 只看该作者

re

分析出来就不用问了 :(

因为那个DMA传输字节数的问题, 和表现出来的太远了。 传输的数据多, 播放的时间也就应该多, 所以我怀疑是不是IIS那部分也有什么问题?

使用特权

评论回复
6
农民讲习所| | 2008-6-24 14:28 | 只看该作者

DMA每批传送数据是有限的

pDMA->DCON   = 0x80000000|(1<<30)|(1<<27)|(1<<22)|(DMADEPTH)|(1<<28)|(0x10<<20);    //握手、HCLK、全部、完成关闭、burst、字

DMADEPTH就是DMA每次传送的大小,字模式下为4的倍数。不能太大,否则会冲掉其它位数据。

使用特权

评论回复
7
high| | 2008-6-24 14:54 | 只看该作者

所长好

我有异议, 所长说的DMADEPTH应该是dma的总大小. 但实际dma有握手机制, 不会一次全发. 这每次的大小究竟多少? 是fifo的允许大小还是dma控制的计数?终究这个数是系统自己决定的, 也可以不关心. 但在dma传这1小片时候, 系统是否能够响应中断?

使用特权

评论回复
8
农民讲习所| | 2008-6-24 16:15 | 只看该作者

IIS的FIFO是64字节的

是否这个原因?

使用特权

评论回复
9
阿南| | 2008-6-24 21:57 | 只看该作者

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

在《ARM Linux入门与实践》一书中,现在已经放在书友会中,让大伙先赌为快,呵呵

使用特权

评论回复
10
1dqmoon|  楼主 | 2008-6-24 22:56 | 只看该作者

re

rDCON2   = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(0<<22)+(0<<20)+(size/4);

2410的规格书中提到, 
Note that the actual number of bytes that are transferred is computed by
the following equation: DSZ x TSZ x TC. Where, DSZ, TSZ (1 or 4),
and TC represent data size (DCONn[21:20]), transfer size (DCONn[28]),
and initial transfer count, respectively.

如果
DSZ=1
TSZ为 unit传输
则实际的传输字节数就是TC了,  TC是20位, 最大也就是0xfffff, 约为1MB, 
这个就是播放的音乐的长度.......

---------
不知道这样理解是否正确, 但还是没搞明白为什么播放的时间不能改变...

使用特权

评论回复
11
1dqmoon|  楼主 | 2008-6-24 22:59 | 只看该作者

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

看来要解决我这个问题要等到斑主的书发售之后了....

使用特权

评论回复
12
农民讲习所| | 2008-6-24 23:04 | 只看该作者

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

传少了没问题,效率低点而已。

使用特权

评论回复
13
dadong| | 2008-6-24 23:13 | 只看该作者

做个记号

rt

使用特权

评论回复
14
high| | 2008-6-25 05:14 | 只看该作者

所长好

可能我前面说的不够清楚. 我存在2个疑问

1. 握手. 因为dma有握手控制, 所以dma的计数值可以远大于fifo, 这样的内部控制机制使得实际'传多了'也不会溢出. 一阵理想情况是发64个, 让出总线, 得到握手信号, 继续发64个. 

2. 因此dma的传输不是连续的, 是一小片一小片的, (如1所说的一种情况下, 64个字节一片), 在发送这一小片期间, 中断是否可以响应?是否影响实时性?

使用特权

评论回复
15
农民讲习所| | 2008-6-25 09:18 | 只看该作者

不是这样的

IIS只是触发了DMA的transmit,没有限制传递个数,也没有FIFO满停止功能。只是触发功能。
基本DMA都是这样的。

使用特权

评论回复
16
high| | 2008-6-25 09:28 | 只看该作者

可是实际情况如此


1. 握手 
2. 优先级

如果推翻1. 可驱动使用dma的size总是大于fifo, 如何解释呢?
对于2, 我得到的信息是dma优先级大于中断. 如果推翻1也很糟糕. 象lcd控制器的dma可是大段传输, 1秒60frame,每个frame上百k的持续传输. lcd控制器不会有那么大的fifo.

使用特权

评论回复
17
农民讲习所| | 2008-6-25 10:30 | 只看该作者

对于2

LCD的DMA也是固定数目,好象也是64字节/次。

使用特权

评论回复
18
农民讲习所| | 2008-6-25 10:32 | 只看该作者

是16字节

使用特权

评论回复
19
high| | 2008-6-25 13:29 | 只看该作者

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

退一步说, 是否是这样的设计:dma 传16个字节, 然后触发dma中断, 然后继续dma 16个字节? 那中断频率会很恐怖. 

使用特权

评论回复
20
high| | 2008-6-25 13:38 | 只看该作者

楼主问题解决没有?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

253

帖子

0

粉丝