34.6.2.3 I2C Bus State Logic

The Bus state logic includes several logic blocks that continuously monitor the activity on the I2C bus lines in all sleep modes with running GCLK_SERCOMx_CORE clocks. The start and stop detectors and the bit counter are all essential in the process of determining the current Bus state. The following figure illustrates how the Bus state is determined. Software can get the current Bus state by reading the Host Bus State bits in the Status register (STATUS.BUSSTATE). The value of STATUS.BUSSTATE in the following figure is shown in binary.

Figure 34-4. Bus State Diagram

The Bus state machine is active when the I2C host is enabled.

After the I2C host is enabled, the Bus state is UNKNOWN (0b00). From the UNKNOWN state, the bus will transition to IDLE (0b01) by either:
  • Forcing by writing 0b01 to STATUS.BUSSTATE
  • A Stop condition is detected on the bus
  • If the inactive bus time-out is configured for SMBus compatibility (CTRLA.INACTOUT) and a time-out occurs
Note: When a known Bus state is established, the Bus state logic will not re-enter the UNKNOWN state.

When the bus is IDLE, it is ready for a new transaction. If a Start condition is issued on the bus by another I2C host in a multi-host setup, the bus becomes BUSY (0b11). The bus re-enters IDLE either when a Stop condition is detected or when a time-out occurs (inactive bus time-out needs to be configured).

If a Start condition is generated internally by writing the Address bit group in the Address register (ADDR.ADDR) while IDLE, the OWNER state (0b10) is entered. If the complete transaction was performed without interference, in other words, arbitration was not lost, the I2C host can issue a Stop condition, which changes the Bus state back to IDLE.

However, if a packet collision is detected while in OWNER state, the arbitration is assumed lost and the Bus state becomes BUSY until a Stop condition is detected. A repeated Start condition changes the Bus state only if arbitration is lost while issuing a repeated start.

Note: Violating the protocol may cause the I2C to hang. If this happens, it is possible to recover from this state by a software Reset (CTRLA.SWRST = 1). See the CTRLA register from Related Links.