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.

[参考译文] TLV320ADC3101:重新同步功能的问题

Guru**** 2383060 points
Other Parts Discussed in Thread: TLV320ADC3101EVM-K
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/998521/tlv320adc3101-problems-with-re-sync-feature

器件型号:TLV320ADC3101

您好!

 我们在重新同步功能方面存在问题。 下面是有关我们的设置的更多详细信息。

我们使用16位的"左对齐模式"。 BCLK 和 WCLK 由一个外部 μ µC 提供、编解码器运行为一个从器件。 BCLK 源为8MHz、由编解码器 PLL 带入10.24MHz。 通过128次过采样、我们随后达到8kHz (= WCLK)的 ADC_FS。

在我们的案例中、这意味着与数据表条目相关的上升 WCLK 边沿的抖动必须小于+/- 390ns (Fs/4)。 我想我们可以满足这一条件。 当编解码器初始化时 BCLK 和 WCLK 已经运行时、它是否正常? 在本例中、8MHz 信号(BCLK 源)在编解码器初始化之前运行。 初始化后、WCLK 信号(8kHz)正在运行。 我们注意到、启动后通过 DOUT 提供大约380ms 的数据、然后仅发送0。 如何解释这种行为? 正常情况下、当条件< Fs/4时、一切都应重新启动。 我们已经设置了寄存器34 (第0页)中的位 D1和位 D0。 如果我们仅设置位 D1、则会发送数据。 但是,数据是不合理的。 当我们不使用重新同步功能时、一切工作正常、数据按预期传输。

在写入第1页条目后(请参阅数据)、在写入寄存器时(例如、ADC 加电-寄存器81)遵循正确的顺序是否重要?

 

此致、

Steffen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Steffen、

    无论 BCLK 和 FSYNC 是否正在运行、初始化都不应出现任何问题。 您能否共享时钟配置以供审核? 通常不需要使用重新同步功能、除非在时钟生成中出现过大的时钟漂移或其他错误。

    通常是的、建议在上电之前完成 ADC 和 PGA 配置、以避免配置输出产生任何不必要的噪声。

    最棒的

    Zak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Zak、

    一般而言、我们仍然对功能有一个了解问题。 即使同时违反了 FS/4条件、也应进行重新同步。 在我们的情况下、不会输出任何数据。

    有关我们的方法的更多信息。 我们使用演示板配置了编解码器、对其进行了测试、并通过 C 代码中数组中的寄存器表存储了第0、1、4和5页的设置。 在我们当前的目标系统上、我们首先执行硬件复位、然后软件复位、并使用第0、1、4和5页的1 - 127的所有寄存器来初始化编解码器。 然后写入第0页和第1页的各个寄存器、其中的设置与演示板的基本设置不同。 在本例中、在第0页、这适用于 PLL 设置(寄存器7、8)、处理块(寄存器61)、AGC 控制(寄存器94–98)、音量控制(寄存器84)、在第1页上适用于偏置电压(寄存器51)。 在附录中、我发送了设置。

    另外、奇怪的是、如果 ADC 在配置结束时打开(寄存器81)、则不会发送任何数据、如果所有寄存器都进行串行初始化、则不会发送当前数据。 这也与数据表中的示例相矛盾。

    如前所述、当关闭重新同步时、数据正常。 使用该功能后、我们不会获取任何数据。 现在参数化已为人所知、他们是否仍然有想法?

    此致、

    Steffen

    uint8_t Codec_Page_0_Reg_Values[127] = {0x00,0x20,0x00,0x07,0xC1,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x8A,0x80,0x80,0x04,0x00,0x00,0x01,0x81,0xC0,0x00,0x06,0x81,0x00,0x00,0x10,0x00,0x00,0xCC,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x02,0x02,0x00,0x00,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x80,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    uint8_t Codec_Page_1_Reg_Values[127] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x3F,0x3F,0x00,0x7F,0x00,0x80,0x1A,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    uint8_t Codec_Page_4_Reg_Values[127] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    uint8_t Codec_Page_5_Reg_Values[127] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    
    --> these are the initial values and starts allways with register 1
    --> written to codec in loops 
    
    
    --> after that the following registers are written:
    
    	//*********   select page 0 from CODEC register
    	i2c_codec_page_select(I2C_CODEC_REG_0, I2C_CODEC_PAGE_0); 
    	delay_ms(1);
    	
    	// Reg 7 - D Value PLL MSB
    	i2c_reg			= 7;
    	i2c_write_buf	= 0x04;
    		
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	// Reg 8 - D Value PLL LSB
    	i2c_reg			= 8;
    	i2c_write_buf	= 0xB0;
    		
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	// Reg 34 - I2S sync
    	i2c_reg			= 34;
    	i2c_write_buf	= 0x00; // re-sync off because it doesn´t work when switch on 
    		
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);	
    	
    	// Reg 61 - processing blocks 
    	i2c_reg			= 61;
    	i2c_write_buf	= 0x04; 
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	// Reg 94 - right AGC control 1
    	i2c_reg			= 94; 
    	i2c_write_buf	= 0xB0; 
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	// Reg 95 - right AGC control 2
    	i2c_reg			= 95;
    	i2c_write_buf	= 0x2D;
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	// Reg 96 - AGC Max Gain
    	i2c_reg			= 96;
    	i2c_write_buf	= 0x3C;
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);	
    
    	// Reg 97 - Right AGC Attack Time
    	i2c_reg			= 97;
    	i2c_write_buf	= 0x00;
    		
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	// Reg 98 - Right AGC Decay Time
    	i2c_reg			= 98;
    	i2c_write_buf	= 0x00;
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);	
    	
    	
    	// Reg 84 - Right ADC Volume Control
    	i2c_reg			= 84;
    	i2c_write_buf	= 0x00;
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);
    	
    	
    	//*********   select page 1 from CODEC register
    	i2c_codec_page_select(I2C_CODEC_REG_0, I2C_CODEC_PAGE_1); 
    	delay_ms(1);	
    	
    	// Reg 51 - set Bias voltage to 2,5V
    	i2c_reg			= 51;
    	i2c_write_buf	= 0x10;
    	
    	i2c_write_data(i2c_reg, &i2c_write_buf, 1);
    	delay_ms(1);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Steffen、

    首先、我强烈建议遵循数据表顺序、并且在对 PAGE 1寄存器进行编程之前不要为 ADC 通道加电。  

    为了解释 ADC 重新同步:ADC 上电后、我们将内部 DSP (用于 ADC 的抽取滤波器)指令计数器与 WCLK (或 FSYNC)相同步、以便基于 DSP 帧的内部处理与 WCLK/FSYNC 相锁定(这也有助于优化群延迟) 但是、如果由于某种原因在系统中 WCLK/FSYNC 频率出现毛刺脉冲/干扰、那么锁定会受到干扰、并可能导致 DSP 中的错误处理、例如数据丢失/重复等、并导致性能问题。 因此、加电同步/锁定后、我们监视每个帧相对于 WCLK/FSYNC 边沿的指令计数器值、如果我们看到漂移跨越1/4以上的帧、那么我们会生成错误标志来重新同步 DSP 与 WCLK/FSYNC。

    总之、如果系统中的 WCLK/FSYNC 定期逐周期运行、那么重新同步情况不会发生、但是 如果系统中的任何问题在 WCLK/FSYNC 中引起毛刺脉冲或干扰、那么它将导致重新同步。

    如果您没有通过重新同步获得数据输出、那么我认为您可能会遇到时钟配置问题。 您无法使用8MHz BCLK、并且无法以8kHz 采样率运行器件。 如果您说您向 MCLK 馈送8MHz、然后生成1.024MHz BCLK、这是可以接受的、但10.24MHz 将太大、以至于 BCLK/WCLK 比率。

    最棒的

    Zak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Zak、
    感谢您的评论。 遗憾的是、我们未成功使用推荐的设置。 为了进一步测试、我们返回到演示板并尝试使用 USB 音频测试示例。 MCLK = 11.2896MHzBCLK = 2.8224MHzWCLK = 44.1kHz该设置下、我们可以在 DOUT 的示波器上看到数据如果我们 通过    I2C 设置与软件重新同步激活 USB 音频设置、则不再次发送任何数据。 不要误解我们可能需要功能、我们希望了解实际使用它我们还注意到、在演示板的 GUI 中、您无法激活/停用重新同步。 这是有原因的吗? 您能否我们一个激活重新同步功能的设置(寄存器34 = 0x03)、我们可以  在演示板上检查该设置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Steffen、

    很抱歉、您看到此功能有问题。 您能否在演示板的测试中阐明您是否通过直接 I2C 写入启用了此重新同步功能并查看了正确的功能? 如果您想将对该寄存器的写操作添加到提供的其中一个初始化脚本中、可选择此选项。  

    是否只有在您使用自己的软件时数据才会停止?

    老实说、这不是一个功能、我有任何直接的体验、我不确定如何在 EVM 上正确测试它、因为我无法对时钟线施加足够的延迟来实际触发重新同步。  

    最棒的

    Zak  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Zak、您好、  我们直接通过 I2C 总线而通过 GUI 的脚本设置寄存器的同步功能。 可以尝试一下、直到下周但是、它将具有脚本写入寄存器时相同的效果。 如果您有演示板 TLV320ADC3101-K 可用、也可以对 其进行测试。 即使使用板、我们也会遇到 DOUT 处未看到数据的问题。 时钟来自 µC n´t 板的 μ C、我们假设它是正确的、并且我们没有时钟偏移。 不必延迟时钟线、因为当寄存器34描述为0x03时、不会输出任何数据。 你能测试一下吗?  选择设置以输出数据然后相应地描述寄存器34、并告诉我发生了什么。
    最好的,Steffen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Steffen、

    很抱歉、我没有跟进此事。 我想告诉大家、我在寄存器34D 设置为0x00、0x02和0x03的情况下测试了 TLV320ADC3101EVM-K、但没有看到任何行为变化。 它没有按照您描述的方式停止数据、因此我不确定为什么会发生这种情况、除非您的系统存在一些时钟完整性问题。

    最棒的

    Zak