The 9th SCL pulse for any transferred address/data byte is reserved for the Acknowledge (ACK) sequence. During an Acknowledge sequence, the transmitting device relinquishes control of the SDA line to the receiving device. At this time, the receiving device must decide whether to pull the SDA line low (ACK) or allow the line to float high (NACK). Since the Acknowledge sequence is an active-low signal, pulling the SDA line low informs the transmitter that the receiver has successfully received the transmitted data.
0).
When a slave device receives a matching address, or a receiver receives valid data, the
ACKDT bit is cleared by user software to indicate an ACK. If
the slave does not receive a matching address, user software sets the ACKDT bit,
indicating a NACK. In Slave or Multi-Master modes, if the Address Interrupt and Hold
Enable (ADRIE) or Write Interrupt and Hold Enable (WRIE) bits are set, the clock is stretched after receiving a matching
address or after the 8th falling edge of SCL when a data byte is received. This allows
user software time to determine the ACK/NACK response to send
back to the transmitter.0). When
the I2CxCNT register reaches a zero value, the ACKCNT bit can be cleared (ACKCNT =
0), indicating an ACK, or ACKCNT can be
set (ACKCNT = 1), indicating a NACK. It is important to note that the
ACKCNT bit is only used when the I2CxCNT register is zero, otherwise the ACKDT bit is
used for ACK/NACK sequences.The Acknowledge Time Status (ACKT) bit indicates whether or not the bus is in an Acknowledge sequence. The ACKT bit is set during an ACK/NACK sequence on the 8th falling edge of SCL, and is cleared on the 9th rising edge of SCL, indicating that the bus is not in an ACK/NACK sequence.
Certain conditions will cause a NACK sequence to be sent automatically. A NACK sequence is generated by module hardware when any of the following bits are set:
The following figure shows ACK and NACK sequences.