[菜农助学交流] 【第三期】蛋蛋疼的M0模块----IIS

[复制链接]
 楼主| 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的时候又出发中断-->放入数据。
具体的部分自己处理......很多东西没完善、

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



  1. //extern uint32_t SystemFrequency;
  2.     /* Unlock the locked registers */
  3.     UNLOCKREG();
  4. /* Enable 12M OSC */
  5. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
  6.     /* Enable PLL */
  7.     DrvSYS_SetPLLMode(0);
  8. Delay(1000);
  9. DrvSYS_SelectHCLKSource(2);   
  10.     Delay(100);
复制代码

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

IIS初始画和回调函数

  1. #include "PlayFrequency.h"

  2. uint32_t PcmPlayBuff[BUFF_LEN] = {0};
  3. uint32_t u32PlayPos_In = 0;
  4. uint32_t u32PlaySend512Flage=1;
  5. uint8_t DestArray[512]={0};

  6. void Tx_thresholdCallbackfn(uint32_t status)
  7. {
  8. uint32_t i;
  9. for ( i = 0; i <4 ; i++)
  10. {
  11.   _DRVI2S_WRITE_TX_FIFO(DestArray[u32PlayPos_In++]);
  12. }
  13. if(u32PlayPos_In>512)
  14. {
  15.   u32PlaySend512Flage=0;
  16.   u32PlayPos_In=0;
  17. }
  18. // printf("Send IIS data.\n");
  19. }
  20. void InitI2s()
  21. {
  22. S_DRVI2S_DATA_T st;

  23. /* Tri-state for FS and BCLK of CODEC */
  24. DrvGPIO_Open(E_GPC, 0, E_IO_OPENDRAIN);
  25. DrvGPIO_Open(E_GPC, 1, E_IO_OPENDRAIN);
  26. DrvGPIO_SetBit(E_GPC, 0);
  27. DrvGPIO_SetBit(E_GPC, 1);

  28. /* Set I2C0 I/O */
  29.     //DrvGPIO_InitFunction(E_FUNC_I2C0);   
  30. SystemCoreClock = DrvSYS_GetHCLKFreq();

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

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

  35. /* Configure I2S */
  36. st.u32SampleRate   = 32000;
  37.     st.u8WordWidth     = DRVI2S_DATABIT_16;
  38.     st.u8AudioFormat   = DRVI2S_MONO;  //DRVI2S_MONO  ,DRVI2S_STEREO  
  39. st.u8DataFormat    = DRVI2S_FORMAT_MSB; //DRVI2S_FORMAT_MSB ,DRVI2S_FORMAT_I2S
  40.     st.u8Mode      = DRVI2S_MODE_MASTER;
  41.     st.u8TxFIFOThreshold = DRVI2S_FIFO_LEVEL_WORD_4;
  42.     st.u8RxFIFOThreshold = DRVI2S_FIFO_LEVEL_WORD_4;
  43.   
  44. DrvI2S_Open(&st);

  45. /* Configure CODEC */
  46. //WAU8822_Setup();
  47. /* Set I2S I/O */
  48.     DrvGPIO_InitFunction(E_FUNC_I2S);
  49. /* Set MCLK and enable MCLK */
  50. DrvI2S_SetMCLKFreq(12000000);
  51. DrvI2S_EnableMCLK();
  52.   DrvI2S_EnableInt(I2S_TX_FIFO_THRESHOLD, Tx_thresholdCallbackfn);
  53. DrvI2S_EnableTx();
  54. }


复制代码


 楼主| kyzb001 发表于 2011-12-13 11:36 | 显示全部楼层
自己占沙发, 工程包
在补一个WAV音频文件..梁祝时间1分08秒;
下载后把.rar删除即可。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
plc_avr 发表于 2011-12-13 12:01 | 显示全部楼层
不错,顶!要学的太多了。
 楼主| kyzb001 发表于 2011-12-13 12:06 | 显示全部楼层
不错,顶!要学的太多了。
plc_avr 发表于 2011-12-13 12:01


引用个名人说的话:“路漫漫其修远兮,吾将上下而求索。”
 楼主| 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'                      |
------------------------------------------------
毅如靳往 发表于 2011-12-14 10:48 | 显示全部楼层
顶~  一直想搞这个模块 就是知识不够啊
 楼主| kyzb001 发表于 2011-12-14 12:14 | 显示全部楼层
顶~  一直想搞这个模块 就是知识不够啊
毅如靳往 发表于 2011-12-14 10:48

呵呵,一起学习!!!
hotpower 发表于 2011-12-14 13:06 | 显示全部楼层
我会让群主抽时间找找这个问题的
weshiluwei6 发表于 2011-12-18 13:10 | 显示全部楼层
牛啊 真厉害啊
weshiluwei6 发表于 2011-12-18 14:02 | 显示全部楼层
高手啊 高手啊
weshiluwei6 发表于 2011-12-18 14:03 | 显示全部楼层
看了看不懂 悲剧
 楼主| kyzb001 发表于 2011-12-18 20:43 | 显示全部楼层
:) 11# weshiluwei6
john_lee 发表于 2011-12-19 13:08 | 显示全部楼层
看了楼主的程序,I2S数据缓冲只有一个,而且不是ring buffer,那么就可能存在数据under run的问题。
 楼主| kyzb001 发表于 2011-12-19 15:56 | 显示全部楼层
13# john_lee

:(  有点看不懂- -

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

不太明白啊!!!
 楼主| kyzb001 发表于 2011-12-19 16:09 | 显示全部楼层
老师..这是WAV的buff存放


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

  3.                 res=f_read(&file, &dat, 512, &br);                       
  4.          
  5.                 for(i=0;i<512;i++)
  6.                         DestArray=dat;

  7.                 while(u32PlaySend512Flage);
  8.                 u32PlaySend512Flage=1;

  9.         }
  10.         while(1);
复制代码
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对你这个项目可能不是很适合,所以你还是使用双缓冲好些。
 楼主| kyzb001 发表于 2011-12-20 08:48 | 显示全部楼层
16# john_lee
嗯!@!!!!
晚上回去改了。现在没板子!!!
mcs8098 发表于 2011-12-20 12:33 | 显示全部楼层
 楼主| kyzb001 发表于 2011-12-21 08:36 | 显示全部楼层
本帖最后由 kyzb001 于 2011-12-21 08:38 编辑

16# john_lee

老师昨天我先试了  全部发送0x00,应该是无声音的。 但是杂音很大。  
后面修该了...
针对under run,我先读取512数据~ 进入循环,赋值缓冲。 马上又读取512数据 ,等待IIS发送玩512数据!马上赋值,在循环,也是有杂音~

  1.          res=f_read(&file, &dat, 512, &br);   
  2.         while(j++<file.fsize/512)
  3.         {         
  4.                for(i=0;i<512;i++)
  5.                         DestArray=dat;
  6.                 res=f_read(&file, &dat, 512, &br);   
  7.                 while(u32PlaySend512Flage);
  8.                 u32PlaySend512Flage=1;
  9.         }
复制代码


这个赋值,除非IIS发的比f_read快,不然不会出现under run
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

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