当前位置 - 股票行情交易網 - 金融財經 - 求教STM32硬件I2C EV5和EV6錯誤問題

求教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。