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;
}