zenghuipeng 发表于 2012-9-1 22:01

STM32单片机I2S输出实验

看到STM32芯片带i2s接口,想用它做个wav播放器玩玩。
手边只有SVDAC06和伟良DAC-2,都不带I2S输入支持。
无奈只好改了DAC-2,把74HC157拿掉后bypass了DIY9001和PC2706的I2S信号,直接把I2S的接口用飞线焊出了。
开发板这边找的同事接了个OPEN103Z,程序直接用的是网上下载的一个STM103Z芯片的wav播放器程序。
STM103Z有两个I2S接口,和SPI公用。
我的板子上,I2S3和JTAG有冲突,所以只好用I2S2.
分别把I2S2的BCK,DATA,LRCK和DAC-2飞线相连,环境就算打好了。

zenghuipeng 发表于 2012-9-1 22:06

网上下载的程序使用的是I2S2 Master TX模式。
使用外部8M晶振*7倍=56M提供MCLK即cpu主频。
然后分频1/2到PB1,即SPI(I2S)所在的外部总线。
然后分频给I2s的BCK,LRCK,DATA。
但实际上通过数据手册的设定,LRCLK如何达不到44.1K。
所以听着音乐总是有噼噼啪啪的杂音在里面。
估计是jitter太大的原因。

zenghuipeng 发表于 2012-9-1 22:09

知道MCU精度差,但不知道为什么会差这么远。也试过使用内部晶振,还是跳不到44.1K的频率。
然后网上也推荐MCU侧要用I2S slave,说考虑到MCU侧时钟精度太差的因素。
我试了下,配置成slave,的确没有噼噼啪啪的声音,但声音一会干净一会就全是白噪声,用万用表量LRCLK才20.xxK。
谁能帮忙解答下,先谢过。

zenghuipeng 发表于 2012-9-1 22:15

DAC-2侧我用CM6631的I2S输出测试过,没问题的。但只支持44.1K的,不知为何连48K都行,DAC-2的解码器是WM8740.

zkw111 发表于 2012-9-2 14:11

会不会是程序不好...

上官芷 发表于 2012-9-2 14:38

引用第1楼zenghuipeng于2012-09-01 22:06发表的 :
网上下载的程序使用的是I2S2 Master TX模式。
使用外部8M晶振*7倍=56M提供MCLK即cpu主频。
然后分频1/2到PB1,即SPI(I2S)所在的外部总线。
然后分频给I2s的BCK,LRCK,DATA。
但实际上通过数据手册的设定,LRCLK如何达不到44.1K。
.......

這台型號是什麼呀?

hyperma 发表于 2012-9-2 22:49

OMAP3530或三星6410灌Windows CE 6.5,一切都解决了,不知道你为什么这么费力不讨好?

gaoiori 发表于 2012-9-2 23:09

高手阿,玩到单片机了

zenghuipeng 发表于 2012-9-3 00:35

引用第5楼上官芷于2012-09-02 14:38发表的 :


這台型號是什麼呀?

万用表?
fluke 187的。

zenghuipeng 发表于 2012-9-3 00:40

引用第4楼zkw111于2012-09-02 14:11发表的 :
会不会是程序不好...
有个奇怪的现象。
示波器上可以看到LRCLK有电压为2.5v的4x.KHZ的波形,然后还夹带着频率为几个Mhz但电压很低的波形。夹带的波形是DAC2这边漏过来的。
另外,STM32侧并没有发送MCLK,但量DAC-2侧的MCLK竟然有很好的波形。

我有点糊涂,不知道I2S如果两边都输出时钟,这样谁是主控谁是slave呢?

zenghuipeng 发表于 2012-9-3 00:42

引用第6楼hyperma于2012-09-02 22:49发表的 :
OMAP3530或三星6410灌Windows CE 6.5,一切都解决了,不知道你为什么这么费力不讨好?
这些arm都太高级了,成本也上去了,现在先研究低成本的,以后直接用android绕过src做得了。

hyperma 发表于 2012-9-3 04:40

6410是已被淘汰的魅族M8手机的内控,淘宝上一体化(带cpu稳压、重启、AC97音频、NAND)接电就用的核心板,只卖300块,我不知道成本怎么就上去了。而且Cortex M3的cpu应付不了24bit 192khz的无损压缩格式重放。

安卓、Win CE你都无法绕过SRC,今后可能也很困难。

zhangdu 发表于 2012-9-3 10:22

如果是有噼噼啪啪的杂音,那多半是程序的问题,应该是数据有断流,从SD卡读数据以及从I2S发送数据有问题,你再好好检查一下程序
我用TI的M3也在玩,用示波器看,44.1kHz还是很准的,datasheet上标称的jitter 3 ns;另外,就算jitter大一点,LRCK不准,也不会有明显的噪声出现,比如44.1K的音频文件,用40k速度播放也是可以,就是音乐节拍慢一点,慢放

zhangdu 发表于 2012-9-3 10:27

引用第11楼hyperma于2012-09-03 04:40发表的 :
6410是已被淘汰的魅族M8手机的内控,淘宝上一体化(带cpu稳压、重启、AC97音频、NAND)接电就用的核心板,只卖300块,我不知道成本怎么就上去了。而且Cortex M3的cpu应付不了24bit 192khz的无损压缩格式重放。

安卓、Win CE你都无法绕过SRC,今后可能也很困难。
所以,为了不受SRC影响,直接裸机开发,不要系统,暴力输出

pentrolsino 发表于 2012-9-3 10:58

楼主去阿莫论坛问问吧,那边的STM32高手多,正想学stm32

zenghuipeng 发表于 2012-9-3 22:36

引用第13楼zhangdu于2012-09-03 10:27发表的 :

所以,为了不受SRC影响,直接裸机开发,不要系统,暴力输出
我也觉得玩硬件noos更好理解
wince驱动我也做过一段时间,系统是强大但底层一样调寄存器,且还不是RTOS。
现在搞android驱动开发,全开源啊,你想bypass掉android的audioflinger很容易(只做hifi播放平台而言),只要底层有经验搞起来也不难。

zenghuipeng 发表于 2012-9-3 22:39

引用第12楼zhangdu于2012-09-03 10:22发表的 :
如果是有噼噼啪啪的杂音,那多半是程序的问题,应该是数据有断流,从SD卡读数据以及从I2S发送数据有问题,你再好好检查一下程序
我用TI的M3也在玩,用示波器看,44.1kHz还是很准的,datasheet上标称的jitter? 3 ns;另外,就算jitter大一点,LRCK不准,也不会有明显的噪声出现,比如44.1K的音频文件,用40k速度播放也是可以,就是音乐节拍慢一点,慢放

我比较赞同你的观点,即使我的clk差再远,也不应该出现噼噼啪啪的模拟信号出来,只会影响播放的速度。我回去看看是不是dma这边有问题。

还有个问题要请教你。
I2S如果首发双方同时提供时钟那么到底谁是主谁是从呢?没有文章提到这个协商机制。

zhangdu 发表于 2012-9-4 08:44

I2S的接收端是不会提供时钟的,都是发送端提供,如果你觉得MCU的时钟不够好,那么可以把MCU设置为从机状态,但是需要外部提供时钟,就在在单独做一个时钟源,同时给MCU的接收端(DAC)提供时钟,一般都是这样

zenghuipeng 发表于 2012-9-4 22:00

我的噪音可能是DMA发送的速度问题。
主线程读取wav数据,中断喂dma。
主线程分两个buff交替填充,dma吃完一个buffer就吃第二个。
这两者的速度怎么控制得好呢?

zhangdu 发表于 2012-9-5 08:29

引用第18楼zenghuipeng于2012-09-04 22:00发表的 :
我的噪音可能是DMA发送的速度问题。
主线程读取wav数据,中断喂dma。
主线程分两个buff交替填充,dma吃完一个buffer就吃第二个。
这两者的速度怎么控制得好呢?
dma要用乒乓模式,这样,它自己就会在中断里面轮流续传两个buffer的数据,主线程里面只需要检测哪个buffer里面的数据被用完了,然后更新该buffer就可以了
我用的TI的M3,LM3S9B96,最开始出声音的时候,也是有一点咔咔咔的声音,很规律,间隔很短,当时我开的两个buffer是512字节,然后直接开了两个4096字节的buffer,从SD卡也是直接读出一整个簇的数据直接放里面,中间不经过任何周转,于是声音正常了,这样做的效率和RAM的利用率太低了,以后再慢慢优化吧,但至少可以知道咔咔咔的噪音是因为数据断流引起的,供你参考
页: [1] 2 3 4
查看完整版本: STM32单片机I2S输出实验