发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: 1dqmoon
手机看帖
扫描二维码
随时随地手机跟帖
21

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

使用特权

评论回复
22
农民讲习所| | 2008-6-25 13:45 | 只看该作者

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

使用特权

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

所长

22楼的说法, 我认为, 就算会发出中断不代表在使用中断机制.不存在相关isr来处理dma的计数值和reload操作.我同意21楼说法.可是,如果是硬件控制的,而且不是普通意义的中断处理流程, 那不很大可能就是握手机制了?

dma存在req和ack控制

所以...第一点我觉得是正确的.

使用特权

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

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

不好说。所以LZ的第一问俺没回答。

关于LCD的DMA,每次都是硬件自己控制的。至于LCD中断,是处理FIFO为空时刻,防止别的DMA占用总线的一个处理方法。俺测试过,如果此中断不打开,显示会抖动。

IIS使用DMA大量传送数据,也可能对LCD的DMA产生影响,俺是这么推测的。

使用特权

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

昨天仔细想了下

应该是DMA都FIFO的触发自动控制,包括握手。
那么LZ的情况出现,只能有一个解释:调入的WAVE数据格式不对,会测试时输入了过分的数值。

如果LZ能把细节描述出来,说不定能找到问题

使用特权

评论回复
26
1dqmoon|  楼主 | 2008-6-26 22:46 | 只看该作者

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

我觉得虽然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自己完成的, 并没有软件的干预.

我的那个问题还没解决, 如果这部分不是很清楚的话,估计是很难解决了...

使用特权

评论回复
27
1dqmoon|  楼主 | 2008-6-29 17:17 | 只看该作者

测试程序

https://bbs.21ic.com/upfiles/img/20078/200781417305255.rar

这个文件是我测试播放wav的程序. ads下直接编译,dnw下载就可以用. 里面有个文件系统,wav文件是放在sd卡里的, 11.2M,  等下看哪里能传上去.
这个wav文件是22 khz, 双声道的

使用特权

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

本版积分规则