29.2.5.1 Multi-Host Communication, Bus Collision and Bus Arbitration
Multi-Host mode support is achieved by bus arbitration. When the
host outputs address/data bits onto the SDA pin, arbitration takes place when the host
outputs a ‘1
’ on SDA, by letting SDA float high and
another host asserts a ‘0
’. When the SCL pin floats high, data may be
stable. If the expected data on SDA is a ‘1
’ and
the data sampled on the SDA pin is ‘0
’, then a bus collision has taken
place. The host will set the Bus Collision Interrupt Flag (BCLxIF) and reset the I2C port to its Idle state (see Figure 29-33).
If a Start, Repeated Start, Stop or Acknowledge condition was in progress when the bus collision occurred, the condition is aborted, the SDA and SCL lines are deasserted, and the respective control bits in the SSPxCON2 register are cleared. When software services the bus collision Interrupt Service Routine, and if the I2C bus is free, software can resume communication by asserting a Start condition.
The host will continue to monitor the SDA and SCL pins. If a Stop condition occurs, the SSPxIF bit will be set.
A write to the SSPxBUF will start the transmission of data at the first data bit, regardless of where the transmitter left off when the bus collision occurred.