初始設定Master收到NACK就會產生中斷
但是I2CMasterIntStatusEx(I2C0_BASE, true); 無法讀取到狀態值(但是卻會進入中斷),一直都是0
而且只有第一次NACK會進中斷,再來後面的NACK都無法進入
除非中途有成功通訊一次,即
NACK(進) > NACK(不會進) > NACK(不會進) > ACK > NACK(進) > NACK(不會進) > ACK > NACK(進)...
//=========================================================
void Initial_I2C(void)
{
memset(&gI2C_CMD, 0, sizeof(I2C_SESSION_INFO));
memset(&gFRU_CMD, 0, sizeof(FRU_SESSION_INFO));
// memset(&gEEPROM_Data, 0, sizeof(I2C_SESSION_INFO)); // test
gI2C_CMD.u8SendData [0] = 0xAA;
gI2C_CMD.u8SendData [1] = 0xBB;
// i2c_0 Master EEPROM
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_I2C0);
ROM_GPIOPinConfigure(GPIO_PB2_I2C0SCL);
ROM_GPIOPinConfigure(GPIO_PB3_I2C0SDA);
ROM_GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
ROM_GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
ROM_I2CMasterInitExpClk(I2C0_BASE, ROM_SysCtlClockGet(), false); // true=400 Kbps, false=100 Kbps
HWREG(I2C0_BASE + I2C_O_FIFOCTL) = 80008000; // clear FIFO
ROM_I2CMasterIntEnableEx(I2C0_BASE, I2C_MASTER_INT_NACK);
ROM_I2CMasterEnable(I2C0_BASE);
ROM_IntEnable(INT_I2C0);
ROM_IntMasterEnable();
}
//=========================================================
void I2C0_Handler(void)
{
uint32_t int_status;
int_status = ROM_I2CMasterIntStatusEx(I2C0_BASE, true); // 即使進入讀到的也都是0
UART_DebugMSG(int_status, (int_status & I2C_MASTER_INT_NACK));
ROM_I2CMasterIntClearEx(I2C0_BASE ,int_status);
// if(int_status & I2C_MASTER_INT_NACK)
{
if(status_machine == STATUS_I2C)
{gI2C_CMD.i2c_Fail = ERROR_TYPE_I2C_NACK;
ROM_GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_1, GPIO_PIN_1); //LED_2
}
else if(status_machine == STATUS_FRU)
{gFRU_CMD.FRU_Fail = ERROR_TYPE_I2C_NACK;
ROM_GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_0, GPIO_PIN_0); //LED_1
}
}
}