打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32和WM8960 I2S 利用DMA双缓冲音频播放和录音(一)

这个实验比串口双缓冲要稍微复杂点,音频播放很简单,主要是录音,折腾快一个礼拜了,网上查找资料倒腾来倒腾去,死活就不行,哎。不搞定这个问题,不甘心,

 脑子不停的想,这个问题可能出在哪,还有哪个地方没考虑到。就这样,脑子兴奋的很,都没什么困意,要不是第二天要赶着上班,都不用睡了,功夫不负有心人,经过几天折腾终于调通了。。。

 吐槽一下,现在网上都养成了一种风气,下载一些参考资料都是要付金币,付了金币下载后,发现有些资料一点技术含量都没,基本上没什么参考价值,真气人。

 言归正传,首先设置WM8960寄存器,配置播放路径,参数配置比较简单。播放时,STM做主机,WM8960配置从机,可以对照资料查看各个寄存器

WM8960 寄存配置:

View Code

 音频播放数据走向如下图

设置WM8960寄存器,配置录音播放路径,这里的STM配置的是从机,WM8960做主机

View Code

(1)、录音和播放:对麦克风讲话,音频数据直接通过WM8960内部路径直接到耳机进行播放。音频数据整体走向图如下。

还有一种播放是将录音的数据保存到STM,然后STM再将录的音频数据播放出来

录音前端设置,用的是LINPUT1和RINPUT1,这里只贴LINPUT1配置图,RINPUT1参考这个配置就行

播放后端配置图

还有重要的配置,时钟。时钟结构图配置

//录音时,ST设置的是从机,WM8960设置主机
//WM8960 master mode   MCLK使用的是外部有源晶振24MHz
//f2=4×2×11.2896MHz的=90.3168MHz
//R = 90.3168 / 12 = 7.5264
//PLLN = int R = 7
// K = int ( 2^24 x (7.5264 – 7)) = 8831526 = 86C226h
//-----------------------------------------------------------------------------------------------------------------------------------
//|    mclk  | DESIRED OUTPUT |   f2    | PRESCALE DIVIDE | POSTSCALE DIVIDE |    FIXED POST-DIVIDE | R          |    N   |   K     |
//|    (f1)  | (SYSCLK)       | (MHz)   | (PLLPRESCALE)   | (SYSCLKDIV[1:0]) |                      |            |        |         |
//|    (MHz) | (MHz)          |         |                 |                  |                      |            |        |         |
//|----------------------------------------------------------------------------------------------------------------------------------
//|    24    | 11.2896        | 90.3168 |            2    |       2          |            4         |    7.5264  |    7h  | 86C226h |
//-----------------------------------------------------------------------------------------------------------------------------------

    0x04,0x000,        //MCLK->div1->SYSCLK->DAC/ADC sample Freq = (SYSCLK)/(1*256) = 11.2896/256 =44.1KHz
    0x1a,0x1e1,        // enable DAC and ROUTPUT LOUTPUT;bit0=1, PLL en
    0x04,0x005,        //DAC/ADC sample Freq = (11.2896)/(1*256)=44.1K bit[0](CLKSEL)置1:选择PLL输出的时钟(置0表示选择MCLK时钟);bit[2:1](SYSCLKDIV)置10:分频(除以2)
    0x07,0x042,  //bit6=1, Enable master mode; bit[1:0]=10,I2S Format;bit[3:2]=00,16 bits
    0x08,0x1C4,     // BCLKDIV[3:0]=0100 BCLK Frequency = SYSCLK/4=11.2896/4=2.8224MHz
    
    0x34,0x037, //bit4(PLLPRESCALE)置1:预分频,如果MCLK=12M就不用设置该位了;bit[3:0](PLLN)置0111:设置PLLN的值;;bit5(SDM)置1:选择为小数模式;
    0x35,0x086,//bit[8:0](PLLK)置01000 0110:设置PLLK的值;
    0x36,0x0c2,//bit[8:0](PLLK)置01100 0010:设置PLLK的值;
    0x37,0x026,//bit[8:0](PLLK)置00010 0110:设置PLLK的值;
    
    0x14,0x0f9
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32单片机基础学习:从勉强看懂一行程序到IO口研究
在 Keil uVision4 MDK下配置开发STM32F103Z完整教程
Cortex M3学习笔记(一)--Systick的应用
零死角玩转stm32
解析STM32的时钟树RCC
STM32再学习——时钟初始化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服