求教STM32硬件I2C EV5和EV6錯誤問題
EV5、EV6並不是錯誤。
EV5事件:
程序中是這樣調用的
//檢測 EV5 事件並清除標誌
while(! I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT))?
{
if ((I2CTimeout--) == 0)? return I2C_TIMEOUT_UserCallback(1);
}
可以看到這裏有壹個宏I2C_EVENT_MASTER_MODE_SELECT,它定義在stm32f4xx_i2c.h頭文件中(答主用的STM32F4單片機)
它的值為((uint32_t)0x00030001)。
這裏還有壹個函數I2C_CheckEvent();?
這個函數將I2C的兩個16位寄存器SR1和SR2合並成壹個32位數據再與FLAG_MASK (這也是壹個宏,在stm32f4xx_i2c.c中,它的值為((uint32_t)0x00FFFFFF)) 做按位與運算,得到SR1的低8位數據和SR2的全部16位數據,這個數據再與宏 I2C_EVENT_MASTER_MODE_SELECT 做按位與運算這個宏的值為((uint32_t)0x00030001)?,取出了SR1寄存器的位0、位1,SR2寄存器的位0 的值。
我們來看看 SR1寄存器的位0、位1,SR2寄存器的位0? 表示的什麽含義?
在STM32F4xx中文參考手冊中查到:
SR1:
SR2:
可見,EV5事件是判斷起始位有沒有產生、判斷是主模式還是從模式,地址有沒有發送的? 判斷完成,無異常接下來就開始發送從設備地址了。
EV6事件同理,如果不懂,說明還沒有理解上面的EV5事件,繼續看EV5。