24.5.2 Target Mode

Target Mode: After Dynamic Address is assigned, Perform Private Read and Write

typedef union I3C_TARGET_TRANSMIT_COMMAND_Tag
{
    struct
{
    uint32_t CMD_ATTR:3;
    uint32_t TID:3;
    uint32_t RESERVED:10;
    uint32_t DATA_LENGTH:16;    
}F;
uint32_t TransmitCommand;    
} I3C_TARGET_TRANSMIT_COMMAND_T;

I3C_TARGET_TRANSMIT_COMMAND_T cmd;
uint32_t receivedData[100];
uint16_t dataCount;


int main()
{  
/* Configure System Clock and I3C Clock Generator*/
   

   /*Enable Internal pull up which acts as Bus High Keeper*/ 
    _CNPUC4 = 1;
    _CNPUC5 = 1;    

//********************************************************************************/   
    I3C1CONbits.ON = 1 ;                           // I3C module enable
    I3C1CTRLEXTbits.DEVOPMOD = 1 ;                 // Target mode

    I3C1TGTPID = 0x12345678;                        // Write PIDDCR,INSTID PARTID
    I3C1TGTMIPIID = 0x00000559;                     // write PROVID,MIPIMFGID
    
    
    I3C1BUFTHLDbits.RXTHLD = 1;                     // Configure RX threshold to 4 levels
    I3C1INTSTACONbits.RXTHLDSTAEN = 1;              // Enable RX status 
    I3C1INTCONbits.RXTHLDINTEN = 1;                 // Enable Rx interrupt
    
    I3C1CNTRLbits.ENABLE = 1;                       // Enable I3C operation
    
/* Enable interrupt signal*/
    IFS11bits.I3C1GIF = 0;
    IEC11bits.I3C1GIE = 1;
    /* I3C operation in target mode will be enabled only after receiving 
     * Placeholder transfer from Controller.
     */   
    while(!I3C1CNTRLbits.ENABLE);           // wait for I3C to enter Target mode 
   
   /**************Target Private Write******************************/ 
    /*Write data to Transmit FIFO*/
    I3C1TXRXDATA = 0x5555AAA1;
    I3C1TXRXDATA = 0x5555AAA2;
    I3C1TXRXDATA = 0x5555AAA3;
    I3C1TXRXDATA = 0x5555AAA4;
    
    cmd.F.CMD_ATTR = 0;                         // Transmit Command
    cmd.F.DATA_LENGTH = 0x10;                   // Data length
    
    I3C1CMDQUE = cmd.TransmitCommand;           // Write to CMD queue 


    while(1);
    return 0;
}

void __attribute__((interrupt, no_auto_psv)) _I3C1Interrupt()
{ 
    if(I3C1INTSTAbits.RXTHLDSTA)                // Check if interrupt is for received data
    {        
        while((I3C1BUFLEVEL >> 16))             // Read all the data in RXFIFO
        {
            receivedData[dataCount++]= I3C1TXRXDATA;
        }
    }
    IFS11bits.I3C1GIF = 0;
}