RE: STM32的wav播放器,速度较快
zenghuipeng 发表于 2014-7-23 17:10 static/image/common/back.gifmck必须开啊,后端是wm8805的spdif的输出板,没有额外的晶振。
以前试过I2S解码板,mck可以不开,使用 ...
你仔细看看stm32技术书,虽然他讲的情况是8m晶振,mclk启动的时候,除了8khz,其他频率,没一个准的,mclk一关闭全部都准了 STM32的I2S外设有BUG,如果做产品还是放弃吧。
我现在是总线上挂FPGA,晶振直接输入到FPGA,FPGA内完成I2S和SPDIf信号生成,这样STM32工作时钟和输出的MCLK和采样率没任何关系了,哪怕用内部RC都可以。 zenghuipeng 发表于 2014-7-24 16:08
我看到另外一个帖子里面的哥们也说了,MCLK是不能开的,开了就不准。
但为什么MCLK不开就准了呢?BCK...
因为负责mclk分频的电路不是整除分频,貌似公式里有-1的,怎样,听完想不想抽st一耳光? zenghuipeng 发表于 2014-7-24 16:08
我看到另外一个帖子里面的哥们也说了,MCLK是不能开的,开了就不准。
但为什么MCLK不开就准了呢?BCK...
强行同步mclk是愚蠢的行为,把你那m32设置成slave,然后用cpld分时钟吧。 STM32F4 的I2S锁相环只要使用得当是没有问题的, 即便使用探索板上的8MHz晶体也可以在打开或关闭MCLK情况下得出挺接近的频率, 44.1K的计算误差只是63ppm, 对比一般晶体的误差是200ppm, 48K的计算误差更是完美的0ppm
若是使用某一个合适频率的晶体, 花一点时间计算也可以得出 44.1K, 48K, 88.2K, 96K, 176.4K 和 192K 在计算上零误差的参数, 只是在192K打开MCLK时得稍微超频使用这枚芯片, 不过只是超频2.4%, 不是问题, 详情可以去参考俺的探索板彩屏播放器的帖子, 提供了固件下载方便测试.
#elif defined osc_8MHz
#ifdef CODEC_MCLK_ENABLED /* 为了排列整齐不用 switch 或 else if, 每行统一使用 if */
//8MHz晶体 USB误差0.00% M=5, N=210, 1.6MHz, 系统时钟 = 168MHz, N=192..432; R=2..7; DIV=2..256; odd=0..1
if(AudioFreq==44100) RCC->PLLI2SCFGR = (254 << 6) | (6 << 28); /* DIV=2, ODD=1, 误差 0.0063% */
if(AudioFreq==88200) RCC->PLLI2SCFGR = (254 << 6) | (3 << 28); /* DIV=2, ODD=1, 误差 0.0063% */
if(AudioFreq==176400) RCC->PLLI2SCFGR = (226 << 6) | (2 << 28); /* DIV=2, ODD=0, 误差 0.0920% */
if(AudioFreq==48000) RCC->PLLI2SCFGR = (192 << 6) | (5 << 28); /* DIV=2, ODD=1, 误差 0.0000% */
if(AudioFreq==96000) RCC->PLLI2SCFGR = (384 << 6) | (5 << 28); /* DIV=2, ODD=1, 误差 0.0000% */
if(AudioFreq==192000) RCC->PLLI2SCFGR = (246 << 6) | (2 << 28); /* DIV=2, ODD=0, 误差 0.0976% 2.4%超过锁相环最高工作频率192MHz*/
#elif CODEC_MCLK_DISABLED
//8MHz晶体 USB误差0.00% M=5, N=210, 1.6MHz, 系统时钟 = 168MHz
if(AudioFreq==44100) RCC->PLLI2SCFGR = (254 << 6) | (6 << 28); /* DIV=5, ODD=0, 误差 0.0063% */
if(AudioFreq==88200) RCC->PLLI2SCFGR = (254 << 6) | (6 << 28); /* DIV=2, ODD=1, 误差 0.0063% */
if(AudioFreq==176400) RCC->PLLI2SCFGR = (254 << 6) | (3 << 28); /* DIV=2, ODD=1, 误差 0.0063% */
if(AudioFreq==352800) RCC->PLLI2SCFGR = (226 << 6) | (2 << 28); /* DIV=2, ODD=0, 误差 0.0920% */
if(AudioFreq==48000) RCC->PLLI2SCFGR = (192 << 6) | (5 << 28); /* DIV=5, ODD=0, 误差 0.0000% */
if(AudioFreq==96000) RCC->PLLI2SCFGR = (192 << 6) | (5 << 28); /* DIV=2, ODD=1, 误差 0.0000% */
if(AudioFreq==192000) RCC->PLLI2SCFGR = (384 << 6) | (5 << 28); /* DIV=2, ODD=1, 误差 0.0000% */
if(AudioFreq==384000) RCC->PLLI2SCFGR = (246 << 6) | (2 << 28); /* DIV=2, ODD=0, 误差 0.0976% 2.4%超过锁相环最高工作频率192MHz*/
#endif 高手啊,我也想做一个,请问我如果从现在从零开始学,到做出来这个东西要多长时间呢?
页:
[1]