搜索
bottom↓
回复: 54

gzhuli请进,Codec的PLL配置有点问题

[复制链接]

出0入0汤圆

发表于 2010-3-6 21:32:00 | 显示全部楼层 |阅读模式
刚才看了看codec的驱动,MCLK=12.88Mhz时算出来的PLL_K值是0x59999A,codec.c里写入的是
        codec_send(REG_PLL_K1 | 0x16);
        codec_send(REG_PLL_K2 | 0x12D);
        codec_send(REG_PLL_K3 | 0x5A);
我测了下,这种配置下LRC输出的频率是44.1174Khz,用0x59999A时测到的是44.0997Khz。这里应该是写错了吧。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入618汤圆

发表于 2010-3-6 21:52:05 | 显示全部楼层
因为72MHz时钟的STM32 I2S只能整数分频出72MHz / 1632 = 44.117KHz,CODEC作为Slave,只能跟着了。
CODEC的Master模式还没调通……

出0入0汤圆

 楼主| 发表于 2010-3-6 22:45:27 | 显示全部楼层
我现在用的就是master模式,刚才听了下,确实有不少杂音。不过我觉得不是STM32分频不同步的问题,STM32作为slave工作时由codec提供时钟,和他自己的时钟生成单元没没什么关系。之前用WM8753时也把stm32作为slave用过,没有出现噪音,采样率也正常。

出0入0汤圆

发表于 2010-3-7 16:43:45 | 显示全部楼层
今天仔细测了一下:

WM8978,I2S的LRC翻转后,第一个时钟无效.所以要在STM32里面配置 I2S_Standard = I2S_Standard_Phillips;
发送数据时,数据被右称一位(舍弃最低位).
不然,最高位被削去了,这就是原来声音大时完全变了的原因.当时还扯到增益相关的问题,走了弯路.

不管工作在MASTER或SLAVE模式下,数据错位的现象没有.
但目前还不好找出LRC是否错位的现象.
因为出现一次的咔咔声音(怀疑LRC错位引起的)的间隔较长,中间数据太多,目前还没什么好的办法来观察.

继续测....

出0入0汤圆

发表于 2010-3-7 17:24:06 | 显示全部楼层
进展:

配置:
I2S_Standard = I2S_Standard_Phillips;
I2S_DataFormat = I2S_DataFormat_16bextended;
BCLK提高一倍.

完全符合datasheet上面讲的.但吱吱声依然,继续找.


结论:

原来的配置:
I2S_Standard = I2S_Standard_Phillips;
I2S_DataFormat = I2S_DataFormat_16;
数据最低位并没有被丢弃,而是到了下一声道的第一位,而这位无效,所以并不产生噪音,但丢了一位.

出0入618汤圆

发表于 2010-3-7 17:43:00 | 显示全部楼层
程序一直都是用I2S_Standard_Philips(ST的工程师英文也太烂了吧,Philips都写错),标准的I2S就是LRC比数据超前一位的,这个WM8978和STM32手册上的时序是一致的。

16bextended,I2S_Standard_MSB,I2S_Standard_LSB,16位32位,包括STM32配置I2S_Standard_MSB而CODEC配置FMT_I2S,甚至时钟极性我都试过了,情况都一样或者只会更坏。

LRC不会错位的,I2S是同步不间断发送的,只要第一位对齐,后面的都不会错,错位肯定就是第一帧开始就错。
STM32做Master时就不用测了,那个不同步不是I2S时序不同步,是CODEC里面的Sigma-Delta DAC时钟和I2S不同步,也就是说DAC内部数据错位。由于STM32和CODEC用了两个异步时钟,所以这没办法解决的了,相信现在已经是最好的情况,接下来只能依赖CODEC Master模式了。

出0入0汤圆

发表于 2010-3-7 17:49:36 | 显示全部楼层
"错位肯定就是第一帧开始就错"

是的.我现在发现,发送出去的第一帧就有时会错的.有时第一帧出现在LRC=1时,有时出现在LRC=0时,
就更别说后面了.

BCLK是需要提高,这个可以确认要改了.但这不是引起问题的根本原因.

现在要做的两点:
1.如何比较方便地找出后面错在哪.(数据一长条,头痛)
2.如何让他不错?

出0入0汤圆

发表于 2010-3-7 18:31:07 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-3-7 20:06:19 | 显示全部楼层
终于抓到两次数据丢失.暂时原因未知:


不旦丢了一个数据,同时LRC就被换掉了.

出0入0汤圆

发表于 2010-3-8 01:17:13 | 显示全部楼层
aozima 用的是什么逻辑分析仪?

出0入618汤圆

发表于 2010-3-8 06:08:40 | 显示全部楼层
回复【9楼】STM32_Study
aozima 用的是什么逻辑分析仪?
-----------------------------------------------------------------------

saleae logic的逻辑分析仪我山寨出来了

出0入618汤圆

发表于 2010-3-11 04:35:43 | 显示全部楼层
杯具了,已经确认,STM32的SPI2口有硬件BUG,I2S Slave模式不能正常使用。所以大家只能继续使用STM32 I2S Master模式了。
SPI3口也有另一个硬件BUG,同样有影响I2S Slave功能的可能性,但目前短时间测试未见明显异常。

以下是ST最新勘误表的相关内容:
2.15 Parasitic TXE generation in SPI2/I2S2 slave mode + 16-bit data frame mode
注:此BUG会随机使TXE连续两次置位,无论DMA/IRQ/轮询模式均无法避开由此引起的TxBuffer数据错误覆盖导致的数据丢失及帧错位情况。(见8楼截图)

Description
  When the SPI2/I2S2 slave mode is used either in transmit or in full-duplex mode, and the
  data frame format is configured to 16-bit, the TXE flag may go high two times before RXNE
  is set, that is, TXE may be asserted before the data already in the data register are
  transmitted. This may result in data loss during transmission.

Workarounds
  1. In SPI mode, use the 8-bit data frame mode instead of the 16-bit mode.
  2. The 16-bit mode may be used if the master stops the clock for every data transfer. The
     SPI2/I2S2 slave then has enough time to load the data register on the RXNE flag going high.

----------------------------- 杯具的分隔线 -----------------------------

2.6 SPI3 in I2S slave mode: timing sensitivity between I2S3_WS and I2S3_CK
此BUG在I2S3的WS信号先于CK信号改变时可能发生,导致数据错位或丢失。问题仅限于I2S和PCM模式,MSB和LSB没问题,故日后万一不幸再碰上此BUG的解决方案就是使用MSB或LSB模式。

Description
  When SPI3 is configured in I2S slave audio modemode in I2S Philips or PCM modes, If the
  I2S3_WS signal arrives too early with respect to the active edge of I2S3_CK, a wrong
  communication starting too soon may result: then, depending on the clock polarity and the
  Audio mode selected, it is either shifted by one bit from start to end or, the first left and right
  data items are lost and the others, shifted.

Workaround
  None. Use I2S3 in slave mode in the MSB/LSB justified mode only.

出0入618汤圆

发表于 2010-3-11 04:54:11 | 显示全部楼层
aozima 一直说STM32的I2S只是个能用级别:不开MCLK输出也只能分频出44.117kHz,勉强能用。开了MCLK更只能分频出46.875kHz,误差大到无法接受。
于是,我们只好选择了自带PLL的CODEC,以求获得准确的多采样率时钟,然后让STM32工作在I2S Slave模式,以为比较完美的解决了采样率问题。
没想到,STM32的I2S居然是个残废,而且居然两个都是,真的无语了。

出10入210汤圆

发表于 2010-3-11 09:13:41 | 显示全部楼层
这个问题还是请STM的技术支持来确认一下吧,其I2S设计不会这么不谨慎吧.

出0入0汤圆

发表于 2010-3-11 09:27:26 | 显示全部楼层
这个问题确实麻烦。

出0入618汤圆

发表于 2010-3-11 16:14:46 | 显示全部楼层
回复【13楼】rainbow 老陈
这个问题还是请STM的技术支持来确认一下吧,其I2S设计不会这么不谨慎吧.
-----------------------------------------------------------------------

这个问题已经写在Errata里面的了,是确认了的BUG,目前的测试也证实了这点。

出0入0汤圆

 楼主| 发表于 2010-3-12 09:46:05 | 显示全部楼层
还好。IIS3勉强还可以用,IIS2是彻底废了

出0入0汤圆

发表于 2010-3-13 10:47:32 | 显示全部楼层
那就换一个支持MSB/LSB 的CODEC(AK4342等),也就换一个小板。
现在的WM8978支持Left justified/Right justified/I2S/DSP modeA /B
STM I2S以外可以吗?

Speaker我个人认为不需要, Headphone就可以了。

出0入0汤圆

发表于 2010-3-13 10:52:52 | 显示全部楼层
回楼上,不是WM8978的问题,是STM32的问题.可以使用IIS3,情况会好些.

出0入0汤圆

发表于 2010-3-13 11:30:42 | 显示全部楼层
Use I2S3 in slave mode in the MSB/LSB justified mode only.
==>I2S3 slave mode 只支持MSB/LSB 问题WM8978支持吗

出0入0汤圆

发表于 2010-3-13 11:42:27 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-3-13 11:44:41 | 显示全部楼层
回复【19楼】piccode  
I2S3 slave mode 只支持MSB/LSB 问题WM8978支持吗
-----------------------------------------------------------------------
用Left justified就可以了

出0入618汤圆

发表于 2010-3-13 12:47:24 | 显示全部楼层
现在IIS3暂时没发现那个问题,继续用IIS模式。8978比STM32灵活,不用担心。

出0入0汤圆

 楼主| 发表于 2010-3-13 13:56:47 | 显示全部楼层
None. Use I2S3 in slave mode in the MSB/LSB justified mode only.

MSB,LSB模式WM8978都是支持的。这个不是问题。

出0入0汤圆

发表于 2010-3-13 14:14:55 | 显示全部楼层
有空时换I2S3试一下。

出0入0汤圆

发表于 2010-3-13 14:41:41 | 显示全部楼层
回复【24楼】piccode  
有空时换I2S3试一下。
-----------------------------------------------------------------------
在原板上面,IIS3已经都做了引出.
直接用线搭过去即可,CODEC模块不用拔出(此时不可能操作IIS2).
然后在 board.h 配置一下相应的选项就可以了.现在SVN中的代码已经支持IIS3了.

出0入0汤圆

发表于 2010-3-13 17:28:07 | 显示全部楼层
原板上没有看到引出(焊盘)?是和其它器件共用的吧? IIS2要切断吧

CODEC的MCLK I2S3 接97脚正确吗?

                   I2S2-PIN             I2S3--PIN
BCLK--------CK----PB13/PIN74----------PB3/PIN133
LRC---------WS----PB12/PIN73----------PA15/PIN110
ADCDAT------N.M
DACDAT------SD----PB15/PIN76----------PB5/PIN135
MCLK--------MCK-----PA8/PIN100--------PC7/PIN97  这里正确吗?(I2S2是PC6,怎么是PA8?)

谢谢!

出0入0汤圆

 楼主| 发表于 2010-3-13 18:22:49 | 显示全部楼层
IIS2的线不用割断,使用IIS3后,IIS2默认高阻输入,不会影响IIS3的工作。MCLK也不用接。
直接从底板左侧排针焊盘(IIS3所有IO都在这里)引线到Codec插座焊盘即可。

出0入0汤圆

发表于 2010-3-15 09:27:03 | 显示全部楼层
汗  MCLK也不用接。===》还是连接PA8吧
我变换了CK--PB3;WS-PA15;SD-PB5
#define LCD_VERSION        1
#define CODEC_MASTER_MODE        0
#define CODEC_USE_SPI3     0

不能播放了。一在停留在0:00    上面的硬件和 软件配置那里问题?
谢谢

出0入0汤圆

发表于 2010-3-15 11:51:45 | 显示全部楼层
"汗  MCLK也不用接。===》还是连接PA8吧 "

PA8 也不必接,接了也没用,事实上,板上已经接到CODEC了,没有地方再接什么.接了也没用,CODEC上面有个小跳线的,默认是板载晶振.

IIS的改动是对的:
WM8978-----------原-----改
BCLK----I2S_CK---PB13---PB3
LRC-----I2S_WS---PB12---PA15
DACDAT--I2S_SD---PB15---PB5

出0入0汤圆

发表于 2010-3-15 13:37:15 | 显示全部楼层
谢谢楼上的
中午试了。还是不能播放。
用SVN中的最新代码可以播放。
但是噪声还是没有改善噢。改和不改都一样啊。
#define CODEC_MASTER_MODE 0
#define CODEC_USE_SPI3     0     //是I2S3吗。 此处设为1的话无声音输出。

出0入0汤圆

发表于 2010-3-15 13:42:27 | 显示全部楼层
"#define CODEC_USE_SPI3     0"应该是吧,改了后,上面的MASTER一起改了.
现在IIS部分的软件不是我做的,是gzhuli和54ET做的.

你应该用WAV文件来测,播放方法finsh>>wav("/test.wav")

你说的噪音是指?可以查出是什么原因引起的噪音吗?

出0入0汤圆

发表于 2010-3-15 14:02:25 | 显示全部楼层
没有用wav file来测试。 我还是用之前的mp3file来测的(电脑没串口,不象是速度不够)
我现把file上传了

点击此处下载 ourdev_538453.rar(文件大小:121K) (原文件名:20KHZ.rar)

出0入618汤圆

发表于 2010-3-15 17:43:56 | 显示全部楼层
回复【30楼】piccode
#define CODEC_USE_SPI3     0     //是I2S3吗。 此处设为1的话无声音输出。
-----------------------------------------------------------------------

CODEC_MASTER_MODE是选择CODEC工作在SLAVE还是MASTER模式,CODEC_USE_SPI3是选择CODEC连接的端口,两个选项是独立的。
如果CODEC_USE_SPI3 0有声音,CODEC_USE_SPI3 1没声音的话,应该你的SPI3没接对线。

STM32 SPI2的SLAVE模式(即CODEC的MASTER模式)已经确认是有硬件BUG,所以
#define CODEC_MASTER_MODE 1
#define CODEC_USE_SPI3    0
这个组合出来有噪音是正常的。SPI2只能设置CODEC_MASTER_MODE 0。

出0入618汤圆

发表于 2010-3-15 17:46:09 | 显示全部楼层
另外,选择CODEC_MASTER_MODE 1时,codec.c必须用-O2以上优化级别,否则停止后再播放或者歌曲切换会变噪音。

出0入0汤圆

发表于 2010-3-15 19:16:53 | 显示全部楼层
谢谢!【34楼】 gzhuli 咕唧霖
讲解的很仔细。明白。 H/W的对的。是我用的之前的版本。只在board.h里修改了。现在全用SVN里的代码下面设置OK,噪声没有了
#define CODEC_MASTER_MODE        1
#define CODEC_USE_SPI3      1

谢谢!

出0入0汤圆

发表于 2010-7-10 01:33:35 | 显示全部楼层
宝贵经验,我也要用codec。没看到这个帖子,估计掉沟里了。

出0入0汤圆

发表于 2010-8-24 23:06:16 | 显示全部楼层
杯具

出0入0汤圆

发表于 2010-8-25 06:46:26 | 显示全部楼层
是的,刚开始的时候真的以为是杯具了

后来在调试过后,发现使用
SPI3 + Codec Slave Mode

声音还不错,比以前好。所以从Radio v3.0开始默认这样使用,Radio v2.0及以前的,需要飞个线,这个在aozima的帖子中有说明。

出0入0汤圆

发表于 2010-8-25 09:07:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-25 09:27:27 | 显示全部楼层
楼上的你的I2S3跑多少采样频率的?用的是多少位?

I2S3不能用DMA啊

出0入0汤圆

发表于 2010-8-25 09:39:58 | 显示全部楼层
回复【40楼】laoye  
楼上的你的i2s3跑多少采样频率的?用的是多少位?
i2s3不能用dma啊
-----------------------------------------------------------------------

几个采样率都跑过,能用DMA,具体的参见STM32 Radio代码。

出0入618汤圆

发表于 2010-8-25 09:47:17 | 显示全部楼层
回复【38楼】ffxz
是的,刚开始的时候真的以为是杯具了
后来在调试过后,发现使用
spi3 + codec slave mode
声音还不错,比以前好。所以从radio v3.0开始默认这样使用,radio v2.0及以前的,需要飞个线,这个在aozima的帖子中有说明。
-----------------------------------------------------------------------

Codec slave mode接SPI3和SPI2是没区别的。两个SPI的bug都是出在STM32 slave mode,SPI3的bug暂时没触发过,估计WM8978的时序是保证CK先于WS变化的。
Codec slave mode的唯一缺点就是STM32输出的采样率无法和Codec本地时钟精确同步,在两者时钟相差超过6个CK周期后,WM8978会重新同步,这时候会有轻微的杂音出现,一般听音乐很难察觉,听正弦波WAV可以发现。
Codec master mode需要注意的一点是codec.c的优化级别一定要-O2以上,否则IIS停止后再启动就会出现WS不同步,输出全变噪音,原因暂时不明。

目前SVN上的代码默认是SPI3 + Codec slave mode的,对于V3.0硬件,使用SPI3 + Codec master mode + codec.c -O3优化编译应该是没问题的。

出0入0汤圆

发表于 2010-8-25 12:25:40 | 显示全部楼层
谢谢ffxz ,,
输出正常了,不过一定要用
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16bextended;
如果是
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b的话,会跟I2S2一样的会输出两次的

出0入0汤圆

发表于 2010-8-25 13:04:28 | 显示全部楼层
回复【43楼】laoye  
谢谢ffxz ,,
输出正常了,不过一定要用
i2s_initstructure.i2s_dataformat = i2s_dataformat_16bextended;
如果是
i2s_initstructure.i2s_dataformat = i2s_dataformat_16b的话,会跟i2s2一样的会输出两次的
-----------------------------------------------------------------------

i2s的部分要多感谢54et,aozima,gzhuli才是,没有他们也就没有现在的STM32 Radio收音机了。

出0入0汤圆

发表于 2010-9-3 09:31:26 | 显示全部楼层
还有一点问题,,当i2s3工作在从端的时候,经常会出现左右声道的切换

我是用做usb声卡,pc端下来的数据肯定是对齐了的

你们有测试过吗?

出0入618汤圆

发表于 2010-9-3 11:50:12 | 显示全部楼层
回复【45楼】laoye
还有一点问题,,当i2s3工作在从端的时候,经常会出现左右声道的切换
我是用做usb声卡,pc端下来的数据肯定是对齐了的
你们有测试过吗?
-----------------------------------------------------------------------

看来你是踩到这个地雷了:

2.6 SPI3 in I2S slave mode: timing sensitivity between I2S3_WS and I2S3_CK
此BUG在I2S3的WS信号先于CK信号改变时可能发生,导致数据错位或丢失。问题仅限于I2S和PCM模式,MSB和LSB没问题,故日后万一不幸再碰上此BUG的解决方案就是使用MSB或LSB模式。

Description
  When SPI3 is configured in I2S slave audio modemode in I2S Philips or PCM modes, If the
  I2S3_WS signal arrives too early with respect to the active edge of I2S3_CK, a wrong
  communication starting too soon may result: then, depending on the clock polarity and the
  Audio mode selected, it is either shifted by one bit from start to end or, the first left and right
  data items are lost and the others, shifted.

Workaround
  None. Use I2S3 in slave mode in the MSB/LSB justified mode only.


建议你用双踪示波器抓CK和WS波形确认是不是这个问题。

出0入0汤圆

发表于 2010-9-4 13:27:43 | 显示全部楼层
我已经使用左对齐模式了

usb端下来的格式是对齐了,感觉是用i2s打过去的时候,会丢掉一个声道的时间

因为左右对齐是由DA来对齐的

出0入618汤圆

发表于 2010-9-4 15:30:04 | 显示全部楼层
建议用逻辑分析仪抓数据来分析。

出0入0汤圆

发表于 2010-12-28 14:01:05 | 显示全部楼层
spi3 在slave模式下,终于出正弦波了。呵呵,折腾了2天。

出0入0汤圆

发表于 2011-6-26 00:20:56 | 显示全部楼层
有没有WM8978录音范例可参考

出0入0汤圆

发表于 2011-8-3 23:42:00 | 显示全部楼层
mark 不错。

出0入0汤圆

发表于 2012-10-24 16:11:32 | 显示全部楼层
laoye 发表于 2010-8-25 12:25
谢谢ffxz ,,
输出正常了,不过一定要用
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16bextended ...

我的WM8978音频接口配置成左对齐模式后,STM32数据格式诺是I2S_DataFormat_16b格式 则无音频输出,,若STM32音频数据格式改成I2S_DataFormat_16bextended  就有输出了


我查了,STM32编程手册和库文件,也没看到写两I2S_DataFormat_16b和I2S_DataFormat_16bextended 实质的区别。 从字面上理解,一个是16位,一个是16位扩充模式。但本质不同在哪儿,望laoye大神,指点一下

出0入0汤圆

发表于 2012-10-24 16:28:46 | 显示全部楼层
也许您需要一个逻辑分析仪。

出0入0汤圆

发表于 2016-7-27 10:03:46 | 显示全部楼层
请问stm32f411或stm32f407的i2s slave模式有BUG吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表