微站是什么意思網(wǎng)站設(shè)計(jì)開發(fā)網(wǎng)站
筆者來聊一下CAN協(xié)議幀的認(rèn)識(shí)和錯(cuò)誤處理。
1、CAN協(xié)議幀認(rèn)識(shí)
CAN 差分信號,是經(jīng)過CAN收發(fā)器轉(zhuǎn)成差分信號的,CAN RX和TX是邏輯電平。CAN的基礎(chǔ)知識(shí),可參考筆者這邊文章:ARM學(xué)習(xí)(21)STM32 外設(shè)Can的認(rèn)識(shí)與驅(qū)動(dòng)編寫。
CAN總線上面要接120歐姆的電阻,形成閉環(huán)。
CAN的總線電平:
- 顯性0,CAN-H 3.5V,CAN-L 1.5V
- 隱形1,CAN-H 2.5V,CAN-L 2.5V,
CAN的協(xié)議幀主要有:
- 幀開始:SOF,數(shù)據(jù)幀開始
- 仲裁段:幀ID,根據(jù)ID進(jìn)行仲裁
- 控制段:數(shù)據(jù)長度等
- 數(shù)據(jù)段:數(shù)據(jù)域,8字節(jié),不夠會(huì)填滿發(fā)送,所以需要長度指定。
- CRC段:對前面的字段進(jìn)行CRC校驗(yàn)
- ACK段:發(fā)送完成后,有節(jié)點(diǎn)接收會(huì)被拉低,
- 幀結(jié)束:EOF,幀結(jié)束
邏輯分析儀抓到的CAN協(xié)議幀:
下面是:幀起始,ID,控制段
中間是:數(shù)據(jù)段和CRC段
最后是:ACK段和幀結(jié)束
2、CAN異常處理
2.1 CAN異常介紹
CAN異常處理,首先得知道CAN有哪些異常,LEC 可以指示錯(cuò)誤信息:
- 位填充錯(cuò)誤
- 格式錯(cuò)誤
- 確認(rèn)錯(cuò)誤,沒有ACK
- 隱形錯(cuò)誤
- 顯性錯(cuò)誤
- CRC錯(cuò)誤。
例如下圖:可以看到,標(biāo)紅色的都代表錯(cuò)誤,首先CRC錯(cuò)誤,然后ACK錯(cuò)誤,正常應(yīng)該是0,EOF尾幀錯(cuò)誤,正常應(yīng)該全1,
如果CAN總線異常,那么可以增加相關(guān)寄存器打印,可以知道CAN的錯(cuò)誤。
printf("CAN_TX_TIMEOUT, ESR=0x%x, TSR=0x%x, IER=0x%x\r\n",CAN2->ESR,CAN2->TSR,CAN2->IER);
當(dāng)然也可以通過中斷觸發(fā),但是中斷觸發(fā)有個(gè)問題,如果總線一直異常,那么會(huì)一直觸發(fā),導(dǎo)致持續(xù)進(jìn)中斷,程序無法正常運(yùn)行。
關(guān)于CAN異常中斷的配置,首先需要知道異常會(huì)觸發(fā)哪個(gè)中斷,然后需要使能相應(yīng)的中斷源,以及中斷函數(shù)。
CAN共計(jì)四個(gè)中斷,前三個(gè)中斷很容易理解,就是下圖的三個(gè)中斷
- CAN_TX_IRQn:發(fā)送中斷
- CAN_RX0_IRQn:FIFO0的接收中斷
- CAN_RX1_IRQn:FIFO1的接收中斷
- CAN_SCE_IRQn:不知道什么中斷
然后下面還要一張圖,顯示了CAN異常觸發(fā)的中斷,ESR:Error State Register,異常狀態(tài)寄存器,每一位都有使能位控制,左邊是中斷源,中間是中斷控制,右邊是中斷處理函數(shù),狀態(tài)改變錯(cuò)誤中斷,即State Change Error Handler,SCE_Handler,所以通過這張圖我們就確定了異常處理的中斷函數(shù)。
- 使能中斷源
......
CAN_ITConfig(CAN2, CAN_IT_ERR);
CAN_ITConfig(CAN2, CAN_IT_EWG);
CAN_ITConfig(CAN2, CAN_IT_EPV);
CAN_ITConfig(CAN2, CAN_IT_BOF);
CAN_ITConfig(CAN2, CAN_IT_LEC);
- 使能NVIC 中斷函數(shù)
NVIC_InitStructure.NVIC_IRQChannel = CAN2_SCE_IRQn;
NVIC_InitStructure.IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
- 中斷函數(shù)處理
void CAN2_SCE_IRQHandler(void)
{printf("CAN ESR=0x%x\r\n",CAN2->ESR);CAN_ClearITPendingBit(CAN2, CAN_IT_ERR);CAN_ClearITPendingBit(CAN2, CAN_IT_EWG);CAN_ClearITPendingBit(CAN2, CAN_IT_EPV);CAN_ClearITPendingBit(CAN2, CAN_IT_BOF);CAN_ClearITPendingBit(CAN2, CAN_IT_LEC);
}
2.2 CAN 異常造錯(cuò)
-
實(shí)驗(yàn)一:CAN總線只有一個(gè)節(jié)點(diǎn)
按理說只有一個(gè)節(jié)點(diǎn)的時(shí)候,肯定會(huì)報(bào)ACK錯(cuò)誤,因?yàn)闆]有節(jié)點(diǎn)回,將ACK信號拉低,但是測試結(jié)果發(fā)現(xiàn),同時(shí)還伴有幀格式錯(cuò)誤,還有少量的CRC錯(cuò)誤,查閱資料發(fā)現(xiàn),可能確實(shí)會(huì)存在幀格式錯(cuò)誤,
-
實(shí)驗(yàn)二:CAN 總線上面發(fā)送了一個(gè)不存在節(jié)點(diǎn)的報(bào)文
一切正常,查閱資料發(fā)現(xiàn),自由有節(jié)點(diǎn)接收,那么報(bào)文就正確發(fā)送,接收段由于過濾規(guī)則過濾掉是接收端的問題,那么ACK就會(huì)正確回,所以報(bào)文正常。
-
實(shí)驗(yàn)三:CAN H接地
發(fā)送失敗,CAN離線, -
實(shí)驗(yàn)四:CAN L接地
正常發(fā)送 -
實(shí)驗(yàn)五:CAN H與L短接
發(fā)送失敗,CAN離線