NCS 1.8 i2c can't get ACK (NACK), but old softdevices(SDK17) work well.

hardware: my test nrf52833 board

sensor:mpu6050 (I2C)

1、overlay file:

...

&i2c0 {
    status = "okay";
    sda-pin = <20>;
    scl-pin = <22>;
    compatible = "nordic,nrf-twi";
};
...
2、prj.conf file:
...
CONFIG_I2C=y
...
3、I2C write function:
int portI2cWriteBytes(uint8_t device_i2c_addr, uint8_t reg_addr, uint8_t *data, uint32_t num_bytes)
{
	uint8_t wr_addr[2];
	struct i2c_msg msgs[2];

	/* address */
	wr_addr[0] = (reg_addr >> 8) & 0xFF;
	wr_addr[1] = reg_addr & 0xFF;

	/* Send the address to write to */
	msgs[0].buf = wr_addr;
	msgs[0].len = 2U;
	msgs[0].flags = I2C_MSG_WRITE;

	/* Data to be written, and STOP after this. */
	msgs[1].buf = data;
	msgs[1].len = num_bytes;
	msgs[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;

	return i2c_transfer(i2c0_dev, &msgs[0], 2, device_i2c_addr/*0x68*/);
}
4、I2C read function:
int portI2cReadBytes(uint8_t device_i2c_addr, uint8_t reg_addr, uint8_t *data, uint32_t num_bytes)
{
	uint8_t wr_addr[2];
	struct i2c_msg msgs[2];

	wr_addr[0] = (reg_addr >> 8) & 0xFF;
	wr_addr[1] = reg_addr & 0xFF;

	/* Send the address to read from */
	msgs[0].buf = wr_addr;
	msgs[0].len = 2U;
	msgs[0].flags = I2C_MSG_WRITE;

	/* Read from device. STOP after this. */
	msgs[1].buf = data;
	msgs[1].len = num_bytes;
	msgs[1].flags = I2C_MSG_READ | I2C_MSG_STOP;

	return i2c_transfer(i2c0_dev, &msgs[0], 2, device_i2c_addr);
}
Question:
I use logic analyzer to trace, capture image like this, I can not get ACK. 
But I use nrf52832(SDK17) can get ACK like this, so mpu6050 is OK.
Related