This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PCM1865的配置

Other Parts Discussed in Thread: PCM1865, PCM1865EVM

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。

    请问用I2CPCM1865寄存器的格式是不是(NODE_ADDR+W)+REG_ADDR+VALUE  ?

    还有,用I2CPCM1865寄存器的格式是什么样的呢?

  • 你好,

    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);