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.

[参考译文] TLV320ADC5140:TLV320ADC5140 - I2S 上的立体声 PDM 麦克风

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

https://e2e.ti.com/support/audio-group/audio/f/audio-forum/1255458/tlv320adc5140-tlv320adc5140---stereo-pdm-microphones-over-i2s

器件型号:TLV320ADC5140

我难以理解如何将 TLV320ADC5140配置为在单个 TLV320通道上使用两个 PDM 麦克风(硬件配置为左、右)并通过 I2S 发送数据。

无论我尝试何种配置、最终都只有在我的微控制器(ESP32)上接收到正确的麦克风数据、并且音频始终抖动。

我敢肯定、我对配置 TLV320ADC5140的方式有一定的了解、并希望收到一些建议。

但是、到目前为止、我遵循了数据表中的8通道 PDM 示例、我已通过删除其中的6个通道来将其卸下:

/* ASI_CFG0: I2S mode and 32bit word length */
0x07: 112 [0111 0000]
/* PDMIN_CFG: PDMDIN1_EDGE ch1 positive, ch2 negative respective of INMP621 datasheet, page 5 */
0x20: 192 [1100 0000]
/* GPO1_CFG: PDM clock output, drive active low active high */
0x22: 65 [0100 0001]
/* GPI_CFG0: PDM data input channel 1 and 2 */
0x2B: 69 [0100 0101]
/* CH1_CFG0: configured for PDM input */
0x3C: 64 [0100 0000]
/* IN_CH_EN: enable channel 1 */
0x73: 192 [1100 0000]
/* ASI_OUT_CH_EN: enable channel 1 slot */
0x74: 128 [1000 0000]

对于单个通道(具有交错的左/右数据)上的两个麦克风如何映射到输出 ASI 时隙、我想我觉得更加困惑。 它是否仍通过 I2S 总线呈现为交错式数据?

PDM 接口的帧大小是如何确定的? 鉴于 ASI_WLEN 设置为32位、左通道为16位、右通道为16位吗?

其他相关信息:

  • PDMCLK 似乎是3.072MHz
  • FSYNC 为16kHz
  • BCLK 为1.024MHz
  • 采样速率为16kHz

I2S 总线初始化如下:

Audio::Audio() :
  tlv {},
  bck {21},
  ws {25},
  data {27},
  sampleRate {16000},
  bitsPerSample {32},
  channelFormat {I2S_CHANNEL_FMT_RIGHT_LEFT},
  communicationFormat {I2S_COMM_FORMAT_I2S}
{
  /* zero the buffer */
  std::memset(this->buffer, 0, BufferSize);

  /* i2s configuration */
  this->config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = this->sampleRate,
    .bits_per_sample = i2s_bits_per_sample_t(this->bitsPerSample),
    .channel_format = this->channelFormat,
    .communication_format = this->communicationFormat,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 4,
    .dma_buf_len = 1024,
    .use_apll = false,
    .tx_desc_auto_clear = false,
    .fixed_mclk = 0
  };

  /* configure the GPIO pins */
  this->pins = {
    .bck_io_num = this->bck,
    .ws_io_num = this->ws,
    .data_out_num = I2S_PIN_NO_CHANGE,
    .data_in_num = this->data
  };
}

下面是显示 BCLK 和 SDOUT 的示波器轨迹。 似乎只有一半的数据在 SDOUT 上发送:

更新:

我已更新 ASI_CH1 = 32、使其为 I2S 右侧时隙0、并已设置 ASI_CH2 = 0、使其为 I2S 左时隙0、现在我在 SDOUT 上看到更多数据:

基本上、我完全不知道我现在在做什么...  

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

    如果您仅使用数据表中提供的精确配置和2个麦克风、您是否看到了正确的数据?

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

    您好 Sanjay、

    感谢您的快速响应。

    我将很快地检查这一点。 很遗憾、输出数据格式与我的硬件不兼容、因为我不相信 ESP32支持 TDM 格式(我相信数据表示例支持这一点)。

    我也很难理解如何验证"正确的数据"是什么-很显然、我可以在示波器上看到波形、但这不容易解释为良好的数据。 我确实通过 USB 实现了音频帧传输机制、它将通过 I2S 收到的帧发送到 Windows 计算机、并从默认音频播放设备播放这些帧、但这些帧非常抖动、并且非常延迟、因此肯定是错误的。

    我将再次尝试数据表示例并很快更新。

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

    尊敬的 Sanjay:

    我已将所有内容恢复为8个通道的数据表示例、仅启用了4个通道- GPO/GPI1和 GPO/GPI2、其中每个通道都连接了2个 PDM 麦克风。 我还在 ASI_OUT_CH_EN 中仅启用了4个 ASI 通道。

    我可以根据我的第一个示波器迹线确认 SDOUT 数据中存在间隙。

    下面是 I2C 寄存器的转储:

    0x00: 0
    0x01: 0
    0x02: 129 [1000 0001]
    0x05: 5 [0000 0101]
    0x07: 112 [0111 0000]
    0x08: 0
    0x09: 0
    0x0B: 0
    0x0C: 1 [0000 0001]
    0x0D: 2 [0000 0010]
    0x0E: 3 [0000 0011]
    0x0F: 4 [0000 0100]
    0x10: 5 [0000 0101]
    0x11: 6 [0000 0110]
    0x12: 7 [0000 0111]
    0x13: 2 [0000 0010]
    0x14: 72 [0100 1000]
    0x15: 20 [0001 0100]
    0x16: 16 [0001 0000]
    0x1F: 64 [0100 0000]
    0x20: 0
    0x21: 34 [0010 0010]
    0x22: 65 [0100 0001]
    0x23: 65 [0100 0001]
    0x24: 0
    0x25: 0
    0x29: 0
    0x2A: 0
    0x2B: 69 [0100 0101]
    0x2C: 0
    0x2F: 0
    0x32: 0
    0x33: 255 [1111 1111]
    0x36: 192 [1100 0000]
    0x3B: 0
    0x3C: 64 [0100 0000]
    0x3D: 0
    0x3E: 201 [1100 1001]
    0x3F: 128 [1000 0000]
    0x40: 0
    0x41: 64 [0100 0000]
    0x42: 0
    0x43: 201 [1100 1001]
    0x44: 128 [1000 0000]
    0x45: 0
    0x46: 0
    0x47: 0
    0x48: 201 [1100 1001]
    0x49: 128 [1000 0000]
    0x4A: 0
    0x4B: 0
    0x4C: 0
    0x4D: 201 [1100 1001]
    0x4E: 128 [1000 0000]
    0x4F: 0
    0x52: 201 [1100 1001]
    0x53: 128 [1000 0000]
    0x54: 0
    0x57: 201 [1100 1001]
    0x58: 128 [1000 0000]
    0x59: 0
    0x5C: 201 [1100 1001]
    0x5D: 128 [1000 0000]
    0x5E: 0
    0x61: 201 [1100 1001]
    0x62: 128 [1000 0000]
    0x63: 0
    0x6B: 1 [0000 0001]
    0x6C: 64 [0100 0000]
    0x6D: 123 [0111 1011]
    0x70: 231 [1110 0111]
    0x73: 240 [1111 0000]
    0x74: 240 [1111 0000]
    0x75: 96 [0110 0000]
    0x76: 240 [1111 0000]
    0x77: 224 [1110 0000]
    0x7E: 40 [0010 1000]
    

    我看到 SDOUT 上出现正常波形的唯一时间是、我根据上面的更新交换左/右插槽。

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

    现在的成功略多。 我能够通过 USB 将接收到的 I2S 音频帧发送到我的 Windows 软件。 作为测试、我将从我的 iPhone 生成一个2kHz 正弦波、并通过其中一个通道进行收听。 生成的 WAV 文件已附加-我不清楚为什么它听起来像这样。

    e2e.ti.com/.../02082023_2D00_210717.wav

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

    I2S 波形看起来是否正常?

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

    据我所知、波形看起来不错、

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

    尊敬的 Sanjay:

    下面是我直接从 I2S 输出录制的 WAV 文件的一些频谱图:

    第一个设计应用了增益和体积。 请注意预期的主导2kHz 频率、但我不确定为什么还有其他谐波在文件中如此突出。 这是配置问题还是现在可能是电气问题-噪声等? 考虑到音频系统是数字系统、我倾向于认为这更多的是配置或成帧问题、但我可能错了。

    此图显示未应用增益或体积时的情况。 请注意、该文件中存在相同的频率:

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

    e2e.ti.com/.../pdm_5F00_xxx.cfg

    我已经使用 Pure Path 控制台工具生成了一个文件以进行 I2S 输出。我建议使用此工具。 是否可以在如下时间中使用 th 尝试该文件?

    LRCLK=48kHz

    BCLK=6.144MHz。

    另外、您能否描述您的整个系统、以便我能够更好地了解您看到的谐波