sp32s3 - I2C transaction unexpected nack detected
Posted: Thu Apr 17, 2025 5:48 am
[#include <stdio.h>
#include <math.h>
#include "bmi323.h"
#include "driver/i2c_master.h"
#include "esp_log.h"
#include "esp_rom_sys.h"
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define TAG "BMI323_APP"
#define GRAVITY_EARTH (9.80665f)
#define I2C_MASTER_SCL_IO 5
#define I2C_MASTER_SDA_IO 6
#define I2C_PORT_NUM_0 I2C_NUM_0
#define BMI323_I2C_ADDR 0x69
#define READ_WRITE_LEN 8
static i2c_master_bus_handle_t bus_handle;
static i2c_master_dev_handle_t dev_handle;
static int8_t bmi3_i2c_read(uint8_t reg_addr, uint8_t *data, uint32_t len, void *intf_ptr)
{
i2c_master_dev_handle_t handle = (i2c_master_dev_handle_t)intf_ptr;
esp_err_t ret = i2c_master_transmit_receive(handle, ®_addr, 1, data, len, -1);
return (ret == ESP_OK) ? BMI3_OK : BMI3_E_COM_FAIL;
}
static int8_t bmi3_i2c_write(uint8_t reg_addr, const uint8_t *data, uint32_t len, void *intf_ptr)
{
i2c_master_dev_handle_t handle = (i2c_master_dev_handle_t)intf_ptr;
uint8_t buffer[len + 1];
buffer[0] = reg_addr;
memcpy(&buffer[1], data, len);
esp_err_t ret = i2c_master_transmit(handle, buffer, len + 1, -1);
return (ret == ESP_OK) ? BMI3_OK : BMI3_E_COM_FAIL;
}
static void bmi3_delay_us(uint32_t period, void *intf_ptr)
{
(void)intf_ptr;
esp_rom_delay_us(period);
}
static int8_t set_accel_config(struct bmi3_dev *dev);
static int8_t set_gyro_config(struct bmi3_dev *dev);
static float lsb_to_mps2(int16_t val, int8_t g_range, uint8_t bit_width);
static float lsb_to_dps(int16_t val, float dps, uint8_t bit_width);
int app_main(void)
{
struct bmi3_dev dev = {0};
int8_t rslt;
struct bmi3_sensor_data accel_data = {0};
struct bmi3_sensor_data gyro_data = {0};
float ax = 0, ay = 0, az = 0;
float gx = 0, gy = 0, gz = 0;
int16_t raw_ax = 0, raw_ay = 0, raw_az = 0;
int16_t raw_gx = 0, raw_gy = 0, raw_gz = 0;
// I2C Configuration
i2c_master_bus_config_t i2c_mst_config = {
.clk_source = I2C_CLK_SRC_DEFAULT,
.i2c_port = I2C_PORT_NUM_0,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_io_num = I2C_MASTER_SDA_IO,
.glitch_ignore_cnt = 7,
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle));
i2c_device_config_t dev_cfg = {
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
.device_address = BMI323_I2C_ADDR,
.scl_speed_hz = 100000,
};
ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle));
// Assign interface functions
dev.read = bmi3_i2c_read;
dev.write = bmi3_i2c_write;
dev.intf = BMI3_I2C_INTF;
dev.intf_ptr = dev_handle;
dev.delay_us = bmi3_delay_us;
dev.read_write_len = READ_WRITE_LEN;
rslt = bmi323_init(&dev);
if (rslt != BMI323_OK) {
printf("bmi323_init failed\n");
return rslt;
}
rslt = set_accel_config(&dev);
if (rslt != BMI323_OK) {
printf("set_accel_config failed\n");
return rslt;
}
rslt = set_gyro_config(&dev);
if (rslt != BMI323_OK) {
printf("set_gyro_config failed\n");
return rslt;
}
accel_data.type = BMI323_ACCEL;
gyro_data.type = BMI323_GYRO;
while (1) {
rslt = bmi323_get_sensor_data(&accel_data, 1, &dev);
if (rslt == BMI323_OK) {
raw_ax = accel_data.sens_data.acc.x;
raw_ay = accel_data.sens_data.acc.y;
raw_az = accel_data.sens_data.acc.z;
ax = lsb_to_mps2(raw_ax, 2, dev.resolution);
ay = lsb_to_mps2(raw_ay, 2, dev.resolution);
az = lsb_to_mps2(raw_az, 2, dev.resolution);
}
rslt = bmi323_get_sensor_data(&gyro_data, 1, &dev);
if (rslt == BMI323_OK) {
raw_gx = gyro_data.sens_data.gyr.x;
raw_gy = gyro_data.sens_data.gyr.y;
raw_gz = gyro_data.sens_data.gyr.z;
gx = lsb_to_dps(raw_gx, 2000.0f, dev.resolution);
gy = lsb_to_dps(raw_gy, 2000.0f, dev.resolution);
gz = lsb_to_dps(raw_gz, 2000.0f, dev.resolution);
}
printf("Accel => raw-> x=%d, y=%d, z=%d | mps2-> x=%4.2f, y=%4.2f, z=%4.2f || Gyro => raw-> x=%d, y=%d, z=%d | dps-> x=%4.2f, y=%4.2f, z=%4.2f\n",
raw_ax, raw_ay, raw_az, ax, ay, az, raw_gx, raw_gy, raw_gz, gx, gy, gz);
vTaskDelay(pdMS_TO_TICKS(1000));
}
return rslt;
}
static int8_t set_accel_config(struct bmi3_dev *dev)
{
int8_t rslt;
struct bmi3_sens_config config;
struct bmi3_map_int map_int = {0};
config.type = BMI323_ACCEL;
rslt = bmi323_get_sensor_config(&config, 1, dev);
if (rslt != BMI323_OK) return rslt;
map_int.acc_drdy_int = BMI3_INT1;
rslt = bmi323_map_interrupt(map_int, dev);
if (rslt != BMI323_OK) return rslt;
config.cfg.acc.odr = BMI3_ACC_ODR_100HZ;
config.cfg.acc.range = BMI3_ACC_RANGE_2G;
config.cfg.acc.bwp = BMI3_ACC_BW_ODR_QUARTER;
config.cfg.acc.avg_num = BMI3_ACC_AVG64;
config.cfg.acc.acc_mode = BMI3_ACC_MODE_NORMAL;
rslt = bmi323_set_sensor_config(&config, 1, dev);
return rslt;
}
static int8_t set_gyro_config(struct bmi3_dev *dev)
{
int8_t rslt;
struct bmi3_sens_config config;
struct bmi3_map_int map_int = {0};
config.type = BMI323_GYRO;
rslt = bmi323_get_sensor_config(&config, 1, dev);
if (rslt != BMI323_OK) return rslt;
map_int.gyr_drdy_int = BMI3_INT1;
rslt = bmi323_map_interrupt(map_int, dev);
if (rslt != BMI323_OK) return rslt;
config.cfg.gyr.odr = BMI3_GYR_ODR_100HZ;
config.cfg.gyr.range = BMI3_GYR_RANGE_2000DPS;
config.cfg.gyr.bwp = BMI3_GYR_BW_ODR_HALF;
config.cfg.gyr.avg_num = BMI3_GYR_AVG1;
config.cfg.gyr.gyr_mode = BMI3_GYR_MODE_NORMAL;
rslt = bmi323_set_sensor_config(&config, 1, dev);
return rslt;
}
static float lsb_to_mps2(int16_t val, int8_t g_range, uint8_t bit_width)
{
float half_scale = (float)((1UL << bit_width) / 2.0f);
return (GRAVITY_EARTH * val * g_range) / half_scale;
}
static float lsb_to_dps(int16_t val, float dps, uint8_t bit_width)
{
float half_scale = (float)((1UL << bit_width) / 2.0f);
return (dps / half_scale) * val;
}
]
this is my code to interface of bmi323 with esp32s3 this code work fine but after some time getting error long below
E (250477) i2c.master: I2C transaction unexpected nack detected
E (250477) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (250477) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
E (250487) i2c.master: I2C transaction unexpected nack detected
E (250487) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (250497) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
Accel => raw-> x=-2538, y=-2604, z=15898 | mps2-> x=-1.52, y=-1.56, z=9.52 || Gyro => raw-> x=-2, y=-7, z=-1 | dps-> x=-0.12, y=-0.43, z=-0.06
E (251517) i2c.master: I2C transaction unexpected nack detected
E (251517) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (251517) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
E (251527) i2c.master: I2C transaction unexpected nack detected
E (251527) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (251537) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
Accel => raw-> x=-2538, y=-2604, z=15898 | mps2-> x=-1.52, y=-1.56, z=9.52 || Gyro => raw-> x=-2, y=-7, z=-1 | dps-> x=-0.12, y=-0.43, z=-0.06
#include <math.h>
#include "bmi323.h"
#include "driver/i2c_master.h"
#include "esp_log.h"
#include "esp_rom_sys.h"
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define TAG "BMI323_APP"
#define GRAVITY_EARTH (9.80665f)
#define I2C_MASTER_SCL_IO 5
#define I2C_MASTER_SDA_IO 6
#define I2C_PORT_NUM_0 I2C_NUM_0
#define BMI323_I2C_ADDR 0x69
#define READ_WRITE_LEN 8
static i2c_master_bus_handle_t bus_handle;
static i2c_master_dev_handle_t dev_handle;
static int8_t bmi3_i2c_read(uint8_t reg_addr, uint8_t *data, uint32_t len, void *intf_ptr)
{
i2c_master_dev_handle_t handle = (i2c_master_dev_handle_t)intf_ptr;
esp_err_t ret = i2c_master_transmit_receive(handle, ®_addr, 1, data, len, -1);
return (ret == ESP_OK) ? BMI3_OK : BMI3_E_COM_FAIL;
}
static int8_t bmi3_i2c_write(uint8_t reg_addr, const uint8_t *data, uint32_t len, void *intf_ptr)
{
i2c_master_dev_handle_t handle = (i2c_master_dev_handle_t)intf_ptr;
uint8_t buffer[len + 1];
buffer[0] = reg_addr;
memcpy(&buffer[1], data, len);
esp_err_t ret = i2c_master_transmit(handle, buffer, len + 1, -1);
return (ret == ESP_OK) ? BMI3_OK : BMI3_E_COM_FAIL;
}
static void bmi3_delay_us(uint32_t period, void *intf_ptr)
{
(void)intf_ptr;
esp_rom_delay_us(period);
}
static int8_t set_accel_config(struct bmi3_dev *dev);
static int8_t set_gyro_config(struct bmi3_dev *dev);
static float lsb_to_mps2(int16_t val, int8_t g_range, uint8_t bit_width);
static float lsb_to_dps(int16_t val, float dps, uint8_t bit_width);
int app_main(void)
{
struct bmi3_dev dev = {0};
int8_t rslt;
struct bmi3_sensor_data accel_data = {0};
struct bmi3_sensor_data gyro_data = {0};
float ax = 0, ay = 0, az = 0;
float gx = 0, gy = 0, gz = 0;
int16_t raw_ax = 0, raw_ay = 0, raw_az = 0;
int16_t raw_gx = 0, raw_gy = 0, raw_gz = 0;
// I2C Configuration
i2c_master_bus_config_t i2c_mst_config = {
.clk_source = I2C_CLK_SRC_DEFAULT,
.i2c_port = I2C_PORT_NUM_0,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_io_num = I2C_MASTER_SDA_IO,
.glitch_ignore_cnt = 7,
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_mst_config, &bus_handle));
i2c_device_config_t dev_cfg = {
.dev_addr_length = I2C_ADDR_BIT_LEN_7,
.device_address = BMI323_I2C_ADDR,
.scl_speed_hz = 100000,
};
ESP_ERROR_CHECK(i2c_master_bus_add_device(bus_handle, &dev_cfg, &dev_handle));
// Assign interface functions
dev.read = bmi3_i2c_read;
dev.write = bmi3_i2c_write;
dev.intf = BMI3_I2C_INTF;
dev.intf_ptr = dev_handle;
dev.delay_us = bmi3_delay_us;
dev.read_write_len = READ_WRITE_LEN;
rslt = bmi323_init(&dev);
if (rslt != BMI323_OK) {
printf("bmi323_init failed\n");
return rslt;
}
rslt = set_accel_config(&dev);
if (rslt != BMI323_OK) {
printf("set_accel_config failed\n");
return rslt;
}
rslt = set_gyro_config(&dev);
if (rslt != BMI323_OK) {
printf("set_gyro_config failed\n");
return rslt;
}
accel_data.type = BMI323_ACCEL;
gyro_data.type = BMI323_GYRO;
while (1) {
rslt = bmi323_get_sensor_data(&accel_data, 1, &dev);
if (rslt == BMI323_OK) {
raw_ax = accel_data.sens_data.acc.x;
raw_ay = accel_data.sens_data.acc.y;
raw_az = accel_data.sens_data.acc.z;
ax = lsb_to_mps2(raw_ax, 2, dev.resolution);
ay = lsb_to_mps2(raw_ay, 2, dev.resolution);
az = lsb_to_mps2(raw_az, 2, dev.resolution);
}
rslt = bmi323_get_sensor_data(&gyro_data, 1, &dev);
if (rslt == BMI323_OK) {
raw_gx = gyro_data.sens_data.gyr.x;
raw_gy = gyro_data.sens_data.gyr.y;
raw_gz = gyro_data.sens_data.gyr.z;
gx = lsb_to_dps(raw_gx, 2000.0f, dev.resolution);
gy = lsb_to_dps(raw_gy, 2000.0f, dev.resolution);
gz = lsb_to_dps(raw_gz, 2000.0f, dev.resolution);
}
printf("Accel => raw-> x=%d, y=%d, z=%d | mps2-> x=%4.2f, y=%4.2f, z=%4.2f || Gyro => raw-> x=%d, y=%d, z=%d | dps-> x=%4.2f, y=%4.2f, z=%4.2f\n",
raw_ax, raw_ay, raw_az, ax, ay, az, raw_gx, raw_gy, raw_gz, gx, gy, gz);
vTaskDelay(pdMS_TO_TICKS(1000));
}
return rslt;
}
static int8_t set_accel_config(struct bmi3_dev *dev)
{
int8_t rslt;
struct bmi3_sens_config config;
struct bmi3_map_int map_int = {0};
config.type = BMI323_ACCEL;
rslt = bmi323_get_sensor_config(&config, 1, dev);
if (rslt != BMI323_OK) return rslt;
map_int.acc_drdy_int = BMI3_INT1;
rslt = bmi323_map_interrupt(map_int, dev);
if (rslt != BMI323_OK) return rslt;
config.cfg.acc.odr = BMI3_ACC_ODR_100HZ;
config.cfg.acc.range = BMI3_ACC_RANGE_2G;
config.cfg.acc.bwp = BMI3_ACC_BW_ODR_QUARTER;
config.cfg.acc.avg_num = BMI3_ACC_AVG64;
config.cfg.acc.acc_mode = BMI3_ACC_MODE_NORMAL;
rslt = bmi323_set_sensor_config(&config, 1, dev);
return rslt;
}
static int8_t set_gyro_config(struct bmi3_dev *dev)
{
int8_t rslt;
struct bmi3_sens_config config;
struct bmi3_map_int map_int = {0};
config.type = BMI323_GYRO;
rslt = bmi323_get_sensor_config(&config, 1, dev);
if (rslt != BMI323_OK) return rslt;
map_int.gyr_drdy_int = BMI3_INT1;
rslt = bmi323_map_interrupt(map_int, dev);
if (rslt != BMI323_OK) return rslt;
config.cfg.gyr.odr = BMI3_GYR_ODR_100HZ;
config.cfg.gyr.range = BMI3_GYR_RANGE_2000DPS;
config.cfg.gyr.bwp = BMI3_GYR_BW_ODR_HALF;
config.cfg.gyr.avg_num = BMI3_GYR_AVG1;
config.cfg.gyr.gyr_mode = BMI3_GYR_MODE_NORMAL;
rslt = bmi323_set_sensor_config(&config, 1, dev);
return rslt;
}
static float lsb_to_mps2(int16_t val, int8_t g_range, uint8_t bit_width)
{
float half_scale = (float)((1UL << bit_width) / 2.0f);
return (GRAVITY_EARTH * val * g_range) / half_scale;
}
static float lsb_to_dps(int16_t val, float dps, uint8_t bit_width)
{
float half_scale = (float)((1UL << bit_width) / 2.0f);
return (dps / half_scale) * val;
}
]
this is my code to interface of bmi323 with esp32s3 this code work fine but after some time getting error long below
E (250477) i2c.master: I2C transaction unexpected nack detected
E (250477) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (250477) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
E (250487) i2c.master: I2C transaction unexpected nack detected
E (250487) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (250497) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
Accel => raw-> x=-2538, y=-2604, z=15898 | mps2-> x=-1.52, y=-1.56, z=9.52 || Gyro => raw-> x=-2, y=-7, z=-1 | dps-> x=-0.12, y=-0.43, z=-0.06
E (251517) i2c.master: I2C transaction unexpected nack detected
E (251517) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (251517) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
E (251527) i2c.master: I2C transaction unexpected nack detected
E (251527) i2c.master: s_i2c_synchronous_transaction(872): I2C transaction failed
E (251537) i2c.master: i2c_master_transmit_receive(1097): I2C transaction failed
Accel => raw-> x=-2538, y=-2604, z=15898 | mps2-> x=-1.52, y=-1.56, z=9.52 || Gyro => raw-> x=-2, y=-7, z=-1 | dps-> x=-0.12, y=-0.43, z=-0.06