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