23.6.8 Client Transmission (10-bit Address)

Client Transmission (10-bit Address)

#include <xc.h>

#define INIT                                0
#define ADDRESS_PHASE_UPPER_10BIT_WRITE     1
#define ADDRESS_PHASE_LOWER_10BIT           2
#define RESTART                             3
#define ADDRESS_PHASE_UPPER_10BIT_READ      4
#define DATA_READ                           5

#define mCLIENT_ADDRESS 0x14C

volatile unsigned char gReceived[256], gRcv_count, gTrans_count, count = 0;


int main(void) {
    /*Configure I2C pins as digital*/





    /*I2C1 configured as client*/

    I2C1ADD = mCLIENT_ADDRESS; // Configure Client address
    I2C1INTCbits.CADDRIE = 1; // Assert CLTIF on address detect
    I2C1INTCbits.CDRXIE = 1; // Assert CLTIF on received byte
    I2C1INTCbits.CDTXIE = 1; // Assert CLTIF on transmit byte
    I2C1INTCbits.CLTIE = 1; // Assert I2CxIF when CLTIF is asserted

    I2C1CON2bits.SMEN = 1; // Enable smart mode
    I2C1CON2bits.PSZ = 10; // Packet size					  

    I2C1CON1bits.A10M = 1; // 10bit addressing			 
    I2C1CON1bits.ON = 1; // Enable I2C			 



    while (1);
}

void __attribute__((__interrupt__, no_auto_psv)) _I2C1Interrupt(void) {

    IFS2bits.I2C1IF = 0;
    /* Read received address*/
    if ((I2C1STAT1bits.RBF)&& (!I2C1STAT1bits.D_A)) {
        gTrans_count = 0;
        gRcv_count = 0;
        gReceived[gRcv_count] = I2C1RCV;
        gRcv_count++;

    }/* Read received data byte*/
    else if ((I2C1STAT1bits.RBF)&& (I2C1STAT1bits.D_A)) {
        gReceived[gRcv_count] = I2C1RCV;
        gRcv_count++; // Read received data

    }
    /* transmit byte if R_W is set */
    if ((I2C1STAT1bits.R_W) &&(!I2C1STAT1bits.ACKSTAT)) {
        I2C1TRN = gTrans_count++; // transmit data

    }
}