ESP-IDF 4.3 - RC
我们在一款ESP32硬件产品中用到了 ES8156,
由于ESP32 端 GPIO 紧张,所以希望 MCLK 不占用 ESP32 的 GPIO 。
顺芯FAE建议将 MCLK 和 BCLK 短接,由 BCLK 倍频得到 MCLK,并且提供了相应的寄存器配置。
在这种方式下, BCLK / LRCLK 不能小于 64 ,也就是每个 sample 最小 32bit 。
但是在播放 16 bit 双通道音频的时候,BCLK / LRCLK 只有 32 ,每个 sample 是 16 。
我用 I2S_BITS_PER_SAMPLE_32BIT 来播放 16bit 音频,是可以满足 ES8156 的要求的, 并且可以听到音乐,但是播放速度快了1倍 :
Code: Select all
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX),
.sample_rate = 8000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL2 | ESP_INTR_FLAG_IRAM,
.dma_buf_count = 2,
.dma_buf_len = 1024,
.use_apll = true,
.tx_desc_auto_clear = true,
.fixed_mclk = 0
};
顺芯FAE表示 标准I2S协议 可以用两个空字节填充,像这样 :
那么:
1. 是否可以通过配置,让 ESP32 播放 16bit 音频时,用2个空字节将每个 simple 由 16 bit 填充到 32bit
2. 如果不能配置,我能否在 i2s_write() 前,给数据事先插入隔空的2个字节