STM32之CAN---錯誤管理分析
1 幾個重要概念
根據ISO11898有如下幾個重要的與CAN相關的定義:
- Fault confinement(錯誤界定)
CAN nodes shall be able to distinguish short disturbances from permanent failures. Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.
CAN節點可以區分常規錯誤和永久故障。有故障的傳送節點將切換到離線狀態。離線意味著在邏輯上與匯流排斷開,既不能傳送也不能接收。
- Error-active(主動錯誤)
An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .
處於主動錯誤狀態的節點能正常參與匯流排通訊的收發和當檢測到錯誤時將傳送錯誤標誌,錯誤標誌由6個連續的顯示位組成(這種連續的6個顯示位與常規的填充位和其它幀固定格式不相同,正因為如此,硬體才容易區別)。
- Error-passive(被動錯誤)
An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent. The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .
處於被動錯誤狀態的節點不能傳送主動錯誤標誌。它能參與正常通訊,但當檢測到錯誤時傳送的是被動錯誤標誌。被動錯誤標誌由6個連續的隱性位組成。當傳送結束後,處於被動錯誤狀態的節點在下一次再次傳送時之前需要等待一些額外時間。
- Bus-off(離線)
A node shall be in the bus-off state when it is switched off from the bus due to a request of FCE. In the bus-off state, a node shall neither send nor receive any frames. A node shall start the recovery from bus-off state only upon a user request.
由於錯誤界定規則,一個節點可能處於離線狀態,當處於此狀態時,這個節點既不傳送也不接收。至於何時離線恢復取決於何時使用者請求。
2 ISO11898中錯誤界定的規則
2.1 描述
當涉及到錯誤界定,一個節點必須處於下述三個錯誤狀態中的其中一個,至於具體是哪種錯誤狀態取決於節點的錯誤計數值:
- 主動錯誤狀態(Error-active)
- 被動錯誤狀態(Error-passive)
- 離線狀態(Bus-off)
2.2 錯誤計數
錯誤計數器當檢測下下述事件時將修改錯誤計數值:
- 當一接收節點檢測到一個錯誤時,錯誤計數器將加1.有一種情況可以排外,即當檢測到傳送一主動錯誤標誌或者過載標誌時出現一位錯誤時除外。
- 當一接收節點發送一錯誤標誌時,檢測到首位為顯性位時,錯誤計數器加8.
- 當一發送節後傳送錯誤標誌時,錯誤計數器加8,這時有兩種情況除外:1:當這個傳送節點處於主動錯誤狀態下,且檢測到由於ACK域未有顯性位而造成的ACK錯誤,但是在傳送時未檢測到被動錯誤標誌;2:當傳送節點發送一錯誤標誌時,在仲裁時檢測到填充位錯誤(這些填充位原來應該是隱性,但檢測結果為顯性)。以上兩種異常錯誤計數值保留原值不變。
- 當傳送節點發送一主動錯誤標誌或過載標誌時,檢測到位錯誤時,錯誤計數器加8.
- 當接收節點婁送一主動錯誤標誌或過載標誌時,檢測到位錯誤時,錯誤計數器加8.
- 任何節點在傳送主動錯誤標誌,被動錯誤標誌,或過載標誌時都應都忍受連續7個顯示位。當檢測到連線14個顯示位,或者被動錯誤標誌後緊跟著連線8個顯示位,或者8個連續顯性位後緊跟著被動錯誤標誌時,所有傳送節點發送錯誤計數器加8,所有接收節點接收錯誤計數器加8.
- 發成功傳送一幀報文後,傳送計數器應減1,除非當前已經為0.
- 當成功接收一幀報文後,如果當前接收計數器的值大於1且小於127,則接收計數器減1;如果接收計數器的值為0,則保持為0;如果在於127,則接收計數器的值應設定 為119~127之間的值。
2.3 主動錯誤狀態和被動錯誤狀態之間的轉變
當傳送錯誤計數器或者接收錯誤計數器的值大於127時,該節點變成被動錯誤狀態。
當節點從主動錯誤狀態變為被動錯誤狀態時,節點將傳送一主動錯誤標誌。
當被動錯誤節點的傳送錯誤計數器和接收錯誤計數器的值都小於且等於127時,將再次變為主動錯誤狀態。
2.4 離線管理
如果一個節點的傳送錯誤計數器的值超過255時,那麼此節點將會處於離線狀態。處於離線狀態的節點不會對匯流排產生任何影響,它將不會發送訊息幀,ACK,錯誤幀,過載幀等,至於會不會接收總線上的資料,取消於此節點的實現。
當一個處於離線狀態下的節點接收到128次連線11位隱性位時,將變成主動錯誤狀態,且同時設定傳送錯誤計數器和接收錯誤計數器為0.
注:具體實現可能並不會與上述所描述的一模一樣,比如離線還原,在STM32是有一開關來設定是否會自動還原,如果此功能禁止了,那麼當處於離線狀態下的節點接收到128次連線11連隱性位時也不會不還原成主動錯誤狀態。
圖1
3 STM32的bxCAN實現
3.1 bxCAN錯誤狀態圖
圖2
3.2 出錯管理
CAN協議描述的出錯管理,完全由硬體通過傳送錯誤計數器(CAN_ESR暫存器裡的TEC域),和接收錯誤計數器(CAN_ESR暫存器裡的REC域)來實現,其值根據錯誤的情況而增加或減少。軟體可以讀出它們的值來判斷CAN網路的穩定性。此外,CAN_ESR暫存器提供了當前錯誤狀態的詳細資訊。通過設定CAN_IER暫存器(比如ERRIE位),軟體可以靈活地控制中斷的產生――當檢測到出錯時。
3.3 離線恢復
當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必須工作在正常模式。
4 CAN錯誤狀態暫存器 (CAN_ESR)
地址偏移量: 0x18
復位值: 0x0000 0000
圖3
位31:24 | REC[7:0]: 接收錯誤計數器 這是對CAN協議的故障界定機制接收部分的實現。按照CAN的標準,當接收出錯時, 根據出錯的情況該計數器加1或加8;而在每次接收成功後,該計數器減1,或減少其值為120-當該計數器的值大於127時。當該計數器的值超過127時,CAN進入錯誤被動狀態。 |
位23:16 | TEC[7:0]: 傳送錯誤計數器 與上面相似,這是對CAN協議的故障界定機制傳送部分的實現。 |
位15:7 | 保留位,硬體強制為0。 |
位6:4 | LEC[2:0]: 上次錯誤程式碼 在檢測到CAN總線上發生錯誤時,硬體根據出錯情況設定其為1~6的值。當報文被正確傳送或接收後,硬體清除其值為’0’。 硬體沒有使用錯誤程式碼7,軟體可以設定該值,從而可以檢測程式碼的更新。 000: 沒有錯誤; 001: 位填充錯; 010: 格式(Form)錯; 011: 確認(ACK)錯; 100: 隱性位錯; 101: 顯性位錯; 110: CRC錯; 111: 由軟體設定。 |
位3 | 保留位,硬體強制為0。 |
位2 | BOFF: 離線(Bus Off)標誌 當進入離線狀態時,硬體對該位置1。當傳送錯誤計數器TEC溢位,即大於255時,CAN進入離線狀態。 |
位1 | EPVF: 錯誤被動(Error Passive)標誌 當出錯次數達到錯誤被動的閾值時,硬體對該位置1。 (接收錯誤計數器或傳送錯誤計數器的值>127)。 |
位0 | EWGF: 錯誤警告標誌 當出錯次數達到警告的閾值時,硬體對該位置1。 (接收錯誤計數器或傳送錯誤計數器的值≥96)。 |