Я пытаюсь реализовать подпрограмму обслуживания прерываний подчиненного приемника i2c на stm32f4.
Вот мой умный кусок кода.
void I2C2_EV_IRQHandler()
{
switch (I2C_GetLastEvent(I2C2))
{
//The address sent by the master matches the own address of the peripheral
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
//The slave stretches SCL low until ADDR is
//cleared and DR filled with the data to be sent
I2C_ClearFlag(I2C2,I2C_FLAG_ADDR);
break;
//The application is expecting a data byte to be received
case I2C_EVENT_SLAVE_BYTE_RECEIVED:
I2C_ReceiveData(I2C2);
break;
//The application is expecting the end of the communication
//Make sure that both ADDR and STOPF flags are cleared
//if both are found set.
case I2C_EVENT_SLAVE_STOP_DETECTED:
if(I2C_GetFlagStatus(I2C2,I2C_FLAG_ADDR) == SET)
I2C_ClearFlag(I2C2,I2C_FLAG_ADDR);
if(I2C_GetFlagStatus(I2C2,I2C_FLAG_STOPF) == SET)
I2C_ClearFlag(I2C2,I2C_FLAG_STOPF);
}
}
Прерывание становится вызванным, и вводится случай I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED.
SCL сейчас низкий. В справочном руководстве сказано, что если я сниму флажок адреса, часы продолжатся, и данные будут отправлены (Страница 579 - Подчиненный приемник). По моему мнению, прерывание всегда вызывается, если поступают какие-либо данные, и следующее состояние будет I2C_EVENT_SLAVE_BYTE_RECEIVED.
Не могу найти ни одного примера из stm или через гугл. Кто-нибудь может мне помочь или показать мне пример.