jialong0926 发表于 2015-5-22 12:41

纯单片机做的 DSD 播放器,历时一年,从数字转盘到播放器,从 PCM 到 DSD - 软件篇

播放器软件新开一帖,涉及的内容也不少。

软件整体结构
时钟设置
读 TF 卡
播放列表组织
音频数据文件解析
组织音频数字信号发送 I2S 或 DSD
耳机插入检测及耳机 与 LINEOUT 输出控制
静音处理
切歌、换专辑、音量、暂停、静音等各种控制
与显示控制之间协同通信
按键、遥控输入
字库及OLED显示
固件升级

先借硬件篇的硬件逻辑图一用,软件的功能实际上都是围绕这个逻辑图展开的。



jialong0926 发表于 2015-5-22 13:10

软件大的方面分为两部分:主控部分、显控部分。

主控部分两层循环:
外层循环依据 TF 卡拔出或插入做一个循环;
内层依据歌曲列表和控制做一个循环;

主控和显控之间通过 SPI 通信传递信息。

haluo 发表于 2015-5-22 13:53

看来是要在软件原理方面做个普及教学贴呀,
:D支持一下
先问一下有没要开源?:lol
要是开源的话我得来好好学习下,软件方面远不及楼主水准。:)

jialong0926 发表于 2015-5-22 14:01

haluo 发表于 2015-5-22 13:53
看来是要在软件原理方面做个普及教学贴呀,
支持一下
先问一下有没要开源?


之前考虑是介绍方法原理。

没有考虑开源。

不过如果对某些专题感兴趣,根据情况贴部分源代码吧。

haluo 发表于 2015-5-22 14:22

jialong0926 发表于 2015-5-22 14:01
之前考虑是介绍方法原理。

没有考虑开源。


:D理解,其实对于有心学的人来说,看到正好他想不通的部分代码,很可能就是恍然大悟。
对于拿来主义的人来说,即使开了源也不一定看得懂。

jialong0926 发表于 2015-5-22 15:59

时钟设置

硬件篇中已经提到过,播放器是采用单晶振,借助 PLLI2S 实现 44.1K 和 48K 时钟的完美匹配。

最终的 PLLI2S 时钟的计算公式是:

F(I2S) = F(OSC) / M * N / R

因为修改了 M,所以会影响到整个系统的系统时钟,在某些特殊值下,需要使用恰当的 Q 值,因为这个值会影响外设的时钟,比如 SD 卡、USB 等。外设时钟应设置为尽量趋近 48MHz。

图示说明。

jialong0926 发表于 2015-5-22 16:08

本帖最后由 jialong0926 于 2015-5-22 16:13 编辑

时钟设置的程序片段,该函数根据传入的 pll_n,设置 PLL_M、PLL_N、PLL_Q、PLL_P。

说白了,这个函数一共设置了 3 个时钟:
1、系统主时钟 = F(OSC) /PLL_M * PLL_N / PLL_P
2、外设时钟 =F(OSC) /PLL_M * PLL_N / PLL_Q
3、I2S时钟 =F(OSC) /PLL_M * pll_n / pll_r (pll_n 和 pll_r 是主控传入的参数,这两个值的来源是依据不同采样率动态设置的 )


(时钟设置的程序框架记得也是来源于网络,先谢过。自己是改了对不同值的设置逻辑)

jialong0926 发表于 2015-5-22 16:23

各位看官可能已经看出来了,播放器每次播放一首新的曲目,如果采样率有变化,就会重新设置一次系统时钟。

当然,也可以做得更合理些,就是只有在 M 值修改的情况下,才重新设置系统时钟和外设时钟,不过我没有这么做。

I2S 时钟设置完后,真正的采样率设置还需要在 I2S 配置时进行设置,这是后话了。

jialong0926 发表于 2015-5-22 16:26

本帖最后由 jialong0926 于 2015-5-22 16:32 编辑

时钟说完了,说说初始化。

初始化其实没有什么好说的,例程多如牛毛。

我唯一考虑的一点是,针对静音类的管脚,尽早初始化,尽早设置为静音状态。这样,开机过程中的各种噪音就可以被旁路掉。

如果结合到 bootloader 程序,我甚至在 bootloader 程序开始时,就先设置静音管脚了。

haluo 发表于 2015-5-22 20:10

jialong0926 发表于 2015-5-22 16:26
时钟说完了,说说初始化。

初始化其实没有什么好说的,例程多如牛毛。


:)看到你硬件上有静音继电器,如果继电器是控制最终的输出的话,那只需要保证在继电器吸合前,其它设置都已经完成了即可。

jialong0926 发表于 2015-5-22 23:12

haluo 发表于 2015-5-22 20:10
看到你硬件上有静音继电器,如果继电器是控制最终的输出的话,那只需要保证在继电器吸合前,其它设置都 ...

是的,继电器可以这样用,不过还有耳机静音,所以这里就通盘考虑了。

jinggx 发表于 2015-5-23 12:31

jinggx 发表于 2015-5-23 12:34

jialong0926 发表于 2015-5-23 13:30

jinggx 发表于 2015-5-23 12:34
并且,勘误手册上已经说明在slave模式下的bug,而且只支持16bit,所以stm32的iis可以认为是废了

应用领域和应用方法不同,没有可比性。对于音频应用,而且不需要时钟同步的情况下,没有您说的这些问题

jinggx 发表于 2015-5-23 13:39

jinggx 发表于 2015-5-23 13:43

jialong0926 发表于 2015-5-23 13:45

jinggx 发表于 2015-5-23 13:39
难道你不用pll?直接从晶振获取时钟?愿闻高论。

pll当然要用,但是播放器的时钟要求并不像以太网通信那样要求严格。
在我这个方案里,只需要确保407向4398传输 iis 信号时,mclk,bclk,ws,data同步就可以了,这一点对于 407 而言是没有问题的。

jialong0926 发表于 2015-5-23 13:50

jinggx 发表于 2015-5-23 13:43
我自己用它内部的pll试验过,iis的各个时钟都从pll分频出来,不说一个pll怎么样兼顾44100和48000采样下都没 ...

示波器的探头,对于高频的信号而言,会导致信号失真,进而导致噪音。
这是示波器测试的问题,并不是pll的问题。

jialong0926 发表于 2015-5-23 13:54

之前测试版的播放器,邀请了部分朋友试听,他们几乎都区分不出是播放器播放的还是CD播放的

jinggx 发表于 2015-5-23 13:55

页: [1] 2 3 4 5 6 7
查看完整版本: 纯单片机做的 DSD 播放器,历时一年,从数字转盘到播放器,从 PCM 到 DSD - 软件篇