關於STM8CAN產生bus-off如何自動恢復

關於STM8CAN產生bus-off如何自動恢復

  • 硬件條件:STM8AF52A8、TJA1040T
  • 軟件條件:IAR
    這裏只是產生bus-off的一種情況:當CANH和CANL短接在一起的時候,STM8的can控制器就停止工作了,如何讓CAN重新工作。

理論上:看STM8的參考手冊,其中CAN主控制寄存器(CAN_MCR)的第六位ABOM可以決定CAN控制器自動退出離線狀態,簡單的說就是自動恢復。
這裏寫圖片描述這裏寫圖片描述按照上述手冊所描述的,只要將ABOM置“1”就可以實現自動恢復。那麼我們只需要簡單的在CAN初始化的過程中將ABOM置“1”即可。那麼就在CAN_Init(……);之後加CAN->MCR |= (uint8_t)CAN_MCR_ABOM;那麼這樣ABOM置“1”了。那麼運行之後,CAN還是不能夠恢復…….不知是不是哪裏出錯了還是設置不對,有經驗的可以教教我。

以上的方法是沒有實現自動恢復的。之後發現可以採用另外一種方法,就是當產生bus-off會觸發STM8的中斷函數,通過仿真發現其中CAN寄存器CAN_MSR的ERRI位會被置”1”,在通過查手冊看了下CAN_MSR寄存器。寫到置位以後會觸發中斷,那麼當出現bus-off的時候可以通過中斷服務函數來判斷。那麼接下來糾結的CAN錯誤中斷服務函數是哪一個?在不下心的情況下發現了CAN發送中斷後面的一個註釋,大家可以看看。後面有一個ER,說明這個發送中斷服務函數包括錯誤函數。意思就是當CAN發送報文和有錯誤觸發的時候都會進入下面這個中斷服務函數。

INTERRUPT void CAN_TX_IRQHandler(void); /* CAN TX/ER/SC */

接下來我們就要在中斷服務函數中判斷是否出現了BUS-OFF,從函數和手冊中可以得知(就上面的截圖就說到,BOFF置”1”,不再接收和發送報文),只要BOFF位被置“1”,說明進入了bus-off中斷了。

CAN_IT_BOF        =((uint16_t)0x0400), /*!< Bus-off   interrupt   */
INTERRUPT_HANDLER(CAN_TX_IRQHandler, 9)
 {
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
    CAN_ClearITPendingBit(CAN_IT_TME);
    if(CAN_GetITStatus(CAN_IT_BOF) == SET)
    {
        //這裏加你的CAN初始函數,將CAN重新初始化CAN_Init(……);
        CAN_ClearITPendingBit(CAN_IT_BOF);
    }
 } 

這裏寫圖片描述

按照上面的做法理論上是可以實現CAN恢復的,如果還是不行,那麼就需要另外找辦法了

在CAN出現BUS-OFF恢復後你可能會出現下面一個問題,在CAN恢復以後會有莫名幾幀報文出現,這是因爲STM8有一個自動重傳模式,如果這不影響你的正常使用那是沒有關係的,如果你想關閉這個自動重發的功能,你只需要將CAN_MCR寄存器的NART位置”1”就可以了,在CAN_Init();函數裏面找以一個後面一點的位置加上下面這條語句。

CAN->MCR |= (uint8_t)CAN_MCR_NART;

應該就可以了。(這次寄存器就起作用了O(∩_∩)O哈哈~),下面就是手冊裏面介紹的。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
上面說的很多都是契合STM32寄存器的內容,如果在使用STM32的CAN的過程中也可參考上述寄存器的配置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章