SLUUCJ0 November 2023 BQ76907
The I2C serial communications interface in the BQ76907 device acts as a target device and supports rates up to 400 kHz with an optional CRC check. The BQ76907 initially powers up by default with CRC disabled, which is determined by the OTP settings factory programmed by TI. The host can change the CRC mode setting while in CONFIG_UPDATE mode, then the new setting takes effect upon exit of CONFIG_UPDATE mode.
The I2C device address (as an 8-bit value including target address and R/W bit) is set by default as 0x10 (write), 0x11 (read), which can be changed by the Settings:Configuration:I2C Address configuration setting.
The communications interface includes programmable timeout capability, with the internal I2C bus logic reset when an enabled timeout occurs:
An I2C write transaction is shown in I2C Write. Block writes are allowed by sending additional data bytes before the Stop. The I2C logic auto-increments the register address after each data byte. The shaded regions show when the device can clock stretch.
The CRC check is enabled by setting the Settings:Configuration:I2C Config[CRC] data memory bit. When enabled, the CRC is calculated as follows:
The CRC polynomial is x8 + x2 + x + 1, and the initial value is 0.
When the target detects an invalid CRC, the I2C target NACKs the CRC, which causes the I2C target to go to an idle state.
I2C Read with Repeated Start shows a read transaction using a Repeated Start. The shaded regions show when the device can clock stretch.
I2C Read without Repeated Start shows a read transaction where a Repeated Start is not used, for example if not available in hardware. For a block read, the controller ACKs each data byte except the last and continues to clock the interface. The I2C block auto-increments the register address after each data byte. The shaded regions show when the device can clock stretch.
When enabled, the CRC for a read transaction is calculated as follows:
The CRC polynomial is x8 + x2 + x + 1, and the initial value is 0.
When the controller detects an invalid CRC, the I2C controller NACKs the CRC, which causes the I2C target to go to an idle state.