我尝试在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或通过谷歌的例子。任何人都可以帮助我或向我展示一个例子。
上面的代码中的一个错误是每种情况下缺少的确认。在我的情况下,还有其他奴隶与主人沟通。所以初始化我的奴隶后,在公共汽车上听一听。我收到一个停止位,这不是我通信的一部分。所以我不能删除停止位。同样重置ADDR标志并不像我想象的那么容易。 – 2012-03-26 21:09:16