1. 程式人生 > >STM32從模式接受資料

STM32從模式接受資料

在實際應用中,會碰到上位機往單片機發送資料的情況,這時候需要配置微控制器為從裝置,準備接受資料

使用硬體I2C時,開啟事件和快取中斷

    I2C_ITConfig(SLAVER_I2C, I2C_IT_EVT | I2C_IT_BUF, ENABLE);

然後在中斷服務函式中接受資料

void SLAVER_I2C_EV_IRQ_HANDLER(void)
{
    switch(I2C_GetLastEvent(SLAVER_I2C))
    {
        // EV1: ADDR=1, cleared by reading SR1 followed by reading SR2
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: { is_data = 0; break; } // EV2: RxNE=1, cleared by reading DR register case I2C_EVENT_SLAVE_BYTE_RECEIVED: { if(is_data == 0) { is_data
= 1; reg_addr = I2C_ReceiveData(SLAVER_I2C); } else { is_data = 0; reg_data = I2C_ReceiveData(SLAVER_I2C); } break; } // EV4: STOPF=1, cleared by reading SR1 register followed by writing to the CR1 register
case I2C_EVENT_SLAVE_STOP_DETECTED: { I2C_Cmd(SLAVER_I2C, ENABLE); if((reg_addr == 0x22) && (reg_data == 0x47)) LED_D4_TOGGLE; break; } } }

這段程式碼十分簡單,處理EV1, EV2和EV4即可

邏輯分析儀截圖如下

這次實驗是這系列STM32 I2C實驗的目的,因為工作專案需要我去移植優化以前的工程,工程中需要配置I2C從裝置。但是原來做工程的工程師已經離職,公司又無其他同職位工程師可問,只好自己一步一步除錯。最開始,我在開發板上做驗證得到的是如下的波形

在我寫這篇部落格時,BUG已經解掉,還原的BUG是通過修改I2C中斷配置

    I2C_ITConfig(SLAVER_I2C, I2C_IT_EVT, ENABLE);

即去掉I2C_IT_BUG

現在反過頭看這個錯誤十分愚蠢,但整個解BUG的過程卻令人十分痛苦

1、我寫程式碼都力求最精簡,去掉無用冗餘的程式碼,在開始對STM32 I2C不甚瞭解時,我簡單地認為I2C中斷分為事件中斷和錯誤中斷,BUF中斷不知道時做什麼的,就沒用

2、上面的實驗時仿照實際使用傳輸暫存器地址和資料來做,但在之前一直是以寫一個數據,即最簡單的方式來測試,該測試下,第一次收資料的波形正常,第二次就會出現上面的鎖死,且如果開啟DEBUG模式,則接受資料一直正常。不知道這是什麼原因造成,導致除錯十分困難

3、我手頭還有一塊NUCLEO64的開發板,但微控制器型號為STM32F303RE,而它的標準庫提供的示例工程程式碼使用的是CPAL,導致無法用它去驗證是否為F1系列硬核I2C本身的BUG,網上有流傳STM32硬核I2C有BUG,許多工程師都喜歡使用軟核I2C,恰好野火開發板例程也是軟核實現