I2C1 Interrupt Handler Never Called
I am using an STM32H753. I2C1 (for an EEPROM) and I2C3 (for a touchscreen) are set up in the same way. Interrupt priority 10 for both, 400kHz. I can transfer data via I2C3 using interrupts, but when I try the same with I2C1, the interrupt handler is never called. The I2C1 interrupt is listed as pending. I have already lost several days on this issue, with no solution is sight. What can be wrong? I can see on the oscilloscope that the memory address is correctly transferred and the first byte of data received. When using DMA instead of interrupt driven, then all 6 bytes are transferred, but also the transfer complete interrupt is never generated.
Snippet of my code (including a lot of debug code), including values.
uint8_t *I2CMemGetMACAddress(void)
{
irqenable1 = NVIC_GetEnableIRQ(I2C1_EV_IRQn); // returns 1
irqenable2 = NVIC_GetEnableIRQ(I2C1_ER_IRQn); // returns 1
irqpending1 = NVIC_GetPendingIRQ(I2C1_EV_IRQn); // returns 0
irqpending2 = NVIC_GetPendingIRQ(I2C1_ER_IRQn); // returns 0
prio = NVIC_GetPriority(I2C1_EV_IRQn); // returns 10
acti = NVIC_GetActive(I2C1_EV_IRQn); // returns 0
NVIC_ClearPendingIRQ(I2C1_EV_IRQn);
NVIC_ClearPendingIRQ(I2C1_ER_IRQn);
itflags = READ_REG(hi2c1.Instance->ISR); // returns 0x01
pm = __get_PRIMASK(); // returns 0
bp = __get_BASEPRI(); // returns 0x50
I2CReadComplete = 0;
HAL_I2C_Mem_Read_IT(&hi2c1, MEMI2CADDR, MAC48_OFFSET, I2C_MEMADD_SIZE_16BIT, MAC48Address, 6);
while(!I2CReadComplete)
{
irqenable1 = NVIC_GetEnableIRQ(I2C1_EV_IRQn); // returns 1
irqenable2 = NVIC_GetEnableIRQ(I2C1_ER_IRQn); // returns 1
irqpending1 = NVIC_GetPendingIRQ(I2C1_EV_IRQn); // returns 1
irqpending2 = NVIC_GetPendingIRQ(I2C1_ER_IRQn); // returns 0
prio = NVIC_GetPriority(I2C1_EV_IRQn); // returns 10
acti = NVIC_GetActive(I2C1_EV_IRQn); // returns 0
cr1 = READ_REG(hi2c1.Instance->CR1); // returns 0xF5
cr2 = READ_REG(hi2c1.Instance->CR2); // returns 0x20604a0
itflags = READ_REG(hi2c1.Instance->ISR); // returns 0x8005
pm = __get_PRIMASK(); // returns 0x00
bp = __get_BASEPRI(); // returns 0x50
}
return MAC48Address;
}