stm32f4에서 i2c 슬레이브 수신기 인터럽트 서비스 루틴을 구현하려고합니다. 여기 내 똑똑한 코드가 있습니다.stm32f4의 I2C 슬레이브 수신기
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 또는 google을 통해 예제를 찾을 수 없습니다. 아무도 나를 도우 실례를 보여 줄 수 없습니까?
위의 코드에서 하나의 오류는 각각의 경우에 누락 된 확인입니다. 내 경우에는 마스터와 통신하는 다른 노예도 있습니다. 그래서 내 노예를 초기화 한 후 버스에서 들으십시오. 내 커뮤니케이션의 일부가 아닌 스톱 비트를받습니다. 그래서 정지 비트를 삭제할 수 없습니다. 또한 ADDR 플래그를 재설정하는 것은 생각만큼 쉽지 않습니다. –