20.5.3.3 Bus Arbitration and Bus Collision

The bus arbitration supports the multi-host system operation. The wired-AND nature of the SDAx line permits arbitration. Arbitration takes place when the first host outputs ‘1’ on SDAx by letting the SDAx float high, and simultaneously, the second host outputs ‘0’ on SDAx by pulling SDAx low. The SDAx signal will go low. In this case, the second host has won bus arbitration. The first host has lost bus arbitration, and thus, has a bus collision.

For the first host, the expected data on SDAx is ‘1’, while the data sampled on SDAx is ‘0’. This is the definition of a bus collision.

The first host will set the BCL bit (I2CxSTAT1[10]) and generate an error (I2CxEIF) interrupt if the BCLDIE (I2CxINTC[15]) bit is enabled. The Host module will reset the I2C port to its Idle state.

In multi-host operation, the SDAx line must be monitored for arbitration to see if the signal level is the expected output level. This check is performed by the host logic, with the result placed in the BCL status bit.

The states where arbitration can be lost are:

  • Start condition
  • Repeated Start condition
  • Address, Data or Acknowledge bit
  • Stop condition