TLV320ADC6140: TLV320ADC6140 I2S标准模式 AD芯片配置可以成功 但无法正确读到数据。

Part Number: TLV320ADC6140

我使用了Nrf52840作为主控MCU来读取TLV320ADC6140的数据。

示波器抓取了 I2S时序 FSYNC 15.8KHZ BCLK 508KHZ。

image.png

逻辑分析仪 分析数据是0000或者FFFF

image.png

尝试读取状态寄存器 发现ASI匹配成功了,但是转换模块未上电:

I: ASI_STS: 0x12.
I: DEV_STS0: 0x00.
I: DEV_STS1: 0xC0.

 

这是我代码中的配置:

static void adc6140_dc_config(void)
{
    uint8_t val = 0;
    LOG_INF("Adc6140 Condig.");
    // Go to Page 0
    adc6140_reg_write(0x00, 0x00);
    // Software reset
    adc6140_reg_write(0x01, 0x01);
    k_msleep(10);
    // 1. 进入配置模式
    adc6140_reg_write(0x02, 0x00); // Sleep 模式
    adc6140_reg_read(0x02, &val);
    LOG_INF("SLEEP_CFG: 0x%02X.", val);

    // ASI_CFG0 Protocol format : I2S mode. ASI word or slot length : 16 bits
    adc6140_reg_write(0x07, 0x40);
    adc6140_reg_read(0x07, &val);
    LOG_INF("ASI_CFG0: 0x%02X.", val);

    // 2. 配置通道 1 的输入映射 (假设你是单端输入)
    adc6140_reg_write(0x3C, 0x10); // CH1_CFG0: 设置为单端 Line-in (IN1P)
    adc6140_reg_read(0x3C, &val);
    LOG_INF("CH1_CFG0: 0x%02X.", val);
    adc6140_reg_write(0x3D, 0x28); // 给 20dB 增益,方便在示波器观察
    adc6140_reg_write(0x3F, 0x00); // 确保没有 Mute

    // 3. 激活通道输出使能 (关键步骤!)
    // 必须明确告诉芯片:把 CH1 的数据放到 ASI 总线上
    adc6140_reg_write(0x73, 0x80); // ASI_OUT_CH_EN: 开启通道 1 的输出驱动
    adc6140_reg_read(0x73, &val);
    LOG_INF("IN_CH_EN: 0x%02X.", val);
    adc6140_reg_write(0x74, 0x80); // ASI_CH1_SEL: 将 CH1 映射到 ASI 的第一个槽位 (Slot 0)
    adc6140_reg_read(0x74, &val);
    LOG_INF("ASI_OUT_CH_EN: 0x%02X.", val);
   
    // 4. 按照手册要求的顺序上电
    adc6140_reg_write(0x02, 0x81); // 唤醒数字核心
    adc6140_reg_read(0x02, &val);
    LOG_INF("SLEEP_CFG: 0x%02X.", val);
    k_msleep(10);          // 给内部偏置电压建立的时间
    adc6140_reg_write(0x75, 0xE0); // 同时开启 ADC 核心、PLL 和 VREF
    adc6140_reg_read(0x75, &val);
    LOG_INF("PWR_CFG: 0x%02X.", val);

    adc6140_reg_read(0x15, &val);
    LOG_INF("ASI_STS: 0x%02X.", val);
    adc6140_reg_read(0x76, &val);
    LOG_INF("DEV_STS0: 0x%02X.", val);
    adc6140_reg_read(0x77, &val);
    LOG_INF("DEV_STS1: 0x%02X.", val);
}
 
这是日志输出
I: Adc6140 init.
I: Adc6140 Condig.
I: SLEEP_CFG: 0x00.
I: ASI_CFG0: 0x40.
I: CH1_CFG0: 0x10.
I: IN_CH_EN: 0x80.
I: ASI_OUT_CH_EN: 0x80.
I: SLEEP_CFG: 0x81.
I: PWR_CFG: 0xE0.
I: ASI_STS: 0xFF.
I: DEV_STS0: 0x00.
I: DEV_STS1: 0xC0.
I: ASI_STS: 0x12.
I: DEV_STS0: 0x00.
I: DEV_STS1: 0xC0.
I: ASI_STS: 0x12.
I: DEV_STS0: 0x00.
I: DEV_STS1: 0xC0.
 
这是我在zephyr平台下的MCU I2S主接口配置
#define SAMPLE_FREQUENCY    16000
#define SAMPLE_BIT_WIDTH    16
#define BYTES_PER_SAMPLE    sizeof(int16_t)
#define NUMBER_OF_CHANNELS  2
/* Such block length provides an echo with the delay of 100 ms. */
#define SAMPLES_PER_BLOCK   ((SAMPLE_FREQUENCY / 100) * NUMBER_OF_CHANNELS)
#define INITIAL_BLOCKS      2
#define TIMEOUT             1000

#define BLOCK_SIZE  (BYTES_PER_SAMPLE * SAMPLES_PER_BLOCK)
#define BLOCK_COUNT (INITIAL_BLOCKS + 4)
K_MEM_SLAB_DEFINE_STATIC(mem_slab, BLOCK_SIZE, BLOCK_COUNT, 4);

static void adc6140_i2s_config(void)
{
    struct i2s_config config;

    config.word_size = SAMPLE_BIT_WIDTH;
    config.channels = NUMBER_OF_CHANNELS;
    config.format = I2S_FMT_DATA_FORMAT_I2S;
    config.options = I2S_OPT_BIT_CLK_MASTER | I2S_OPT_FRAME_CLK_MASTER;
    config.frame_clk_freq = SAMPLE_FREQUENCY;
    config.mem_slab = &mem_slab;
    config.block_size = BLOCK_SIZE;
    config.timeout = TIMEOUT;

    int err = i2s_configure(adc_i2s_dev, I2S_DIR_RX, &config);
    if (err) {
        LOG_ERR("I2S Configure err %d.", err);
    }
}
 
可以帮我分析一下问题的原因吗?
 
还有电路图是这样的:
 
7b00e223-c187-425c-a5d3-2cef3ae8729a.png