5215|7

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

参与HELPER2416开发板助学计划-HELPER2416-RAWOS音频驱动 [复制链接]

本帖最后由 xuhany 于 2014-7-10 17:53 编辑

HELPER2416-RAWOS音频驱动

一、理论知识
  1.声音的基本概念,声音是通过一定介质传播的连续的波,它的属性有如下:
    a.声音的强弱叫音调,也叫频率,单位赫兹Hz,人能听到的范围为                                                        20Hz-20KHz,>20KHz叫超声波,<20Hz叫微波.
    b.声音的响度叫音量,也叫振幅,单位分贝dB,人能感受到1-130dB
    c.声音的数字化,声音模拟信号->采样->量化->编码->wav文件
      采样频率:单位时间抽取的样品数量,频率越高,音质越好,常见                                                        8KHz,11.025KHz,22.05KHz,44.1KHz
      量化:每个采样点数据的表示位数,精度越大,音质越好,常见8bit,16bit
      声道:多个声道同时采样,能表现出立体环绕等,0左声道1右声道2立体声
    d.声音的还原,wav文件->解码->DAC还原为声音
      wav文件有4中编码方式,PCM,ADPCM,A/mu-Law,ACM
      其中PCM无损无压缩,        ADPCM为1:4有损压缩
  2.I2S控制器,IC内置音频总线
    I2S是philips公司为数字音频设备之间的音频数据传输而定制的一种总线.
    其他还有PCM标准,AC97标准
  3.CODEC编解码芯片
  
  4.wav文件格式    主要分为4个chunk,分别是RIFF,FMT,Fact,Data
    解码时候需要用到的是FMT中采样频率,采样精度,声道,预备缓存区共4个参数    Data中的数据长度,和数据内容共2个参数    第一次接触这个格式,可能比较难理解,帖子幅度有限,不能详细概括,谅解
二、I2S工作过程  
  1.I2S总线规范
    SCK串行时钟,随数据一起,SCK的频率=2*采样频率*采样位数
    WS声道选择,高左声道,低右声道,WS频率=采样频率
    SD串行数据    时序如下,由SDF指定:        
           
  2.s3c2416用到的引脚有I2SLRCK\I2SSCLK\I2SSDO\I2SMCLK   
    I2SSCLK对应CLK,I2SLRCK对应WS,I2SSDO对应SD   
    I2SMCLK系统时钟
三、WM8731L工作过程   
  1.wm8731是一款集成耳机驱动器的低功耗、高质量音频编码解码器,为MP3,录音机设计,具有24位ad/da   
  2.s3c2416用到的引脚有I2C_SCL\I2C_SDA   
    整个工作过程就是AC -> Filters -> DAC -> VOL -> Stereo Headphone Output
四、I2S驱动实现  s3c2416支持两种操作I2S的方式  
  1.IO方式,此方法效率较低,mcu占用率高  
  2.DMA方式,此方法较好  
  3.IO方式具体实现如下,其中关键参数有IMS,SDF,BFS,BLC,LRP   
    GPBPU_REG = (GPBPU_REG & (~(3<<0))) | (0<<0);   
    GPBPU_REG = (GPBPU_REG & (~(3<<2))) | (0<<2);   
    GPBPU_REG = (GPBPU_REG & (~(3<<4))) | (0<<4);   
    GPBPU_REG = (GPBPU_REG & (~(3<<6))) | (0<<6);   
    GPBPU_REG = (GPBPU_REG & (~(3<<8))) | (0<<8);                   
    GPECON_REG = (GPECON_REG & (~(3<<0))) | (2<<0);   
    GPECON_REG = (GPECON_REG & (~(3<<2))) | (2<<2);   
    GPECON_REG = (GPECON_REG & (~(3<<4))) | (2<<4);   
    GPECON_REG = (GPECON_REG & (~(3<<6))) | (2<<6);   
    GPECON_REG = (GPECON_REG & (~(3<<8))) | (2<<8);                           
    IISPSR_REG = (3<<8)|(1<<15);   
    IISCON_REG  = 0;   
    IISMOD_REG  = (0<<1)|(3<<3)|(0<<10)|(0<<13);                   
    IISFIC_REG = 0x08000;   
    IISFIC_REG &= ~(1<<15);  
  4.DMA方式实现   
    IISCON_REG = 0x0;   
    DISRC0_REG = (uint32_t)TxBuffer;   
    DIDST0_REG = IISTXD;   
    DIDSTC0_REG = (0<<2) | (1<<1) | (1<<0);   
    DCON0_REG = (4096) | (2<<20) | (1<<22) | (1<<24) | 0xe0000000;   
    DMAREQSEL0_REG = (1<<0) | (4<<1);   
    register_irq(17, dma_0_ISRService);   
    INTMOD_REG &= ~(1 << 17);   
    INTSUBMSK_REG &= ~(1 << 18);   
    INTMSK_REG &= ~(1 << 17);                    
    IISFIC_REG |= (1<<15);   
    IISFIC_REG &= ~(1<<15);   
    IISMOD_REG  = (0<<1)|(2<<3);   
    if(bitlen == 8)      
      IISMOD_REG = (IISMOD_REG & (~(3<<13))) | (1<<13);   
    else if(bitlen == 16)      
      IISMOD_REG = (IISMOD_REG & (~(3<<13))) | (0<<13);   
    else if(bitlen == 24)      
      IISMOD_REG = (IISMOD_REG & (~(3<<13))) | (2<<13);   
    prescale = 96000000/(384*fs);   
    IISPSR_REG = (prescale<<8) | (1<<15);
五、WM8731L驱动实现   
    IIC_init(2000);
    IIC_open( );
    wm8731_write(0x10,0x18);
    wm8731_write(0x0E,0x02);
    wm8731_write(0x12,0x01);
    wm8731_write(0x08,0x3b);
    wm8731_write(0x0a,0x00);
    wm8731_write(0x0c,0x47);
    IIC_close();
结束语,感谢各位的耐心阅读,帖子先写到这,意犹未尽,希望后面还能多写几篇。
然后大家有更多的疑问,可以继续通过论坛讨论交流,为后来网友以作借鉴。
最后,感谢helper2416的老板,为大家提供这样一个共同的学习环境,希望大家能多多利用,这样一个活动确实很难得。        


论坛ID:xuhany
提交时间:2014/07/10 17:50

最新回复

这些寄存器都是WM8731手册里有描述的,翻手册看一下就明白了!   详情 回复 发表于 2014-11-7 19:05

赞赏

1

查看全部赞赏

点赞 关注

回复
举报

554

帖子

0

TA的资源

版主

沙发
 
这个要顶,属于难得的教材
 
个人签名My dreams will go on...
http://www.jyxtec.com
 

回复

240

帖子

4

TA的资源

一粒金砂(中级)

板凳
 
请教下楼主这个WM8731的驱动实现是怎么写出来的呢,完全自己查芯片手册后自己写的?
很想知道开发方法,望指点?

点评

嗯,看懂手册,是写出代码的充分条件  详情 回复 发表于 2014-7-10 21:02
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

4
 
这回的板子感觉开发进度都好快啊。真给力。赞!
 
个人签名这孩子,成熟的象征,理智的典范。
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 
abszy 发表于 2014-7-10 19:24
请教下楼主这个WM8731的驱动实现是怎么写出来的呢,完全自己查芯片手册后自己写的?
很想知道开发方法,望 ...

嗯,看懂手册,是写出代码的充分条件
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

6
 
最近这在学习这个,2440的可以播放音乐,到2416就不行了。
楼主能否共享下 “HELPER2416-RAWOS音频驱动” 的裸机代码啊
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

7
 
本帖最后由 wowo8688 于 2014-11-7 15:15 编辑

请教楼主,
    wm8731_write(0x10,0x18);
    wm8731_write(0x0E,0x02);
    wm8731_write(0x12,0x01);
    wm8731_write(0x08,0x3b);
    wm8731_write(0x0a,0x00);
    wm8731_write(0x0c,0x47);
这几条语句按照什么顺序如何定的?哪几条是播放声音必须的么?

点评

这些寄存器都是WM8731手册里有描述的,翻手册看一下就明白了!  详情 回复 发表于 2014-11-7 19:05
 
 
 

回复

554

帖子

0

TA的资源

版主

8
 
wowo8688 发表于 2014-11-7 14:50
请教楼主,
    wm8731_write(0x10,0x18);
    wm8731_write(0x0E,0x02);

这些寄存器都是WM8731手册里有描述的,翻手册看一下就明白了!
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表