
2001 Microchip Technology Inc.
DS30292C-page 89
PIC16F87X
9.2.18
MULTI -MASTER
COMMUNICATION,
BUS COLLISION, AND
BUS ARBITRATION
Multi-Master mode support is achieved by bus arbitra-
tion. When the master outputs address/data bits onto
the SDA pin, arbitration takes place when the master
outputs a
’
1
’
on SDA, by letting SDA float high and
another master asserts a
’
0
’
. When the SCL pin floats
high, data should be stable. If the expected data on
SDA is a
’
1
’
and the data sampled on the SDA pin =
’
0
’
,
a bus collision has taken place. The master will set the
Bus Collision Interrupt Flag, BCLIF and reset the I
2
C
port to its IDLE state (Figure 9-19).
If a transmit was in progress when the bus collision
occurred, the transmission is halted, the BF flag is
cleared, the SDA and SCL lines are de-asserted, and
the SSPBUF can be written to. When the user services
the bus collision Interrupt Service Routine, and if the
I
2
C bus is free, the user can resume communication by
asserting a START condition.
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 de-asserted, and the respective control bits in
the SSPCON2 register are cleared. When the user ser-
vices the bus collision Interrupt Service Routine, and if
the I
2
C bus is free, the user can resume communication
by asserting a START condition.
The master will continue to monitor the SDA and SCL
pins and if a STOP condition occurs, the SSPIF bit will
be set.
A write to the SSPBUF will start the transmission of
data at the first data bit, regardless of where the trans-
mitter left off when the bus collision occurred.
In Multi-Master mode, the interrupt generation on the
detection of START and STOP conditions allows the
determination of when the bus is free. Control of the I
2
C
bus can be taken when the P bit is set in the SSPSTAT
register, or the bus is idle and the S and P bits are
cleared.
FIGURE 9-19:
BUS COLLISION TIMING FOR TRANSMIT AND ACKNOWLEDGE
SDA
SCL
BCLIF
SDA released
by master
SDA line pulled low
by another source
Sample SDA. While SCL is high,
data doesn
’
t match what is driven
by the master.
Bus collision has occurred.
Set bus collision
interrupt
Data changes
while SCL = 0