I using a BMI323 sensor with address 0x68 on the I2C bus and a custom-made nRF52832 dev kit. when I tried to send some commands to the sensor via I2C, it didn't work.
here is the code (the code is kinda big so I just posted the important parts:
// variable that contains all I2C configurations
static const struct i2c_dt_spec bmi323 = I2C_DT_SPEC_GET(DT_NODELABEL(bmi323));
/*!
* @brief This internal API reads I2C function map to COINES platform
*/
static BMI3_INTF_RET_TYPE bmi3_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr)
{
uint8_t device_addr = *(uint8_t*)intf_ptr;
(void)intf_ptr;
// burst read from the sensor
i2c_burst_read_dt(&bmi323, reg_addr, reg_data, len);
// although the best behaviour is to return one of the error codes defined in 'bmi3_defs.h"
// we will just return BMI3_INTF_RET_SUCCESS always for now
return BMI3_INTF_RET_SUCCESS;
}
/*!
* @brief This internal API writes I2C function map to COINES platform
*/
static BMI3_INTF_RET_TYPE bmi3_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, void *intf_ptr)
{
uint8_t device_addr = *(uint8_t*)intf_ptr;
(void)intf_ptr;
// burst write from the sensor
i2c_burst_write_dt(&bmi323, reg_addr, reg_data, len);
// although the best behaviour is to return one of the error codes defined in 'bmi3_defs.h"
// we will just return BMI3_INTF_RET_SUCCESS always for now
return BMI3_INTF_RET_SUCCESS;
}
here is the '.overlay' file:
// To get started, press Ctrl+Space to bring up the completion menu and view the available nodes.
// You can also use the buttons in the sidebar to perform actions on nodes.
// Actions currently available include:
// * Enabling / disabling the node
// * Adding the bus to a bus
// * Removing the node
// * Connecting ADC channels
// For more help, browse the DeviceTree documentation at https://docs.zephyrproject.org/latest/guides/dts/index.html
// You can also visit the nRF DeviceTree extension documentation at https://docs.nordicsemi.com/bundle/nrf-connect-vscode/page/guides/ncs_configure_app.html#devicetree-support-in-the-extension
&i2c0 {
status = "okay";
pinctrl-0 = <&i2c0_default>;
pinctrl-names = "default";
bmi323: bmi323@68{
compatible = "i2c-device";
reg = <0x68>;
label="bmi323";
};
};
&gpiote {
status = "okay";
};
&pinctrl {
i2c0_default: i2c0_default {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 0, 8)>, <NRF_PSEL(TWIM_SDA, 0, 7)>;
};
};
};
I grabbed my logic analyzer and noticed the following on the I2C bus:

even though the address is specified to be 0x68 in the '.overlay' file, the actual address sent is '0xD0' where
0xD0 = 0x68 << 1;
I don't know. Is it a bug, or am I doing something wrong?