SPRZ496E October 2021 – August 2026 TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1
Revision Affected: 0
If the application delays servicing of an I2C interrupt while I2C bus activity continues to progress, future bus events can cause multiple status flags in the I2C Status Register (I2CSTR) to become active concurrently. If more than one of these interrupt events is enabled in I2CIER, future interrupts could be lost.
Workaround: Poll the I2CISRC.INTCODE field and execute the corresponding action for each interrupt source until the I2CISRC.INTCODE field has a value of 0 (no interrupt pending).
__interrupt void I2CA_ISR(void){
uint16_t isrc;
while((isrc = I2C_getInterruptSource(I2CA_BASE)) != I2C_INTSRC_NONE){
switch(isrc) {
case I2C_INTSRC_ARB_LOST:
/* ARBLINT ISR code */
break;
case I2C_INTSRC_NO_ACK:
/* NACKINT ISR code */
break;
case I2C_INTSRC_REG_ACCESS_RDY:
/* ARDYINT ISR code */
I2C_clearStatus(I2CA_BASE, I2C_STS_REG_ACCESS_RDY);
break;
case I2C_INTSRC_RX_DATA_RDY:
/* RRDYINT ISR code, including I2C_getData() call */
break;
case I2C_INTSRC_TX_DATA_RDY:
/* XRDYINT ISR code, including I2C_putData() call */
break;
case I2C_INTSRC_STOP_CONDITION:
/* SCDINT ISR code */
break;
case I2C_INTSRC_ADDR_TARGET:
/* AASINT ISR code */
break;
}
NOP;
NOP;
}
Interrupt_clearACKGroup();
}