ZHDZ019E 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
受影响修订版:0
如果应用在 I2C 总线活动继续进行时延迟处理 I2C 中断,后续总线事件可能导致 I2C 状态寄存器 (I2CSTR) 中的多个状态标志同时变为活动状态。如果 I2CIER 中启用了这些中断事件中的多个,后续中断可能会丢失。
解决方法:轮询 I2CISRC.INTCODE 字段,并针对每个中断源执行相应操作,直到 I2CISRC.INTCODE 字段的值为 0(无挂起中断)。
__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();
}