i2c_master_cmd_begin fails, returns ESP_FAIL

Eurymedon
Posts: 5
Joined: Wed Aug 17, 2022 6:36 pm

i2c_master_cmd_begin fails, returns ESP_FAIL

Postby Eurymedon » Wed Aug 17, 2022 6:48 pm

Im trying to use I2c with my ESP32 ('AI Thinker ESP32-CAM') but the i2c_master_cmd_begin() method returns ESP_FAIL.
I have looked and tried the various examples for I2c from espressif but unfortunately these all have the same issue, ESP_FAIL on writing to a slave.

See below my current implementation:

Code: Select all

 #include <stdio.h>
#include "esp_log.h"
#include "driver/i2c.h"

#define WRITE_BIT              (I2C_MASTER_WRITE)      /*!< I2C master write */
#define READ_BIT                (I2C_MASTER_READ)       /*!< I2C master read */
#define ACK_CHECK_EN       (0x1)                   		/*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS      (0x0)                   		/*!< I2C master will not check ack from slave */
#define ACK_VAL                 (0x0)                   		/*!< I2C ack value */
#define NACK_VAL               (0x1)                   		/*!< I2C nack value */

static const char *TAG = "i2c-example";

static esp_err_t i2c_master_init(void)
{
    ESP_LOGI(TAG, "Initializing the I2C master");

    int i2c_master_port = I2C_NUM_0;
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = GPIO_NUM_26,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = GPIO_NUM_27,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = 400000,
        .clk_flags = 0,
    };
    esp_err_t err = i2c_param_config(i2c_master_port, &conf);
    if (err != ESP_OK) {
        return err;
    }
    return i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0);
}

static uint8_t i2c_read(uint8_t slv_addr, uint8_t reg)
{
    uint8_t data=0;
    esp_err_t ret = ESP_FAIL;

    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
    i2c_master_write_byte(cmd, reg, ACK_CHECK_EN);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    
    if(ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to write write request to slave, err: %s", esp_err_to_name(ret));
        return 0;
    }
    
    cmd = i2c_cmd_link_create();
    
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, ( slv_addr << 1 ) | READ_BIT, ACK_CHECK_EN);
    i2c_master_read_byte(cmd, &data, NACK_VAL);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    
    if(ret != ESP_OK) {
        ESP_LOGE(TAG, "Read Failed addr:0x%02x, reg:0x%02x, data:0x%02x, err:%s", slv_addr, reg, data, esp_err_to_name(ret));
        return 0;
    }
    return data;
}

void app_main(void)
{
    ESP_ERROR_CHECK(i2c_master_init());

    uint8_t data = i2c_read(0x30, 0x0A);
    ESP_LOGI(TAG, "Read from data: 0x%02x", data);
}

ESP_Sprite
Posts: 8921
Joined: Thu Nov 26, 2015 4:08 am

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby ESP_Sprite » Thu Aug 18, 2022 12:48 am

Are you sure that the device you have connected actually lives at that address?

Eurymedon
Posts: 5
Joined: Wed Aug 17, 2022 6:36 pm

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby Eurymedon » Thu Aug 18, 2022 9:05 am

The address I am using is copied from some examples code I found using the same I2C device, it's the OV2620 camera.
However, it can definitly be possible that this is wrong ofcourse.
Maybe to clarify, the error occurs on the first write, where I'm requesting a read from a specific register. If the address is wrong will the function return with ESP_FAIL? In the documentation it's mentioned that the error corresponds with some type of heap error, I would be surprised if that's the case with this small of an application

Eurymedon
Posts: 5
Joined: Wed Aug 17, 2022 6:36 pm

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby Eurymedon » Thu Aug 18, 2022 7:38 pm

I used the slave address specified in one of the arduino examples that uses the same I2C slave (OV2620).
But to verify that its not a slave address issue I quickly adjusted the code to loop over all 127 slave addresses, see below. Unfortunately this did not give me any solutions, all I2C write requested are still failing. See the attached image with the loggings.

Code: Select all

#include <stdio.h>
#include "esp_log.h"
#include "driver/i2c.h"

#define WRITE_BIT               (I2C_MASTER_WRITE)      /*!< I2C master write */
#define READ_BIT                (I2C_MASTER_READ)       /*!< I2C master read */
#define ACK_CHECK_EN            (0x1)                   /*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS           (0x0)                   /*!< I2C master will not check ack from slave */
#define ACK_VAL                 (0x0)                   /*!< I2C ack value */
#define NACK_VAL                (0x1)                   /*!< I2C nack value */

static const char *TAG = "i2c-example";

static esp_err_t i2c_master_init(void)
{
    ESP_LOGI(TAG, "Initializing the I2C master");

    int i2c_master_port = I2C_NUM_0;
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = GPIO_NUM_26,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = GPIO_NUM_27,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        .master.clk_speed = 400000,
        .clk_flags = 0,
    };
    esp_err_t err = i2c_param_config(i2c_master_port, &conf);
    if (err != ESP_OK) {
        return err;
    }
    return i2c_driver_install(i2c_master_port, conf.mode, 0, 0, 0);
}

static uint8_t i2c_read(uint8_t slv_addr, uint8_t reg)
{
    uint8_t data=0;
    esp_err_t ret = ESP_FAIL;

    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
    i2c_master_write_byte(cmd, reg, ACK_CHECK_EN);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    
    if(ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to write write request to slave addr: 0x%02x, err: %s", slv_addr, esp_err_to_name(ret));
        return 0;
    }
    
    cmd = i2c_cmd_link_create();
    
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, ( slv_addr << 1 ) | READ_BIT, ACK_CHECK_EN);
    i2c_master_read_byte(cmd, &data, NACK_VAL);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_PERIOD_MS);
    i2c_cmd_link_delete(cmd);
    
    if(ret != ESP_OK) {
        ESP_LOGE(TAG, "Read Failed addr:0x%02x, reg:0x%02x, data:0x%02x, err:%s", slv_addr, reg, data, esp_err_to_name(ret));
        return 0;
    }
    return data;
}

void app_main(void)
{
    ESP_ERROR_CHECK(i2c_master_init());

    /* Reguest data from register 0x0A from slave 0 to 127 to determine slave address */
    uint8_t slave_addr = 0x00;
    for (slave_addr = 0x00; slave_addr <= 0x7F; slave_addr++) {
        uint8_t data = i2c_read(slave_addr, 0x0A);
        ESP_LOGI(TAG, "Read from data: 0x%02x", data);
    }
}
I (314) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (324) i2c-example: Initializing the I2C master
E (334) i2c-example: Failed to write write request to slave addr: 0x00, err: ESP_FAIL
E (344) i2c-example: Failed to write write request to slave addr: 0x01, err: ESP_FAIL
E (354) i2c-example: Failed to write write request to slave addr: 0x02, err: ESP_FAIL
E (374) i2c-example: Failed to write write request to slave addr: 0x03, err: ESP_FAIL
E (384) i2c-example: Failed to write write request to slave addr: 0x04, err: ESP_FAIL
E (394) i2c-example: Failed to write write request to slave addr: 0x05, err: ESP_FAIL
E (404) i2c-example: Failed to write write request to slave addr: 0x06, err: ESP_FAIL
E (424) i2c-example: Failed to write write request to slave addr: 0x07, err: ESP_FAIL
E (434) i2c-example: Failed to write write request to slave addr: 0x08, err: ESP_FAIL
E (444) i2c-example: Failed to write write request to slave addr: 0x09, err: ESP_FAIL
E (464) i2c-example: Failed to write write request to slave addr: 0x0a, err: ESP_FAIL
E (474) i2c-example: Failed to write write request to slave addr: 0x0b, err: ESP_FAIL
E (484) i2c-example: Failed to write write request to slave addr: 0x0c, err: ESP_FAIL
E (504) i2c-example: Failed to write write request to slave addr: 0x0d, err: ESP_FAIL
E (514) i2c-example: Failed to write write request to slave addr: 0x0e, err: ESP_FAIL
E (524) i2c-example: Failed to write write request to slave addr: 0x0f, err: ESP_FAIL
E (544) i2c-example: Failed to write write request to slave addr: 0x10, err: ESP_FAIL
E (554) i2c-example: Failed to write write request to slave addr: 0x11, err: ESP_FAIL
E (564) i2c-example: Failed to write write request to slave addr: 0x12, err: ESP_FAIL
E (584) i2c-example: Failed to write write request to slave addr: 0x13, err: ESP_FAIL
E (594) i2c-example: Failed to write write request to slave addr: 0x14, err: ESP_FAIL
E (604) i2c-example: Failed to write write request to slave addr: 0x15, err: ESP_FAIL
E (624) i2c-example: Failed to write write request to slave addr: 0x16, err: ESP_FAIL
E (634) i2c-example: Failed to write write request to slave addr: 0x17, err: ESP_FAIL
E (644) i2c-example: Failed to write write request to slave addr: 0x18, err: ESP_FAIL
E (664) i2c-example: Failed to write write request to slave addr: 0x19, err: ESP_FAIL
E (674) i2c-example: Failed to write write request to slave addr: 0x1a, err: ESP_FAIL
E (684) i2c-example: Failed to write write request to slave addr: 0x1b, err: ESP_FAIL
E (694) i2c-example: Failed to write write request to slave addr: 0x1c, err: ESP_FAIL
E (714) i2c-example: Failed to write write request to slave addr: 0x1d, err: ESP_FAIL
E (724) i2c-example: Failed to write write request to slave addr: 0x1e, err: ESP_FAIL
E (734) i2c-example: Failed to write write request to slave addr: 0x1f, err: ESP_FAIL
E (754) i2c-example: Failed to write write request to slave addr: 0x20, err: ESP_FAIL
E (764) i2c-example: Failed to write write request to slave addr: 0x21, err: ESP_FAIL
E (774) i2c-example: Failed to write write request to slave addr: 0x22, err: ESP_FAIL
E (794) i2c-example: Failed to write write request to slave addr: 0x23, err: ESP_FAIL
E (804) i2c-example: Failed to write write request to slave addr: 0x24, err: ESP_FAIL
E (814) i2c-example: Failed to write write request to slave addr: 0x25, err: ESP_FAIL
E (834) i2c-example: Failed to write write request to slave addr: 0x26, err: ESP_FAIL
E (844) i2c-example: Failed to write write request to slave addr: 0x27, err: ESP_FAIL
E (854) i2c-example: Failed to write write request to slave addr: 0x28, err: ESP_FAIL
E (874) i2c-example: Failed to write write request to slave addr: 0x29, err: ESP_FAIL
E (884) i2c-example: Failed to write write request to slave addr: 0x2a, err: ESP_FAIL
E (894) i2c-example: Failed to write write request to slave addr: 0x2b, err: ESP_FAIL
E (914) i2c-example: Failed to write write request to slave addr: 0x2c, err: ESP_FAIL
E (924) i2c-example: Failed to write write request to slave addr: 0x2d, err: ESP_FAIL
E (934) i2c-example: Failed to write write request to slave addr: 0x2e, err: ESP_FAIL
E (954) i2c-example: Failed to write write request to slave addr: 0x2f, err: ESP_FAIL
E (964) i2c-example: Failed to write write request to slave addr: 0x30, err: ESP_FAIL
E (974) i2c-example: Failed to write write request to slave addr: 0x31, err: ESP_FAIL
E (994) i2c-example: Failed to write write request to slave addr: 0x32, err: ESP_FAIL
E (1004) i2c-example: Failed to write write request to slave addr: 0x33, err: ESP_FAIL
E (1014) i2c-example: Failed to write write request to slave addr: 0x34, err: ESP_FAIL
E (1034) i2c-example: Failed to write write request to slave addr: 0x35, err: ESP_FAIL
E (1044) i2c-example: Failed to write write request to slave addr: 0x36, err: ESP_FAIL
E (1054) i2c-example: Failed to write write request to slave addr: 0x37, err: ESP_FAIL
E (1074) i2c-example: Failed to write write request to slave addr: 0x38, err: ESP_FAIL
E (1084) i2c-example: Failed to write write request to slave addr: 0x39, err: ESP_FAIL
E (1094) i2c-example: Failed to write write request to slave addr: 0x3a, err: ESP_FAIL
E (1114) i2c-example: Failed to write write request to slave addr: 0x3b, err: ESP_FAIL
E (1124) i2c-example: Failed to write write request to slave addr: 0x3c, err: ESP_FAIL
E (1134) i2c-example: Failed to write write request to slave addr: 0x3d, err: ESP_FAIL
E (1154) i2c-example: Failed to write write request to slave addr: 0x3e, err: ESP_FAIL
E (1164) i2c-example: Failed to write write request to slave addr: 0x3f, err: ESP_FAIL
E (1174) i2c-example: Failed to write write request to slave addr: 0x40, err: ESP_FAIL
E (1194) i2c-example: Failed to write write request to slave addr: 0x41, err: ESP_FAIL
E (1204) i2c-example: Failed to write write request to slave addr: 0x42, err: ESP_FAIL
E (1214) i2c-example: Failed to write write request to slave addr: 0x43, err: ESP_FAIL
E (1234) i2c-example: Failed to write write request to slave addr: 0x44, err: ESP_FAIL
E (1244) i2c-example: Failed to write write request to slave addr: 0x45, err: ESP_FAIL
E (1254) i2c-example: Failed to write write request to slave addr: 0x46, err: ESP_FAIL
E (1274) i2c-example: Failed to write write request to slave addr: 0x47, err: ESP_FAIL
E (1284) i2c-example: Failed to write write request to slave addr: 0x48, err: ESP_FAIL
E (1294) i2c-example: Failed to write write request to slave addr: 0x49, err: ESP_FAIL
E (1314) i2c-example: Failed to write write request to slave addr: 0x4a, err: ESP_FAIL
E (1324) i2c-example: Failed to write write request to slave addr: 0x4b, err: ESP_FAIL
E (1334) i2c-example: Failed to write write request to slave addr: 0x4c, err: ESP_FAIL
E (1354) i2c-example: Failed to write write request to slave addr: 0x4d, err: ESP_FAIL
E (1364) i2c-example: Failed to write write request to slave addr: 0x4e, err: ESP_FAIL
E (1374) i2c-example: Failed to write write request to slave addr: 0x4f, err: ESP_FAIL
E (1394) i2c-example: Failed to write write request to slave addr: 0x50, err: ESP_FAIL
E (1404) i2c-example: Failed to write write request to slave addr: 0x51, err: ESP_FAIL
E (1414) i2c-example: Failed to write write request to slave addr: 0x52, err: ESP_FAIL
E (1434) i2c-example: Failed to write write request to slave addr: 0x53, err: ESP_FAIL
E (1444) i2c-example: Failed to write write request to slave addr: 0x54, err: ESP_FAIL
E (1454) i2c-example: Failed to write write request to slave addr: 0x55, err: ESP_FAIL
E (1474) i2c-example: Failed to write write request to slave addr: 0x56, err: ESP_FAIL
E (1484) i2c-example: Failed to write write request to slave addr: 0x57, err: ESP_FAIL
E (1494) i2c-example: Failed to write write request to slave addr: 0x58, err: ESP_FAIL
E (1514) i2c-example: Failed to write write request to slave addr: 0x59, err: ESP_FAIL
E (1524) i2c-example: Failed to write write request to slave addr: 0x5a, err: ESP_FAIL
E (1534) i2c-example: Failed to write write request to slave addr: 0x5b, err: ESP_FAIL
E (1554) i2c-example: Failed to write write request to slave addr: 0x5c, err: ESP_FAIL
E (1564) i2c-example: Failed to write write request to slave addr: 0x5d, err: ESP_FAIL
E (1574) i2c-example: Failed to write write request to slave addr: 0x5e, err: ESP_FAIL
E (1594) i2c-example: Failed to write write request to slave addr: 0x5f, err: ESP_FAIL
E (1604) i2c-example: Failed to write write request to slave addr: 0x60, err: ESP_FAIL
E (1614) i2c-example: Failed to write write request to slave addr: 0x61, err: ESP_FAIL
E (1634) i2c-example: Failed to write write request to slave addr: 0x62, err: ESP_FAIL
E (1644) i2c-example: Failed to write write request to slave addr: 0x63, err: ESP_FAIL
E (1654) i2c-example: Failed to write write request to slave addr: 0x64, err: ESP_FAIL
E (1674) i2c-example: Failed to write write request to slave addr: 0x65, err: ESP_FAIL
E (1684) i2c-example: Failed to write write request to slave addr: 0x66, err: ESP_FAIL
E (1694) i2c-example: Failed to write write request to slave addr: 0x67, err: ESP_FAIL
E (1714) i2c-example: Failed to write write request to slave addr: 0x68, err: ESP_FAIL
E (1724) i2c-example: Failed to write write request to slave addr: 0x69, err: ESP_FAIL
E (1734) i2c-example: Failed to write write request to slave addr: 0x6a, err: ESP_FAIL
E (1754) i2c-example: Failed to write write request to slave addr: 0x6b, err: ESP_FAIL
E (1764) i2c-example: Failed to write write request to slave addr: 0x6c, err: ESP_FAIL
E (1774) i2c-example: Failed to write write request to slave addr: 0x6d, err: ESP_FAIL
E (1794) i2c-example: Failed to write write request to slave addr: 0x6e, err: ESP_FAIL
E (1804) i2c-example: Failed to write write request to slave addr: 0x6f, err: ESP_FAIL
E (1814) i2c-example: Failed to write write request to slave addr: 0x70, err: ESP_FAIL
E (1834) i2c-example: Failed to write write request to slave addr: 0x71, err: ESP_FAIL
E (1844) i2c-example: Failed to write write request to slave addr: 0x72, err: ESP_FAIL
E (1854) i2c-example: Failed to write write request to slave addr: 0x73, err: ESP_FAIL
E (1874) i2c-example: Failed to write write request to slave addr: 0x74, err: ESP_FAIL
E (1884) i2c-example: Failed to write write request to slave addr: 0x75, err: ESP_FAIL
E (1894) i2c-example: Failed to write write request to slave addr: 0x76, err: ESP_FAIL
E (1914) i2c-example: Failed to write write request to slave addr: 0x77, err: ESP_FAIL
E (1924) i2c-example: Failed to write write request to slave addr: 0x78, err: ESP_FAIL
E (1934) i2c-example: Failed to write write request to slave addr: 0x79, err: ESP_FAIL
E (1954) i2c-example: Failed to write write request to slave addr: 0x7a, err: ESP_FAIL
E (1964) i2c-example: Failed to write write request to slave addr: 0x7b, err: ESP_FAIL
E (1974) i2c-example: Failed to write write request to slave addr: 0x7c, err: ESP_FAIL
E (1994) i2c-example: Failed to write write request to slave addr: 0x7d, err: ESP_FAIL
E (2004) i2c-example: Failed to write write request to slave addr: 0x7e, err: ESP_FAIL
E (2014) i2c-example: Failed to write write request to slave addr: 0x7f, err: ESP_FAIL

ESP_Sprite
Posts: 8921
Joined: Thu Nov 26, 2015 4:08 am

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby ESP_Sprite » Fri Aug 19, 2022 12:57 pm

That does indicate there's at least a mismatch between the hardware and what the software expects. Are you sure the GPIOs you are using are correct then?

Eurymedon
Posts: 5
Joined: Wed Aug 17, 2022 6:36 pm

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby Eurymedon » Fri Aug 19, 2022 2:01 pm

Yes, I am following the pinout of the AI thinker CAM for the SDA and SCL. This is pin 26 en 27 as shown in this article: https://randomnerdtutorials.com/esp32-c ... er-pinout/

ESP_Sprite
Posts: 8921
Joined: Thu Nov 26, 2015 4:08 am

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby ESP_Sprite » Sat Aug 20, 2022 2:33 am

Then I have no idea... hardware broken, maybe?

Eurymedon
Posts: 5
Joined: Wed Aug 17, 2022 6:36 pm

Re: i2c_master_cmd_begin fails, returns ESP_FAIL

Postby Eurymedon » Sun Aug 21, 2022 9:10 am

Solved the issue!
Somewhere deep in the datasheet it mentions that the chip requires an external system clock. After providing this clock everything works as expected!

Who is online

Users browsing this forum: Baidu [Spider] and 111 guests