Part Number: TLV320ADC6140
我使用了Nrf52840作为主控MCU来读取TLV320ADC6140的数据。
示波器抓取了 I2S时序 FSYNC 15.8KHZ BCLK 508KHZ。

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

尝试读取状态寄存器 发现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.
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);
}
}
可以帮我分析一下问题的原因吗?
还有电路图是这样的:
