Client Transmission

When the R/W bit of the incoming address byte is set and an address match occurs, the WR/ bit is set. The received address is loaded into the SSPxBUF register, and an ACK pulse is sent by the client on the ninth bit.

Following the ACK, client hardware clears the CKP bit and the SCL pin is held low (see Clock Stretching for more details). By stretching the clock, the host will be unable to assert another clock pulse until the client is done preparing the transmit data.

The transmit data must be loaded into the SSPxBUF register, which also loads the SSPSR register. Then the SCL pin will be released by setting the CKP bit. The eight data bits are shifted out on the falling edge of the SCL input. This ensures that the SDA signal is valid during the SCL high time.

The ACK pulse from the host receiver is latched on the rising edge of the ninth SCL input pulse. This ACK value is copied to the ACKSTAT bit. If ACKSTAT is set (NACK), then the data transfer is complete. In this case, when the NACK is latched by the client, the client goes Idle and waits for another occurrence of a Start condition. If the SDA line was low (ACK), the next transmit data must be loaded into the SSPxBUF register. Again, the SCL pin must be released by setting bit CKP.

An MSSP interrupt is generated for each data transfer byte. The SSPxIF bit must be cleared by software and the SSPxSTAT register is used to determine the status of the byte. The SSPxIF bit is set on the falling edge of the ninth clock pulse.