APB I2C SLAVE
The I2C slave enables the CORE-V-MCU to interact with an external I2C master device by responding to transactions on an I2C bus.
Features
Bidirectional communication between I2C and APB interfaces
Configurable I2C device address (7-bit)
- Adjustable timing parameters for I2C operation:
Debounce length
SCL delay length
SDA delay length
- Dual communication modes:
Single-byte messaging with status tracking
FIFO-based data transfer for bulk transfer (up to 256 bytes in each direction)
- Comprehensive interrupt support:
Programmable interrupt conditions based on FIFO status flags
Separate interrupt paths for I2C and APB interfaces
- FIFO management features:
256-byte FIFO depth for each direction
Read and write flags to monitor FIFO status.
FIFO flush capability
I2C enable/disable control
Block Architecture
I2C slave contains i2c peripheral interface and APB slave interface. There are FIFOs and registers for handling communication with external I2C controllers.
The figure below is a high-level block diagram of the I2C Slave:-

I2C Slave Block Diagram
Below is a brief description of the 3 sub-modules:
APB SLAVE INTERFACE:
Responsible for APB communication: passing information to and from the I2C CSR module.
I2C PERIPHERAL CSRs:
The I2C peripheral CSR assigns values to CSRs and drives the interrupt port for APB and I2C. It takes input from the APB slave interface and the I2C interface.
This module instantiates two FIFOs:
FIFO_sync_256x8_i2c_to_apb: Transfers data from I2C to APB.
FIFO_sync_256x8_apb_to_i2c: Transfers data from APB to I2C.
I2C PERIPHERAL INTERFACE:
It handles all I2C protocol operations, including detecting start/stop conditions, address recognition, data transmission/reception, sending ACK/NACK signals, and managing SDA and SCL timing with line filtering. It passes information to and from the I2C CSR module.
I2C STATES:

I2C Slave FSM Diagram
I2C slave has 10 states:
ST_IDLE: - Initially, the slave is in this state. - The slave may also return to this state if a STOP condition is detected.
ST_DEVADDR: - The slave enters this state after detecting the START sequence and when I2C is enabled through the I2C enable CSR. - The slave receives the device address and transfer type (read/write). - The transfer stops if the received device address does not match the configured address in the I2C device address CSR.
ST_DEVADDRACK: - The slave enters this state after receiving the I2C device address and sends an acknowledgment. - i2c_sda_o is driven low to indicate a successful acknowledgement. - The acknowledgment is released by driving i2c_sda_o high before a new transfer. - A read operation sets the I2C state to ST_REGRDATA. - A write operation sets the I2C state to ST_REGADDR.
ST_REGADDR: - If the master wants to write, the slave comes to this state. - The slave receives the CSR address inside the device where the master wants to write.
ST_REGADDRACK: - After successfully receiving the CSR address, the slave enters this state and sends an acknowledgment. - i2c_sda_o is driven low to indicate a successful acknowledgement. - The acknowledgment is released by driving i2c_sda_o high before a new transfer.
ST_REGWDATA: - After sending an acknowledgment, the slave enters this state and writes data to the CSR.
ST_REGWDATAACK: - After successfully writing the data, an acknowledgment bit is sent. - i2c_sda_o is driven low to indicate a successful acknowledgment. - The acknowledgment is released by driving i2c_sda_o high before a new transfer.
ST_REGRDATA: - The slave enters this state if the master wants to read data. - The slave device places the data from the last addressed CSR onto the i2c_sda_o line.
ST_REGRDATAACK: - After a successful read, an acknowledgment is received. - If a negative acknowledgment is received, the transfer stops. - If a successful acknowledgement is received, then I2C state is set to ST_REGRDATA, and more data is read.
ST_WTSTOP: - The slave enters this state if there are no more transactions or if the transfer is to be stopped.
System Architecture
The figure below depicts the connections between the I2C Slave and rest of the modules in CORE-V-MCU:-

I2C Slave CORE-V-MCU connections diagram
Programming View Model
FIFO Usage
The module employs two First-In, First-Out (FIFO) buffers to handle burst data transfer between the APB and I2C interfaces.
- I2C-to-APB FIFO:
Buffers data received from the I2C interface before it’s read by the APB interface.
The I2C master needs to write data on the FIFO_I2C_TO_APB_WRITE_DATA_PORT CSR, which is then pushed on this FIFO.
The APB master can then read the FIFO_I2C_TO_APB_READ_DATA_PORT CSR in order to retrieve the data, which is then popped from the FIFO.
There are read and write flag registers showing the current status of FIFO and can be accessed by both I2C and APB interfaces.
- APB-to-I2C FIFO:
Buffers data written by the APB interface before it’s transmitted via the I2C interface.
The APB master needs to write data on the FIFO_APB_TO_I2C_WRITE_DATA_PORT CSR, which is then pushed on this FIFO.
The I2C master can then read the FIFO_APB_TO_I2C_READ_DATA_PORT CSR in order to retrieve the data, which is then popped from the FIFO.
There are read and write flag registers showing the current status of FIFO and can be accessed by both I2C and APB interfaces.
For details, please refer to the ‘Firmware Guidelines’.
Data Flow
- Write Operation from I2C Master and Read from APB Master:
I2C Master sends START condition(drives SDA line low when SCL is high)
I2C Master sends device address with write bit (0)
Slave acknowledges
- I2C Master sends CSR address
MSG_I2C_TO_APB CSR for single byte
FIFO_I2C_TO_APB_WRITE_DATA_PORT CSR for multi-byte transfer
Slave acknowledges
I2C Master sends data byte
Slave acknowledges
I2C Master may send more data bytes with acknowledgment after each, or send STOP condition
Flags and interrupt signals are updated accordingly.
- The APB master can read the data from the appropriate CSR
MSG_I2C_TO_APB for single byte message
FIFO_I2C_TO_APB_READ_DATA_PORT CSR for multi-byte transfer
Flags and interrupt signals are updated accordingly.
- Write Operation from APB Master and Read from I2C Master:
- The APB master will write data on the appropriate CSR
MSG_APB_TO_I2C for single byte message
FIFO_APB_TO_I2C_WRITE_DATA_PORT CSR for multi-byte transfer
Flags and interrupt signals are updated accordingly.
I2C Master sends START condition
I2C Master sends device address with write bit (0)
Slave acknowledges
- I2C Master sends CSR address
MSG_APB_TO_I2C for single byte message
FIFO_APB_TO_I2C_READ_DATA_PORT CSR for multi-byte transfer
Slave acknowledges
I2C Master sends repeated START
I2C Master sends device address with read bit (1)
Slave acknowledges
Slave sends data byte
I2C Master sends ACK to request more data or NACK to indicate last byte
I2C Master sends STOP condition
Flags and interrupt signals are updated accordingly.
For details, please refer to the ‘Firmware Guidelines’.
Interrupt Generation
The I2C Slave provides interrupt generation for both APB and I2C interfaces.
- The i2c_interrupt goes to the external I2C master device, and is generated in the following conditions:
The availability of a new single-byte message from the APB to I2C.
The write flags of the I2C-to-APB FIFO reaching certain levels (e.g., FIFO becoming full), indicating how much space is currently available in FIFO.
The read flags of the APB-to-I2C FIFO reaching certain levels (e.g., FIFO becoming empty), indicating how much items APB master had written that the I2C master still has to process.
Interrupts can be triggered for 8 different levels of both read and write flags, and these interrupt sources can be selectively enabled.
- The apb_interrupt goes to the core complex block of CORE-V-MCU, and is generated in the following conditions:
The availability of a new single-byte message from the I2C to APB.
The write flags of the APB-to-I2C FIFO reaching certain levels (e.g., FIFO becoming full), indicating how much space is currently available in FIFO.
The read flags of the I2C-to-APB FIFO reaching certain levels (e.g., FIFO becoming empty), indicating how much items I2C master had written that the APB master still has to process.
Interrupts can be triggered for 8 different levels of both read and write flags, and these interrupt sources can be selectively enabled.
For details, please refer to the ‘Firmware Guidelines’.
APB I2C Slave CSRs:
The CSRs of the I2C slave are 8 bit registers mapped to a 32 bit APB data bus, the same CSRs can be accessed by the I2C interface as well. Since the APB bus is of 32 bit, the APB addresses are 4x the I2C addresses.
I2CS_DEV_ADDRESS
APB Offset: 0x0
I2C Offset: 0x0
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:7 |
– |
– |
0x0 |
Reserved |
SLAVE_ADDR |
6:0 |
RW |
RO |
0X6F |
I2C device address |
I2CS_ENABLE
APB Offset: 0X4
I2C Offset: 0x1
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:1 |
– |
– |
0x0 |
Reserved |
IP_ENABLE |
0:0 |
RW |
RO |
0X00 |
IP enabling bit |
I2CS_DEBOUNCE_LENGTH
APB Offset: 0x8
I2C Offset: 0x2
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
DEB_LEN |
7:0 |
RW |
RO |
0X14 |
Represents the number of system clocks over which each I2C line (SL and SDA) should be debounced. |
I2CS_SCL_DELAY_LENGTH
APB Offset: 0xC
I2C Offset: 0x3
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
SCL_DLY_LEN |
7:0 |
RW |
RO |
0X14 |
Represents the number of system clocks over which the SCL line will be delayed relative to SDA line |
I2CS_SDA_DELAY_LENGTH
APB Offset: 0x10
I2C Offset: 0x4
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
SDA_DLY_LEN |
7:0 |
RW |
RO |
0X08 |
Represents the number of system clocks over which the SDA line will be delayed relative to the SCL line. |
MSG_I2C_TO_APB
APB Offset: 0x40
I2C Offset: 0x10
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
I2C_TO_APB |
7:0 |
RO |
RW |
0X0 |
This CSR provide a method for passing a single byte message from the I2C interface to the APB interface. |
MSG_I2C_TO_APB_STATUS
APB Offset: 0x44
I2C Offset: 0x11
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:1 |
– |
– |
0x0 |
|
I2C_TO_APB_STATUS |
0:0 |
RO |
RO |
0X0 |
This CSR indicates if a single byte message is available from I2C to APB. |
MSG_APB_TO_I2C
APB Offset: 0x48
I2C Offset: 0x12
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
APB_TO_I2C |
7:0 |
RW |
RO |
0X0 |
This CSR provides a method for passing a single byte message from the APB interface to the I2C interface. |
MSG_APB_I2C_STATUS
APB Offset: 0x4C
I2C Offset: 0x13
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:1 |
– |
– |
0x0 |
|
APB_TO_I2C_STATUS |
0:0 |
RO |
RO |
0X0 |
This CSR indicates if a single byte message is available from APB to I2C. |
FIFO_I2C_TO_APB_WRITE_DATA_PORT
APB Offset: 0x80
I2C Offset: 0x20
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
I2C_APB_WRITE_DA TA_PORT |
31:0 |
– |
WO |
0x0 |
This is the write data port for the I2C to APB fifo. |
FIFO_I2C_TO_APB_READ_DATA_PORT
APB Offset: 0x084
I2C Offset: 0x21
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
I2C_APB_READ_DA TA_PORT |
31:0 |
RO |
– |
0x0 |
This is the read data port for the I2C to APB fifo. |
FIFO_I2C_TO_APB_FLUSH
APB Offset: 0x088
I2C Offset: 0x22
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:1 |
– |
– |
0x0 |
RESERVED |
ENABLE |
0:0 |
RW |
RW |
0x0 |
Writing a 1 to this CSR bit will flush the I2CtoAPB FIFO clearing all the contents and rendering the FIFO to be empty. |
FIFO_I2C_TO_APB_WRITE_FLAGS
APB Offset: 0x08C
I2C Offset: 0x23
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
RESERVED |
FLAGS |
2:0 |
RO |
RO |
0x0 |
Represent the number of spaces left in FIFO. |
FIFO_I2C_TO_APB_READ_FLAGS
APB Offset: 0x90
I2C Offset: 0x24
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
RESERVED |
FLAGS |
2:0 |
RO |
RO |
0x0 |
Represent the items present in FIFO to read. |
FIFO_APB_TO_I2C_WRITE_DATA_PORT
APB Offset: 0XC0
I2C Offset: 0x30
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
I2C_APB_WRITE_DA TA_PORT |
31:0 |
WO |
– |
0x0 |
This is the write data port for the APBtoI2C FIFO |
FIFO_APB_TO_I2C_READ_DATA_PORT
APB Offset: 0XC4
I2C Offset: 0x31
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
I2C_APB_READ_DA TA_PORT |
31:0 |
– |
RO |
0x0 |
This is the read data port for the APBtoI2C FIFO |
FIFO_APB_TO_I2C_FLUSH
APB Offset: 0XC8
I2C Offset: 0x32
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:1 |
– |
– |
0x0 |
RESERVED |
ENABLE |
0:0 |
RW |
RW |
0x0 |
Writing a 1 to this CSR bit will flush the APBtoI2C FIFO, clearing all contents and rendering the FIFO to be empty. |
FIFO_APB_TO_I2C_WRITE_FLAGS
APB Offset: 0XCC
I2C Offset: 0x33
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
|
FLAGS |
2:0 |
RO |
RO |
0x0 |
Represent number of spaces left in FIFO |
FIFO_APB_TO_I2C_READ_FLAGS
APB Offset: 0XD0
I2C Offset: 0x34
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
|
FLAGS |
2:0 |
RO |
RO |
0x0 |
Represent the items present in FIFO to read. |
I2C_INTERRUPT_STATUS
APB Offset: 0x100
I2C Offset: 0x40
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
Reserved |
I2C_APB_F IFO_WRITE_STATUS |
2:2 |
RO |
RO |
0x0 |
1: Interrupt is generated for this field 0: Not genertated |
APB_I2C_F IFO_READ_STATUS |
1:1 |
RO |
RO |
0x0 |
1: Interrupt is generated for this field 0: Not genertated |
APB_I2C_M ESSAGE_AVAILABLE |
0:0 |
RO |
RO |
0x0 |
1: Interrupt is generated for this field 0: Not genertated |
I2C_INTERRUPT_ENABLE
APB Offset: 0x104
I2C Offset: 0x41
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
Reserved |
I2C_A PB_FIFO_WRITE_S TATUS_INT_ENABLE |
2:2 |
RO |
RW |
0x0 |
1: enabled |
APB_I2C_F IFO_READ_S TATUS_INT_ENABLE |
1:1 |
RO |
RW |
0x0 |
1: enabled |
APB_I2C_M ESSAGE_AVAI LABLE_INT_ENABLE |
0:0 |
RO |
RW |
0x0 |
1: enabled |
INTERRUPT_FIFO_I2C_TO_APB_WRITE_FLAGS_SELECT
APB Offset: 0x108
I2C Offset: 0x42
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
WRITE_FLAG_FULL |
7:7 |
RO |
RW |
0x0 |
1:The write FIFO is full |
WRITE_FL AG_1_SPACE_AVAIL |
6:6 |
RO |
RW |
0x0 |
1: one space left |
WRITE_FLAG _2_3_SPACE_AVAIL |
5:5 |
RO |
RW |
0x0 |
1: 2-3 spaces left |
WRITE_FLAG _4_7_SPACE_AVAIL |
4:4 |
RO |
RW |
0x0 |
1: 4-7 spaces left |
WRITE_FLAG _8_31_SPACE_AVAIL |
3:3 |
RO |
RW |
0x0 |
1: 8-31 spaces left |
WRITE_FLAG_3 2_63_SPACE_AVAIL |
2:2 |
RO |
RW |
0x0 |
1: 32-63 spaces left |
WRITE_FLAG_64 _127_SPACE_AVAIL |
1:1 |
RO |
RW |
0x0 |
1: 64-127 spaces left |
WRITE_FLAG_1 28__SPACE_AVAIL |
0:0 |
RO |
RW |
0x0 |
1: 128+ spaces left |
INTERRUPT_FIFO_APB_TO_I2C_READ_FLAGS_SELECT
APB Offset: 0x10C
I2C Offset: 0x43
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
READ_FLAG _128_SPACE_AVAIL |
7:7 |
RO |
RW |
0x0 |
1: 128 items present |
READ_FLAG_64 _127_SPACE_AVAIL |
6:6 |
RO |
RW |
0x0 |
1: 64-127 items to read |
READ_FLAAG_3 2_63_SPACE_AVAIL |
5:5 |
RO |
RW |
0x0 |
1: 32-63 items present |
READ_FLAG_8 _31_SPACE_AVAIL |
4:4 |
RO |
RW |
0x0 |
1: 8-31 items |
READ_FLAG _4_7_SPACE_AVAIL |
3:3 |
RO |
RW |
0x0 |
1: 4-7 items |
READ_FLAG _2_3_SPACE_AVAIL |
2:2 |
RO |
RW |
0x0 |
1: 2-3 items |
READ_FL AG_1_SPACE_AVAIL |
1:1 |
RO |
RW |
0x0 |
1: 1 item |
READ_FLAG_EMPTY |
0:0 |
RO |
RW |
0x0 |
1: 0 items, empty |
APB_INTERRUPT_STATUS
APB Offset: 0x140
I2C Offset: 0x50
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
Reserved |
APB_I2C_F IFO_WRITE_STATUS |
2:2 |
RO |
RO |
0x0 |
Interrupt status representing whether interrupt will generate or not. 1: Interrupt generated |
I2C_APB_F IFO_READ_STATUS |
1:1 |
RO |
RO |
0x0 |
Interrupt status representing whether interrupt will generate or not. 1: Interrupt generated |
NEW_I 2C_APB_MSG_AVAIL |
0:0 |
RO |
RO |
0x0 |
Interrupt status representing whether interrupt will generate or not. 1: Interrupt generated |
APB_INTERRUPT_ENABLE
APB Offset: 0x0144
I2C Offset: 0x51
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
RESERVED |
7:3 |
– |
– |
0x0 |
Reserved |
APB_I2C_FIFO_WRI TE_STATUS_ENABLE |
2:2 |
RW |
RO |
0x0 |
1: enabled |
I2C_APB_FIFO_RE AD_STATUS_ENABLE |
1:1 |
RW |
RO |
0x0 |
1: enabled |
NEW_I2C_APB_M SG_AVAIL_ENABLE |
0:0 |
RW |
RO |
0x0 |
1: enabled |
INTERRUPT_FIFO_APB_TO_I2C_WRITE_FLAGS_SELECT
APB Offset: 0x148
I2C Offset: 0x52
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
WRITE_FLAG_FULL |
7:7 |
RW |
RO |
0x0 |
1 : The Write FIFO is full |
WRITE_FL AG_1_SPACE_AVAIL |
6:6 |
RW |
RO |
0x0 |
1: one space left |
WRITE_FLAG _2_3_SPACE_AVAIL |
5:5 |
RW |
RO |
0x0 |
1: 2-3 spaces left |
WRITE_FLAG _4_7_SPACE_AVAIL |
4:4 |
RW |
RO |
0x0 |
1: 4-7 spaces left |
WRITE_FLAG_8 _31_SPACE_AVAIL |
3:3 |
RW |
RO |
0x0 |
1: 8-31 spaces left |
WRITE_FLAG_3 2_63_SPACE_AVAIL |
2:2 |
RW |
RO |
0x0 |
1: 32-63 spaces left |
WRITE_FLAG_64 _127_SPACE_AVAIL |
1:1 |
RW |
RO |
0x0 |
1: 64-127 spaces left |
WRITE_FLAG _128_SPACE_AVAIL |
0:0 |
RW |
RO |
0x0 |
1: 128+ spaces left |
INTERRUPT_FIFO_I2C_TO_APB_READ_FLAGS_SELECT
APB Offset: 0x14C
I2C Offset: 0x53
Field |
Bits |
APB access type |
I2C access type |
Default |
Description |
---|---|---|---|---|---|
READ_FLAG _128_SPACE_AVAIL |
7:7 |
RW |
RO |
0x0 |
1: 128 items present |
READ_FLAG_64 _127_SPACE_AVAIL |
6:6 |
RW |
RO |
0x0 |
1: 64 - 127 items present |
READ_FLAG_3 2_63_SPACE_AVAIL |
5:5 |
RW |
RO |
0x0 |
1: 32-63 items present |
READ_FLAG_8 _31_SPACE_AVAIL |
4:4 |
RW |
RO |
0x0 |
1: 8-31 items present |
READ_FLAG _4_7_SPACE_AVAIL |
3:3 |
RW |
RO |
0x0 |
1: 4-7 items present |
READ_FLAG _2_3_SPACE_AVAIL |
2:2 |
RW |
RO |
0x0 |
1: 2-3 items present |
READ_FL AG_1_SPACE_AVAIL |
1:1 |
RW |
RO |
0x0 |
1: 1 item present |
READ_FLAG_EMPTY |
0:0 |
RW |
RO |
0x0 |
1: 0 items, empty |
Firmware Guidelines
Initialization:
Set the I2C device address in the I2C device address CSR.
Configure appropriate debounce and delay values for SCL and SDA lines through I2CS_DEBOUNCE_LENGTH, I2CS_SCL_DELAY_LENGTH and I2CS_SDA_DELAY_LENGTH registers.
Enable the I2C interface by writing 1 to the I2C enable CSR.
Single-Byte Communication:
- APB to I2C:
APB master writes data to MSG_APB_TO_I2C CSR.
Status bit in MSG_APB_TO_I2C_STATUS CSR is set by hardware.
Output interrupt i2c_interrupt_o is raised if the interrupt is enabled in the I2C_INTERRUPT_ENABLE CSR and associated bit in I2C_INTERRUPT_STATUS is set.
I2C master reads CSR MSG_APB_TO_I2C to retrieve data.
Status bit in MSG_APB_TO_I2C_STATUS and I2C_INTERRUPT_STATUS is cleared by hardware and the interrupt is lowered.
- I2C to APB:
I2C master writes data to MSG_I2C_TO_APB CSR.
Status bit in MSG_I2C_TO_APB_STATUS CSR is set by hardware.
Output interrupt apb_interrupt_o is raised if the interrupt is enabled in the APB_INTERRUPT_ENABLE CSR and associated bit in APB_INTERRUPT_STATUS is set.
APB master reads MSG_I2C_TO_APB CSR to retrieve data.
Status bit in MSG_I2C_TO_APB_STATUS and APB_INTERRUPT_STATUS is cleared by hardware and the interrupt is lowered.
FIFO-Based Communication:
- APB to I2C:
APB master writes data to FIFO_APB_TO_I2C_WRITE_DATA_PORT CSR.
The data is pushed in the APB to I2C FIFO by the hardware.
FIFO status is reflected in FIFO_APB_TO_I2C_WRITE_FLAGS CSR.
Interrupt can be generated based on FIFO status.
I2C master reads data from FIFO_APB_TO_I2C_READ_DATA_PORT CSR.
The data is popped from the APB to I2C FIFO by the hardware.
FIFO status is updated in FIFO_APB_TO_I2C_READ_FLAGS CSR.
- I2C to APB:
I2C master writes data to FIFO_I2C_TO_APB_WRITE_DATA_PORT CSR.
The data is pushed in the I2C to APB FIFO by the hardware.
FIFO status is reflected in FIFO_I2C_TO_APB_WRITE_FLAGS CSR.
Interrupt can be generated based on FIFO status.
APB master reads data from FIFO_I2C_TO_APB_READ_DATA_PORT CSR.
The data is popped from the I2C to APB FIFO by the hardware.
FIFO status is updated in FIFO_I2C_TO_APB_READ_FLAGS CSR.
FIFO Management:
FIFOs can be flushed by writing 1 to FIFO_I2C_TO_APB_FLUSH CSR(I2C to APB FIFO) or FIFO_APB_TO_I2C_FLUSH (APB to I2C FIFO).
Monitor FIFO read amd write status flags to prevent overflow/underflow conditions.
- Interrupts can be set to trigger for different conditions based on the read and write flags.
The below table describes the different meanings of the READ flags and how bit numbers to set in INTERRUPT_FIFO_I2C_TO_APB_READ_FLAGS_SELECT(I2C to APB FIFO) or INTERRUPT_FIFO_APB_TO_I2C_READ_FLAGS_SELECT(APB to I2C FIFO) CSR to generate interrupt.
Flag Value
Description
Select Bit in Register
0b000
Trigger if FIFO Empty
0
0b001
Trigger if 1 item present
1
0b010
Trigger if 2-3 items present
2
0b011
Trigger if 4-7 items present
3
0b100
Trigger if 8-31 items present
4
0b101
Trigger if 32-63 items present
5
0b110
Trigger if 63-127 items present
6
0b111
Trigger if 127+ items present
7
The below table describes the different meanings of the WRITE flags and how bit numbers to set in INTERRUPT_FIFO_I2C_TO_APB_WRITE_FLAGS_SELECT(I2C to APB FIFO) or INTERRUPT_FIFO_APB_TO_I2C_WRITE_FLAGS_SELECT(APB to I2C FIFO) CSR to generate interrupt.
Flag Value
Description
Select Bit in Register
0b000
Trigger if 128+ space available
0
0b001
Trigger if 64-127 space available
1
0b010
Trigger if 32-63 space available
2
0b011
Trigger if 8-31 space available
3
0b100
Trigger if 4-7 space available
4
0b101
Trigger if 2-3 space available
5
0b110
Trigger if 1 space available
6
0b111
Trigger if FIFO Full
7
Interrupt Handling
Read the interrupt status CSR (I2C_INTERRUPT_STATUS for I2C interrupts, APB_INTERRUPT_STATUS for APB interrupts).
- Determine the interrupt source:
Bit 0: New message available
Bit 1: FIFO read flags match specified pattern
Bit 2: FIFO write flags match specified pattern
Service the interrupt by reading/writing appropriate data.
Interrupts are automatically cleared when the condition is resolved.
Pin Diagram
The figure below represents the input and output pins for the I2C Slave:-

I2C Slave Pin Diagram
Clock and Reset Signals
apb_pclk_i: System clock input
apb_presetn_i: Active-low reset input
APB Interface Signals
apb_paddr_i[11:0]: APB address bus input
apb_psel_i: APB peripheral select input
apb_penable_i: APB enable input
apb_pwrite_i: APB write control input (high for write, low for read)
apb_pwdata_i[31:0]: APB write data bus input
apb_pready_o: APB ready output to indicate transfer completion
apb_prdata_o[31:0]: APB read data bus output
I2C Interface Signals
i2c_scl_i: I2C clock input
i2c_sda_i: I2C data input
i2c_sda_o: I2C data output
i2c_sda_oe: I2C data output enable (active high)
Interrupt Signals
i2c_interrupt_o: I2C interrupt request output, connects to external I2C master
apb_interrupt_o: APB interrupt request output, connects to Core Complex