7.1 Client Mode Reception (7-Bit Addressing)

The following section describes the sequence of events when using the I2C in Client mode reception.

  1. Host device issues a Start condition. Once the Start is detected, the client hardware sets the Start Condition Interrupt Flag (SCIF).
  2. Host transmits the 7-bit client address with R/W cleared.
  3. The received address is compared to the values in the I2CxADR registers.

    If the client is configured in 7-bit Addressing mode (no masking), the received address is independently compared to each of the I2CxADR0/1/2/3 registers. In 7-bit Addressing mode with masking, the received address is masked with the value of I2CxADR1 and I2CxADR3, and then compared to the value of I2CxADR0 and I2CxADR2.

    If a match occurs, the Client Mode Active (SMA) bit is set, the R/W bit information (bit ‘0’ of the matching address) is transferred to the Read Information (R) bit of the I2CxSTAT0 register, the Data (D) bit of the I2CxSTAT0 register is cleared, and the Address Interrupt Flag (ADRIF) bit is set. If the ABD is cleared, the matching address is copied into the I2CxADB0 register. If ABD is set, the matching address is copied into the receive buffer, I2CxRXB, setting the Receive Buffer Full (RXBF) and I2C Receive Interrupt Flag (I2CxRXIF) bits. I2CRXIF is a read-only bit, and must be cleared by setting the Clear Buffer (CLRBF) bit or reading I2CxRXB.

    If no address match occurs, the module stays idle.

  4. When ADRIF is set, if the Address Interrupt and Hold Enable (ADRIE) bit is set and the Clock Stretching Disable (CSD) bit is cleared, client hardware sets the Client Clock Stretching (CSTR) bit and the generic I2CxIF Flag bit. This allows time for the client to read either I2CxADB0 or I2CxRXB and selectively ACK/NACK based on the received address. When the client has finished processing the address, the software clears CSTR and ADRIF, which releases the clock and clears the I2CxIF bit.
  5. Host transmits the 9th clock pulse, and the client hardware transfers the value of the ACKDT bit onto the SDA line. If there are pending errors, such as a receive overflow, the client hardware automatically generates a NACK condition, NACKIF is set, and the module goes idle. The client hardware checks I2CxCNT. If I2CCNT = 0, the Byte Count Interrupt Flag (CNTIF) is set.
  6. Upon the falling edge of the 9th clock pulse, the Acknowledge Time Interrupt Flag (ACKTIF) bit is set, and if CSD = 0, the client hardware sets CSTR. This allows time for the client to read the address from either I2CxADB0 or I2CxRXB. Once complete, the client software clears CSTR to release the clock, and clears ACKTIF to continue communication.
  7. If the client transmits a NACK, the host hardware generates a Stop condition. The Stop Condition Interrupt Flag (PCIF) is set when the Stop condition is detected, and the client goes idle.

    If the client issued an ACK, the host transmits the first 7 bits of the 8-bit data byte.

  8. If previous data are still in the I2CxRXB register (RXBF = 1 and I2CRXIF = 1) when the first seven bits of the new byte are received into the Shift register, the CSTR bit is set, and the clock is stretched after the 7th falling edge of SCL. This allows the client software to read I2CxRXB, which clears the RXBF and I2CxRXIF bits, and prevents a receive buffer overflow. Once the RXBF bit is cleared, the software clears CSTR, which releases SCL.
  9. Host hardware transmits the 8th bit of the current data byte into the client’s receive Shift register, then the client hardware transfers the complete byte into I2CxRXB, sets the I2CxRXIF, the Data Write Interrupt and Hold Flag (WRIF), the Data (D), and the RXBF bits. I2CxCNT is decremented by one. If the Data Write Interrupt and Hold is enabled (WRIE = 1), the hardware sets CSTR, allowing time for client software to read I2CxRXB and decide the state of the ACKDT bit before clearing CSTR.
  10. Host transmits the 9th clock pulse. If there are pending errors, such as a receive overflow, the client hardware automatically generates a NACK sequence, NACKIF is set, and the module goes idle.

    If I2CxCNT is not ‘0’, the hardware transmits the value of the ACKDT bit as the ACK value to the host. It is up to the user to configure the ACKDT bit appropriately. In most cases, the ACKDT bit should be cleared, so that the host receives an ACK (logic low level on SDA during the 9th SCL pulse).

    If I2CxCNT = 0, the hardware transmits the value of the Acknowledge End of Count (ACKCNT) bit as the ACK value to the client. It is up to the user to properly define the ACKCNT bit. In most cases, this bit should be set, indicating a NACK condition. When the host hardware detects the NACK on the bus, the host hardware will also generate a Stop condition. If the ACKCNT bit is cleared, an ACK will be issued, and the host hardware will not automatically generate the Stop condition.

  11. Upon the falling edge of the 9th clock pulse, the ACKTIF bit is set, and if ACKTIE is also set, the generic I2CxIF bit is set, and if CSD is cleared, the client hardware sets CSTR. This allows time for the client to read the data from I2CxRXB. Once complete, the client software clears CSTR to release the clock, and clears ACKTIF to continue communication.
  12. Go to step 7 and continue until I2CxCNT = 0, or until the host issues a Stop condition.