ESP32-WROOM-32 上有一个 DevBoard(30 针版本、USB-Type-C、CH340C)
Connecting.....
Chip is ESP32-D0WD-V3 (revision v3.1)
我画出了扫描仪的代码:
// ESP-IDF v5.4
#include <stdio.h>
#include <esp_err.h>
#include <esp_system.h>
#include <driver/gpio.h>
#include <driver/i2c_master.h>
#include <driver/i2c_types.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
esp_err_t init_i2c(i2c_master_bus_handle_t * handle)
{
i2c_master_bus_config_t bus = {
.i2c_port = I2C_NUM_0,
.sda_io_num = GPIO_NUM_21,
.scl_io_num = GPIO_NUM_22,
.clk_source = I2C_CLK_SRC_DEFAULT,
.glitch_ignore_cnt = 7,
.intr_priority = 0, // use default
.trans_queue_depth = 0, // no async ops
.flags.enable_internal_pullup = true,
.flags.allow_pd = 0, // disallow power down
};
return i2c_new_master_bus(&bus, handle);
}
void app_main(void)
{
i2c_master_bus_handle_t bus = NULL;
gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT); // onboard blue led
gpio_set_level(GPIO_NUM_2, true);
ESP_ERROR_CHECK(init_i2c(&bus));
for (uint16_t addr = 1; addr < 127; ++addr)
{
esp_err_t result = i2c_master_probe(bus, addr, -1); // -1 == infinity
const char * reaction = "Unknown error";
switch (result)
{
case ESP_OK:
reaction = "OK";
break;
case ESP_ERR_NOT_FOUND:
reaction = "NOT FOUND";
break;
case ESP_ERR_TIMEOUT:
reaction = "TIMEOUT (bus failure)";
break;
default:
break;
}
printf("%02X : %s (%d) \n", addr, reaction, result);
}
gpio_set_level(GPIO_NUM_2, false);
ESP_ERROR_CHECK(i2c_del_master_bus(bus));
printf("Restart:");
for (int i = 10; i > 0; --i)
{
printf(" %d", i);
fflush(stdout);
vTaskDelay(pdMS_TO_TICKS(1000));
}
printf(" NOW!\n");
esp_restart();
}
i2c_master_probe
调用调试控制台时,它会抛出总线错误:
E (279) i2c.master: I2C hardware timeout detected
E (279) i2c.master: probe device timeout. Please check if xfer_timeout_ms and pull-ups are correctly set up
告诉我我可能哪里搞砸了?
附加信息:
- 有 2 个设备连接到总线(Arduino 模块,每个模块都有自己的上拉电阻)
- 设备正在运行 - 在 Arduino Uno 和 Raspberry Pi 上检测到
- 当交换
GPIO_NUM_21
<->GPIO_NUM_22
(物理上 + 在总线设置中)时,错误消失,但未检测到设备。
事实证明,我的 DevBoard 副本在使用 GPIO21 时出现了硬件问题 - 输出端的电压持续约为 2 伏。
与其他人相连:
此后,问题中的代码就起作用了。
还发现了旧版本 I2C 驱动程序的代码:
使用 Arduino 框架中的 Wire 时也存在类似的问题。
为了解决这个问题,您需要明确指定所使用的引脚: