新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 一個關于STM32 CAN出錯恢復的話題

        一個關于STM32 CAN出錯恢復的話題

        作者: 時間:2016-11-13 來源:網絡 收藏
        最近有個STM32 用戶咨詢:

        “最近在使用stm32f105做雙can通信,can驅動芯片使用的TJA1042,發現將canH canL 短路再放開以后,can出錯恢復不回來?之前在K40上使用的時候沒有這個問題,不知道這個情況大家有什么指導建議啊?”
        另外,他還附上了基于STM32CUBEMX工具配置的相關代碼如下:
        hcan1.Instance = CAN1;
        hcan1.Init.Prescaler = 2;
        hcan1.Init.Mode = CAN_MODE_NORMAL;
        hcan1.Init.SJW = CAN_SJW_1TQ;
        hcan1.Init.BS1 = CAN_BS1_8TQ;
        hcan1.Init.BS2 = CAN_BS2_7TQ;
        hcan1.Init.TTCM = DISABLE;
        hcan1.Init.ABOM = DISABLE;
        hcan1.Init.AWUM = DISABLE;
        hcan1.Init.NART = DISABLE;
        hcan1.Init.RFLM = DISABLE;
        hcan1.Init.TXFP = DISABLE;
        HAL_CAN_Init(&hcan1);

        從用戶的描述來看,應該是CANH/CANL短路時導致錯誤而進入離線狀態。

        本文引用地址:http://www.104case.com/article/201611/316115.htm


        其實,CAN硬件是具備出錯管理和離線恢復功能的。在STM32參考手冊的CAN出錯管理章節有相關描述。


        CAN協議所描述的出錯管理,完全由硬件通過發送錯誤計數器(CAN_ESR寄存器里的TEC域),和接收錯誤計數器(CAN_ESR寄存器里的REC域)來實現,其值根據出錯情況作增加或減少。關于TEC和REC管理的詳細信息,需參考CAN標準。此外,CAN_ESR寄存器提供了當前錯誤狀態的詳細信息。通過設置CAN_IER寄存器(比如ERRIE位),當檢測到出錯時軟件可以靈活地控制中斷的產生。

        關于離線恢復
        當TEC大于255時,bxCAN就進入離線狀態,同時CAN_ESR寄存器的BOFF位被置’1’。在離線狀態下,bxCAN無法接收和發送報文。


        根據CAN_MCR寄存器中ABOM位的設置,bxCAN可以自動或在軟件的請求下,從離線狀態恢復(變為錯誤主動狀態)。在這兩種情況下,bxCAN都必須等待一個CAN標準所描述的恢復過程(CAN RX引腳上檢測到128次11個連續的隱性位)。

        如果ABOM位為’1’,bxCAN進入離線狀態后,就自動開啟恢復過程。
        如果ABOM位為’0’,必須通過軟件請求bxCAN先進入初始化模式然后退出并進入正常模式,隨后才能啟動恢復過程。

        注: 在初始化模式下,bxCAN不會監視CAN RX引腳的狀態,這樣就不能完成恢復過程。為了完成恢復過程,bxCAN必須工作在正常模式。

        用戶給出的配置代碼并未出現使能ABOM功能的語句,那關于ABOM的默認值又是怎樣呢?


        從CAN_MCR寄存器的初始值來看,位ABOM默認初始值是0,即沒有開啟自動離線恢復功能。


        既然這樣,用戶要么借助出錯中斷和查詢CAN_ESR中的BOFF位來進行軟件手動恢復,要么修改配置代碼,將ABOM使能,實行離線自動恢復。

        后來用戶將配置代碼調整,使能了ABOM, 代碼中加入hcan1.Init.ABOM
        = ENABLE; 即OK。



        關鍵詞: STM32CAN出錯恢

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 比如县| 嘉黎县| 白沙| 北流市| 禄丰县| 高安市| 汉寿县| 喀喇沁旗| 静乐县| 望奎县| 阿巴嘎旗| 巫溪县| 儋州市| 通海县| 芒康县| 射洪县| 怀化市| 当涂县| 高雄市| 普安县| 周口市| 车致| 石棉县| 绥芬河市| 兴海县| 巴南区| 井冈山市| 东乡| 青田县| 丁青县| 东辽县| 云南省| 巍山| 孝感市| 乃东县| 阿鲁科尔沁旗| 新昌县| 晴隆县| 洛扎县| 内江市| 泸州市|