找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9800|回復(fù): 2
收起左側(cè)

一個(gè)關(guān)于STM32 CAN出錯(cuò)恢復(fù)的話題

[復(fù)制鏈接]
ID:98618 發(fā)表于 2016-4-27 23:40 | 顯示全部樓層 |閱讀模式
最近有個(gè)STM32 用戶咨詢:

最近在使用stm32f105做雙can通信,can驅(qū)動(dòng)芯片使用的TJA1042,發(fā)現(xiàn)將canH canL 短路再放開以后,can出錯(cuò)恢復(fù)不回來?之前在K40上使用的時(shí)候沒有這個(gè)問題,不知道這個(gè)情況大家有什么指導(dǎo)建議?

另外,他還附上了基于STM32CUBEMX工具配置的相關(guān)代碼如下:

   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);

 

從用戶的描述來看,應(yīng)該是CANH/CANL短路時(shí)導(dǎo)致錯(cuò)誤而進(jìn)入離線狀態(tài)。

其實(shí),CAN硬件是具備出錯(cuò)管理和離線恢復(fù)功能的。在STM32參考手冊(cè)的CAN出錯(cuò)管理章節(jié)有相關(guān)描述。


CAN協(xié)議所描述的出錯(cuò)管理,完全由硬件通過發(fā)送錯(cuò)誤計(jì)數(shù)器(CAN_ESR寄存器里的TEC域),和接收錯(cuò)誤計(jì)數(shù)器(CAN_ESR寄存器里的REC域)來實(shí)現(xiàn),其值根據(jù)出錯(cuò)情況作增加或減少。關(guān)于TEC和REC管理的詳細(xì)信息,需參考CAN標(biāo)準(zhǔn)。此外,CAN_ESR寄存器提供了當(dāng)前錯(cuò)誤狀態(tài)的詳細(xì)信息。通過設(shè)置CAN_IER寄存器(比如ERRIE位),當(dāng)檢測(cè)到出錯(cuò)時(shí)軟件可以靈活地控制中斷的產(chǎn)生。

 

關(guān)于離線恢復(fù)

當(dāng)TEC大于255時(shí),bxCAN就進(jìn)入離線狀態(tài),同時(shí)CAN_ESR寄存器的BOFF位被置’1’。在離線狀態(tài)下,bxCAN無法接收和發(fā)送報(bào)文。

根據(jù)CAN_MCR寄存器中ABOM位的設(shè)置,bxCAN可以自動(dòng)在軟件的請(qǐng)求下,從離線狀態(tài)恢復(fù)(變?yōu)殄e(cuò)誤主動(dòng)狀態(tài))。在這兩種情況下,bxCAN都必須等待一個(gè)CAN標(biāo)準(zhǔn)所描述的恢復(fù)過程(CAN RX引腳上檢測(cè)到128次11個(gè)連續(xù)的隱性位)。

 

如果ABOM位為’1’,bxCAN進(jìn)入離線狀態(tài)后,就自動(dòng)開啟恢復(fù)過程。

如果ABOM位為’0’,必須通過軟件請(qǐng)求bxCAN進(jìn)入初始化模式然后退出并進(jìn)入正常模式,隨后才能啟動(dòng)恢復(fù)過程。

 

注: 在初始化模式下,bxCAN不會(huì)監(jiān)視CAN RX引腳的狀態(tài),這樣就不能完成恢復(fù)過程。為了完成恢復(fù)過程,bxCAN必須工作在正常模式。

 

用戶給出的配置代碼并未出現(xiàn)使能ABOM功能的語句,那關(guān)于ABOM的默認(rèn)值又是怎樣呢?


CAN_MCR寄存器的初始值來看,位ABOM默認(rèn)初始值是0,即沒有開啟自動(dòng)離線恢復(fù)功能。

既然這樣,用戶要么借助出錯(cuò)中斷和查詢CAN_ESR中的BOFF位來進(jìn)行軟件手動(dòng)恢復(fù),要么修改配置代碼,將ABOM使能,實(shí)行離線自動(dòng)恢復(fù)。


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


相關(guān)話題鏈接:【點(diǎn)擊閱讀】

一個(gè)關(guān)于CAN出錯(cuò)中斷重復(fù)出現(xiàn)的話題

回復(fù)

使用道具 舉報(bào)

ID:958413 發(fā)表于 2021-8-2 19:38 | 顯示全部樓層
寫的不錯(cuò),頂一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:83553 發(fā)表于 2016-4-28 12:59 | 顯示全部樓層
我用51+sja1000也有這樣的情況,如何設(shè)置,請(qǐng)教樓主。謝謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表