打印
[菜农助学交流]

【第三期】蛋蛋疼的M0模块----IIS

[复制链接]
2531|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kyzb001|  楼主 | 2011-12-13 11:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
vi, ST, se, IO, gp
试听了下,杂音很大。软件修改木有i成功。硬件不敢随意修改.
现在听的头有电晕。就不详细说IIS了,先发代码。 那位大婶有空弄下杂音问题!!!
IIS为中断方式.从SD卡读取WAV文件..文件数据头部没有进行处理.SD卡程序参照之前发的笔记

IIS中断方式. 中断方式为I2S_TX_FIFO_THRESHOLD也就是当FIFO的内容少于4字节的时候就会触发中断.中断里面我们就可以加载数据了。

方式:

初始化中断---->这时候FIFO数据为0触发中断---->放入数据--->发送数据-->当数据小于等于4的时候又出发中断-->放入数据。
具体的部分自己处理......很多东西没完善、

再次希望那位大婶解决一下杂音问题..看下是我数据发送的时候出问题,还是硬件有瑕疵!!!


 
//extern uint32_t SystemFrequency;
    /* Unlock the locked registers */
    UNLOCKREG();
/* Enable 12M OSC */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
    /* Enable PLL */
    DrvSYS_SetPLLMode(0);
Delay(1000);
DrvSYS_SelectHCLKSource(2);   
    Delay(100);

系统PLL初始化..一定要有

IIS初始画和回调函数
 
#include "PlayFrequency.h"

uint32_t PcmPlayBuff[BUFF_LEN] = {0};
uint32_t u32PlayPos_In = 0;
uint32_t u32PlaySend512Flage=1;
uint8_t DestArray[512]={0};

void Tx_thresholdCallbackfn(uint32_t status)
{
uint32_t i;
for ( i = 0; i <4 ; i++)
{
  _DRVI2S_WRITE_TX_FIFO(DestArray[u32PlayPos_In++]);
}
if(u32PlayPos_In>512)
{
  u32PlaySend512Flage=0;
  u32PlayPos_In=0;
}
// printf("Send IIS data.\n");
}
void InitI2s()
{
S_DRVI2S_DATA_T st;

/* Tri-state for FS and BCLK of CODEC */
DrvGPIO_Open(E_GPC, 0, E_IO_OPENDRAIN);
DrvGPIO_Open(E_GPC, 1, E_IO_OPENDRAIN);
DrvGPIO_SetBit(E_GPC, 0);
DrvGPIO_SetBit(E_GPC, 1);

/* Set I2C0 I/O */
    //DrvGPIO_InitFunction(E_FUNC_I2C0);   
SystemCoreClock = DrvSYS_GetHCLKFreq();

/* Open I2C0, and set clock = 100Kbps */
//DrvI2C_Open(I2C_PORT0, 100000);

/* Enable I2C0 interrupt and set corresponding NVIC bit */
//DrvI2C_EnableInt(I2C_PORT0);

/* Configure I2S */
st.u32SampleRate   = 32000;
    st.u8WordWidth     = DRVI2S_DATABIT_16;
    st.u8AudioFormat   = DRVI2S_MONO;  //DRVI2S_MONO  ,DRVI2S_STEREO  
st.u8DataFormat    = DRVI2S_FORMAT_MSB; //DRVI2S_FORMAT_MSB ,DRVI2S_FORMAT_I2S
    st.u8Mode      = DRVI2S_MODE_MASTER;
    st.u8TxFIFOThreshold = DRVI2S_FIFO_LEVEL_WORD_4;
    st.u8RxFIFOThreshold = DRVI2S_FIFO_LEVEL_WORD_4;
  
DrvI2S_Open(&st);

/* Configure CODEC */
//WAU8822_Setup();
/* Set I2S I/O */
    DrvGPIO_InitFunction(E_FUNC_I2S);
/* Set MCLK and enable MCLK */
DrvI2S_SetMCLKFreq(12000000);
DrvI2S_EnableMCLK();
  DrvI2S_EnableInt(I2S_TX_FIFO_THRESHOLD, Tx_thresholdCallbackfn);
DrvI2S_EnableTx();
}




相关帖子

沙发
kyzb001|  楼主 | 2011-12-13 11:36 | 只看该作者
自己占沙发, 工程包 SDCard.rar (3.06 MB)
在补一个WAV音频文件..梁祝时间1分08秒;
下载后把.rar删除即可。
3.wav.rar (1.04 MB)

使用特权

评论回复
板凳
plc_avr| | 2011-12-13 12:01 | 只看该作者
不错,顶!要学的太多了。

使用特权

评论回复
地板
kyzb001|  楼主 | 2011-12-13 12:06 | 只看该作者
不错,顶!要学的太多了。
plc_avr 发表于 2011-12-13 12:01


引用个名人说的话:“路漫漫其修远兮,吾将上下而求索。”

使用特权

评论回复
5
kyzb001|  楼主 | 2011-12-13 12:09 | 只看该作者
------------------------------------------------
|             RIFF WAVE Chunk                  |
|             ID  = 'RIFF'                     |
|             RiffType = 'WAVE'                |
------------------------------------------------
|             Format Chunk                     |
|             ID = 'fmt '                      |
------------------------------------------------
|             Fact Chunk(optional)             |
|             ID = 'fact'                      |
------------------------------------------------
|             Data Chunk                       |
|             ID = 'data'                      |
------------------------------------------------

使用特权

评论回复
6
毅如靳往| | 2011-12-14 10:48 | 只看该作者
顶~  一直想搞这个模块 就是知识不够啊

使用特权

评论回复
7
kyzb001|  楼主 | 2011-12-14 12:14 | 只看该作者
顶~  一直想搞这个模块 就是知识不够啊
毅如靳往 发表于 2011-12-14 10:48

呵呵,一起学习!!!

使用特权

评论回复
8
hotpower| | 2011-12-14 13:06 | 只看该作者
我会让群主抽时间找找这个问题的

使用特权

评论回复
9
weshiluwei6| | 2011-12-18 13:10 | 只看该作者
牛啊 真厉害啊

使用特权

评论回复
10
weshiluwei6| | 2011-12-18 14:02 | 只看该作者
高手啊 高手啊

使用特权

评论回复
11
weshiluwei6| | 2011-12-18 14:03 | 只看该作者
看了看不懂 悲剧

使用特权

评论回复
12
kyzb001|  楼主 | 2011-12-18 20:43 | 只看该作者
:) 11# weshiluwei6

使用特权

评论回复
13
john_lee| | 2011-12-19 13:08 | 只看该作者
看了楼主的程序,I2S数据缓冲只有一个,而且不是ring buffer,那么就可能存在数据under run的问题。

使用特权

评论回复
14
kyzb001|  楼主 | 2011-12-19 15:56 | 只看该作者
13# john_lee

:(  有点看不懂- -

ring buffer  缓刑缓冲区??
under run   重复使用???

不太明白啊!!!

使用特权

评论回复
15
kyzb001|  楼主 | 2011-12-19 16:09 | 只看该作者
老师..这是WAV的buff存放


        while(j++<file.fsize/512)
        {         

                res=f_read(&file, &dat, 512, &br);                       
         
                for(i=0;i<512;i++)
                        DestArray=dat;

                while(u32PlaySend512Flage);
                u32PlaySend512Flage=1;

        }
        while(1);

使用特权

评论回复
16
john_lee| | 2011-12-19 20:16 | 只看该作者
under run是一个术语,意思是已有的数据已用完,但新的数据还没有准备好(不可用)。你的程序只有一个512字节的缓冲,在中断中,数据全部发送完后,给设置标志,由前台程序填充新的数据,按i2s的数据使用速率,你的数据可能还没有填充好,下次i2s中断就来了,这时,已无数据可用,中断会使用缓冲里以前的数据,这就可能引起杂音。

解决办法是使用双缓冲技术,当一个用于i2s中断时(有数据),另一个就可以同时填充后续数据。当前一个缓冲数据用完时,就交换缓冲(注意,不是交换缓冲的数据,而是使用一个缓冲指针,直接换缓冲地址)。

或者,可以使用ring buffer技术。ring buffer是一种缓冲技术,使用两个下标,一个in,一个out。数据进缓冲时存放在in下标处,然后in增量,如果in达到ring buffer的长度,则反绕到0,数据出缓冲时从out下标处读取,out增量,同in一样,out也可能反绕。使用ring buffer技术,数据可以不断地in out。

但ring buffer对你这个项目可能不是很适合,所以你还是使用双缓冲好些。

使用特权

评论回复
17
kyzb001|  楼主 | 2011-12-20 08:48 | 只看该作者
16# john_lee
嗯!@!!!!
晚上回去改了。现在没板子!!!

使用特权

评论回复
18
mcs8098| | 2011-12-20 12:33 | 只看该作者
:)

使用特权

评论回复
19
kyzb001|  楼主 | 2011-12-21 08:36 | 只看该作者
本帖最后由 kyzb001 于 2011-12-21 08:38 编辑

16# john_lee

老师昨天我先试了  全部发送0x00,应该是无声音的。 但是杂音很大。  
后面修该了...
针对under run,我先读取512数据~ 进入循环,赋值缓冲。 马上又读取512数据 ,等待IIS发送玩512数据!马上赋值,在循环,也是有杂音~
 
         res=f_read(&file, &dat, 512, &br);   
        while(j++<file.fsize/512)
        {         
               for(i=0;i<512;i++)
                        DestArray=dat;
                res=f_read(&file, &dat, 512, &br);   
                while(u32PlaySend512Flage);
                u32PlaySend512Flage=1;
        }


这个赋值,除非IIS发的比f_read快,不然不会出现under run

使用特权

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

本版积分规则

个人签名:Is this my life

15

主题

623

帖子

1

粉丝