Ошибка при сканировании I2C на ESP32-WROOM-32
Есть DevBoard на ESP32-WROOM-32 (вариант на 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, у каждого свои PULL-UP резисторы)
- устройства рабочие - определяются на Arduino Uno и Raspberry Pi
- при свапе
GPIO_NUM_21
<->GPIO_NUM_22
(физически + в настройках шины) ошибка пропадает, но и устройства не определяются.