玩过ESP32音频开发的朋友都知道,配置I2S时通常是不需要配置MCLK的,然后就会想当然的按照如下配置I2S的GPIO,初看好像没发现什么毛病,再看好像还是没什么毛病。然后就是编译烧录,经过测试音频采集和播放都没有问题,可我总感觉哪里不对劲。
const i2s_pin_config_t pin_config = {
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = I2S_SDO,
.data_in_num = I2S_SDI
};
err = i2s_set_pin(I2S_PORT, &pin_config);
if (err != ESP_OK) {
Serial.printf("Failed setting pin: %d\n", err);
//while (true);
}
很巧的是,我手上ESP32板子上的IO0刚好是用来检测按键的,奇葩的事情发生了,我根本没按按键,LOG却显示当前按键一直在不停的短按。我就纳闷了,按键是怎么自动触发的,该不会是ESP-IDF版本有问题吧,I2S通信对IO0有影响!接着就是一顿猛操作,不停的换ESP-IDF的版本,从3.5.0一直换到最新的5.1.1,表现都神一般的一样!该不会这个问题延续这么多个版本吧,乐鑫的工程师也不是吃素的,所以不应该是版本问题。
[04:25:38.713]收←◆key_menu short press!
[04:25:38.769]收←◆key_menu short press!
[04:25:38.829]收←◆key_menu short press!
[04:25:38.886]收←◆key_menu short press!
[04:25:38.946]收←◆key_menu short press!
[04:25:39.004]收←◆key_menu short press!
[04:25:39.061]收←◆key_menu short press!
[04:25:39.119]收←◆key_menu short press!
[04:25:39.177]收←◆key_menu short press!
[04:25:39.235]收←◆key_menu short press!
[04:25:39.296]收←◆key_menu short press!
[04:25:39.351]收←◆key_menu short press!
[04:25:39.409]收←◆key_menu short press!
[04:25:39.479]收←◆key_menu short press!
所以我就想起来用逻辑分析仪来测量一下IO0按键的波形,一测发现是一个1.25MHz左右的波形,这个频率咋那么熟悉呢,猛然醒悟,这该不是MCLK脚的波形吧。果不其然,默认没给它配置,底层函数居然把它配置到IO0去了,我去吐血,居然这么刚!
正确配置需要给MCLK赋值为-1,这样编译器就不会把它随便配置到其他引脚上去了。ESP32其他外设如果也有这种情况,不用的引脚一定要记得配置为-1,否则编译器又会把它配到IO0 去,那样就会产生各种奇奇怪怪烧脑的问题!
const i2s_pin_config_t pin_config = {
.mck_io_num = -1,
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = I2S_SDO,
.data_in_num = I2S_SDI
};
err = i2s_set_pin(I2S_PORT, &pin_config);
if (err != ESP_OK) {
Serial.printf("Failed setting pin: %d\n", err);
//while (true);
}