Datasheet

PIC14000
DS40122B-page 54 Preliminary 1996 Microchip Technology Inc.
FIGURE 7-17: OPERATION OF THE I
2
C IN IDLE_MODE, RCV_MODE OR XMIT_MODE
IDLE_MODE (7-bit):
if (Addr_match) { Set interrupt;
if (R/W
= 1) { Send ACK = 0;
set XMIT_MODE;
}
else if (R/W
= 0) set RCV_MODE;
}
RCV_MODE:
if ((I2CBUF=Full) OR (I
2
COV = 1))
{ Set I
2
COV;
Do not acknowledge;
}
else { transfer I
2
CSR I
2
CBUF;
send ACK
= 0;
}
Receive 8-bits in I
2
CSR;
Set interrupt;
XMIT_MODE:
While ((I2CBUF = Empty) AND (CKP=0)) Hold SCL Low;
Send byte;
Set interrupt;
if (ACK
Received = 1) { End of transmission;
Go back to IDLE_MODE;
}
else if (ACK
Received = 0) Go back to XMIT_MODE;
IDLE_MODE (10-Bit):
If (High_byte_addr_match AND (R/W
= 0))
{ PRIOR_ADDR_MATCH = FALSE;
Set interrupt;
if ((I2CBUF = Full) OR ((I2COV = 1))
{ Set I2COV;
Do not acknowledge;
}
else { Set UA = 1;
Send ACK
= 0;
While (I2CADD not updated) Hold SCL low;
Clear UA = 0;
Receive Low_addr_byte;
Set interrupt;
Set UA = 1;
If (Low_byte_addr_match)
{ PRIOR_ADDR_MATCH = TRUE;
Send ACK
= 0;
while (I2CADD not updated) Hold SCL low;
Clear UA = 0;
Set RCV_MODE;
}
}
}
else if (High_byte_addr_match AND (R/W
= 1)
{ if (PRIOR_ADDR_MATCH)
{ send ACK
= 0;
set XMIT_MODE;
}
else PRIOR_ADDR_MATCH = FALSE;
}