i2c read timeout issue while reading Pb hub through atom lite in ESP-IDF
-
hey there, i am using ESP-IDF to program the atom lite, i have a Pb hub and i want to configure it with atom lite using the espidf, but the issue is i am getting read timeout error (error code 0x107) below is the code i am using.
#include <stdio.h>
#include "esp_log.h"
#include "driver/i2c.h"static const char *TAG = "i2c-simple-example";
#define I2C_MASTER_SCL_IO 32 /*!< GPIO number used for I2C master clock /
#define I2C_MASTER_SDA_IO 26 /!< GPIO number used for I2C master data /
#define I2C_MASTER_NUM 0 /!< I2C master i2c port number, the number of i2c peripheral interfaces available will depend on the chip /
#define I2C_MASTER_FREQ_HZ 400000 /!< I2C master clock frequency /
#define I2C_MASTER_TX_BUF_DISABLE 0 /!< I2C master doesn't need buffer /
#define I2C_MASTER_RX_BUF_DISABLE 0 /!< I2C master doesn't need buffer */
#define I2C_MASTER_TIMEOUT_MS 1000#define MPU9250_SENSOR_ADDR 0x61 /*!< Slave address of the MPU9250 sensor /
#define MPU9250_WHO_AM_I_REG_ADDR 0x61 /!< Register addresses of the "who am I" register */#define MPU9250_PWR_MGMT_1_REG_ADDR 0x6B /*!< Register addresses of the power managment register */
#define MPU9250_RESET_BIT 7/**
-
@brief Read a sequence of bytes from a MPU9250 sensor registers
*/
static esp_err_t mpu9250_register_read(uint8_t reg_addr, uint8_t *data, size_t len)
{
esp_err_t err = ESP_OK;
err = i2c_master_write_read_device(I2C_NUM_0, MPU9250_SENSOR_ADDR, ®_addr, 1, data, len, I2C_MASTER_TIMEOUT_MS / portTICK_RATE_MS);
return err;
}
static esp_err_t i2c_master_init(void)
{
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};i2c_param_config(I2C_NUM_0, &conf);
i2c_set_timeout(I2C_NUM_0, 400000);
return i2c_driver_install(I2C_NUM_0, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}
void app_main(void)
{
uint8_t data[2];
ESP_ERROR_CHECK(i2c_master_init());
ESP_LOGI(TAG, "I2C initialized successfully");while (1) { esp_err_t err = mpu9250_register_read(0x00, data, 1); if (err != ESP_OK) { int timevalue; i2c_get_timeout(I2C_NUM_0, &timevalue); ESP_LOGI(TAG, "time value is : %d err[%d]", timevalue, err); } ESP_LOGI(TAG, "WHO_AM_I = %X", data[0]); vTaskDelay(2000 / portTICK_PERIOD_MS); } ESP_ERROR_CHECK(i2c_driver_delete(I2C_NUM_0)); ESP_LOGI(TAG, "I2C unitialized successfully");
}
Note : interestingly i am able to read and write the Pb hub using the arduino ide wire library so i am confused what could be the issue.
i have go through all the documentation and help i could get online to resolve the issue but i am unable to solve it. any help in this regard would be highly appreciated. -
-
can you try adding ESP_ERROR_CHECK(esp_event_loop_create_default()); and see what errors you get?
When I compile and deploy my project, I see the following warning
i2c: This driver is an old driver; please migrate your application code to adapt
driver/i2c_master.h
,which causes my system to never finish initialization. In my case, the M5Unified library needs to be updated to use driver/i2c_master.h
Perhaps your timeout is related to the loop never initializing. At this point, I am only guessing what the issue might be.