PCM1865的配置
Hi: 你好, 我在使用PCM1865,我将其设置为slave模式有data输入,但是我设置成master就没有输入了。我想知道如果将其设置为slave模式下,register的典型配置是什么? 可以给出来吗?谢谢
你好:
设置为master,需要设置很多divider(分频系数),选择用PLL还是不用PLL。请参照9.13 Clock中的描述对寄存器进行设置。
我要将其设置为salve,请问怎么设置?
我的提问有问题,我是将PCM1865设置为master是有数据输出的,但是设置为slave是没有数据的。想问下设置为slave的话,需要设置哪些寄存器?
你好,
如果是换成slave那就很简单了,设置page 0 register 32,然后给ADC正确的时钟即可。
入股你没有输出的话,先检查一下你给的时钟是不是对的。
uint8 write_codec_register(uint8 node , uint8 reg , uint8 val , uint8 desired_length);这个是函数原型,我们一个I2S上接了两个设备,想使用TDM模式。
以下是我们的寄存器的设置,由于我们是在开发阶段,所以将一个设备设置为power down模式。另一个设置正常模式,函数原型设置过程如下:
write_codec_register( 0x94 , 0 , 0xff , 3); //reset register
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 0 , 0x00 , 3); //select register page0
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 112 , 0x07 , 3); //analog power down
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 0 , 0x03 , 3); //select register page3
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 18 , 0x01 , 3); //power down
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 21 , 0x00 , 3); //power down
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 0 , 0xff , 3); //reset register
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 0 , 0x00 , 3); //select register page0
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 1 , 0x50 , 3); //control the PGA
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 2 , 0x50 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 3 , 0x50 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 4 , 0x50 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 6 , 0x10 , 3); //select ADC channel
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 7 , 0x10 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 8 , 0x20 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 9 , 0x20 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 40 , 0x03 , 3); //
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x96 , 32 , 0x4e , 3); //
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
并且将我们的MCU设置为master,mcu的BCK,和LRCLK都输出正常,唯有DA线上通过示波器看不到任何数据。请问我们将怎么操作?
你好:
你这个代码确实是设置ADC为slave,slave模式下工作应该比较简单。
1.请先检查和确认I2C读写PCM1865正确
2.reset后延时一段时间后再接着写后面的数据
3.你进入了power down模式,可先打开,power dwon后不是所有的ADC都工作。同时再检查一下ADC通道的选择是否正确。
4.请确认一下BCK,LRCK的时钟大小并贴出来。
你好,
我们用的BCK=2.4M,LRCK=48K。
请问用I2C写PCM1865寄存器的格式是不是(NODE_ADDR+W)+REG_ADDR+VALUE ?
还有,用I2C读PCM1865寄存器的格式是什么样的呢?
你好,
I2C读写的格式是标准协议,你按I2C标准协议读写即可。我的意思是你先查一下你I2C通信正常没,写进去一个数,读出来看是不是写成功了。
然后你们是TDM模式的话,还要设置page 0 register 11和12。当然你也可以先用I2S格式接一个调通,I2S格式也要设置 register 11。时钟的话,BCK要满足基本的关系:BCK>=2*length*LRCK,所以要根据你的时钟,位数设置成16bit或者24bit都行。
我们这个寄存器也设置了,但是SDA依然没有输出。这个有没有其他demo的参考方案吗?或者I2C的设置的demo代码?
你好:
很抱歉PCM1865EVM的软件,内置的没有demo 代码,还是得自己配。这个配置应该不复杂,我还是建议,先用一片PCM1865,配置I2S得到输出,在实现其他功能。
一片ADC,先I2C读写正确,然后在配置设为slave器件,I2S的时钟信号都正确的话,就会有输出。或者你可以先用硬件模式确认一下,看电路是否有问题。
你好,
我们把PCM1865里面寄存器的值读出来看了一下,写进去的值是没有问题的。但是page0的register114的值总是等于1,也就是处于wait clock stable状态。
请问出现这个问题的原因大致有哪些?
还有,在slave模式下,对于时钟的设置除了register32还有哪些寄存器要注意?
我们的硬件电路如下图所示。
你好,
原理图中的MCLK为10MHz,register115的值为3,register116的值为39。请问这个问题大概出在哪里?
你好:
硬件电路没有问题。
再次确认一下时钟:
你是MCLK和I2S的时钟都是外部供给,然后MCLK=10M, BCLK=2.4M,WCLK=48K ?
如果都是外部供给,建议MCLK=12.288MHZ,其余的I2S 时钟都是对的。
然后regsiter 32的值设为0x04,register 115和116是多少都没有关系了,因为这个时候ADC是接收时钟,不需要配置这些分频系数。
其余的就是通道设置了,通道设置一下即可。
你好,
请问把register32设置为0x04是实现什么功能?
我把register32设置为0x04后,还是没有Data信号,然后我又把register设置为0x01,同样是没有Data信号。
还有,把register32设置为0x04后,相关的PLL寄存器是不是也要配置?
我们现在提供的MCLK=12M,BCLK=2.4M,WCLK=48K。
ADC通道配置如下:
write_codec_register( 0x94 , 6 , 0x10 , 3); //select ADC channel
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 7 , 0x10 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 8 , 0x00 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);
write_codec_register( 0x94 , 9 , 0x00 , 3);
Init_Iic_Transmit();
while(!Iic0_Data.tx_state);