随著(zhe)工業技術不斷發展,CAN總線已廣泛應用(yòng)于,車輛、航空、醫療等高(gāo)安全要求領域。高(gāo)頻(pín)發送CAN報文也(yě)成爲安全測試的(de)必要組成部分(fēn)。在信号正常的(de)網絡上高(gāo)負載率發送測試時(shí),總線上偶然會出現許多(duō)意想不到的(de)問題,例如出現大(dà)量錯誤報文、被測設備報文周期出現異常、甚至總線鎖死等。這(zhè)個(gè)時(shí)候我們則需要考慮一下(xià)CAN網絡上的(de)仲裁是否發生了(le)異常。
首先我們來(lái)了(le)解一下(xià)CAN總線仲裁機制。
一、 CAN總線仲裁機制
CAN總線作爲現場(chǎng)總線,每個(gè)節點可(kě)以同時(shí)偵測到網絡上正在發送的(de)數據,當總線空閑時(shí)每個(gè)節點均可(kě)以發起自身報文發送。如果多(duō)個(gè)節點同時(shí)發起報文發送請求,由哪個(gè)節點占用(yòng)總線就是仲裁機制的(de)主要用(yòng)途。
首先CAN總線物(wù)理(lǐ)層通(tōng)常是雙絞線。當邏輯“1” 被寫進總線時(shí),CANH和(hé)CANL的(de)電平都是2.5V,這(zhè)種狀态并被定義爲“隐性”位;當邏輯“0”被寫進總線時(shí)CANH會上拉到爲5V,CANL被下(xià)拉到地0V,這(zhè)種狀态被定義爲“顯性”位。如果顯性位和(hé)隐性位被不同的(de)節點同時(shí)寫進總線時(shí),總線會表現爲“顯性”位。“顯性位覆蓋隐性位”是CAN總線沖突檢測的(de)基礎。
當節點開始傳送它們各自的(de)報文時(shí),如果一個(gè)節點寫進了(le)隐性位而讀回顯性位,節點會知道另一個(gè)高(gāo)優先權節點正在占用(yòng)總線,該節點會停止傳送報文并繼續接收總線報文。這(zhè)種技術叫做(zuò)“非破壞性逐位”仲裁。
圖1 CAN仲裁機制
如圖1所示,在多(duō)個(gè)節點同時(shí)發送報文時(shí),首次出現不同,且發送顯性位的(de)節點占用(yòng)總線。由于CAN報文首先發送的(de)爲ID段且顯性位爲邏輯“0”,因此ID越小該幀的(de)優先級越高(gāo)。
二、 仲裁場(chǎng)
似乎按照(zhào)“非破壞性逐位”仲裁機制,就可(kě)以從ID一直仲裁到CRC段,可(kě)是CAN傳輸标準并不是這(zhè)樣, CAN标準要求,仲裁僅從基本ID第一位開始,到标準幀的(de)IDE位或擴展幀的(de)RTR位結束。這(zhè)個(gè)區(qū)域被定義爲仲裁場(chǎng)。如圖2所示。
圖2 CAN仲裁場(chǎng)區(qū)域
依據仲裁場(chǎng)範圍,CAN總線仲裁流程如圖3所示。
圖3 CAN仲裁場(chǎng)區(qū)域
三、 仲裁異常的(de)影(yǐng)響
在CAN仲裁機制中,理(lǐ)論上仲裁必須在仲裁場(chǎng)完成。不過CAN總線配置錯誤或者測試時(shí)發送CAN幀疏忽,也(yě)存在仲裁場(chǎng)數據完全相同的(de)情況,在這(zhè)樣的(de)情況下(xià)會對(duì)總線造成什(shén)麽後果呢(ne)?下(xià)面我們按照(zhào)CAN通(tōng)訊原則分(fēn)析一下(xià)仲裁異常時(shí)CAN總線可(kě)能出現什(shén)麽表現。
1、仲裁場(chǎng)後數據傳輸不一緻
在仲裁場(chǎng)結束後CAN節點需要對(duì)發送的(de)數據進行一緻性對(duì)比,如果發送的(de)數據與讀取回得(de)數據不一緻,收發器則需要發送CAN錯誤幀,以通(tōng)知總線各個(gè)節點自身發送數據錯誤,停止接收并快(kuài)速進入總線空閑,以便再次數據發送。
圖4 仲裁場(chǎng)後數據傳輸不一緻
如圖4所示當兩個(gè)節點發送的(de)仲裁場(chǎng)相同,在仲裁場(chǎng)後DLC段發生數據不同情況。發送單元1發現自己本身需要發送的(de)隐性電平而收到的(de)是顯性電平,識别到數據不一緻現象後立即發出錯誤幀信息(6個(gè)顯性位)。發送單元1發送錯誤信息過程中,發送單元2也(yě)将捕獲到自己某個(gè)隐性位發送與收取的(de)不一緻,從而也(yě)發出主動錯誤幀。最終造成類似圖4總線電平特征。
需要注意,大(dà)部分(fēn)CAN收發器在發送過程中因爲沒有占用(yòng)到總線或者發送失敗,會在下(xià)一次總線空閑到來(lái)時(shí)再次占用(yòng)總線發送相同的(de)數據。因此當出現仲裁場(chǎng)數據相同,後續數據不同時(shí),有極大(dà)的(de)可(kě)能造成總線錯誤後兩個(gè)節點再次同時(shí)占用(yòng)總線,再次進行仲裁并總線錯誤,甚至反複進入錯誤造成網絡鎖死等嚴重情況。
2、仲裁場(chǎng)後數據相同
如果兩個(gè)CAN節點,發送CAN幀完全相同,兩個(gè)發送單元均認爲占用(yòng)了(le)總線,并成功發送完數據。雖然數據發送完成,不過需要注意CAN節點在發送數據幀時(shí),是不能夠對(duì)自己發送的(de)CAN幀進行應答(dá),這(zhè)個(gè)時(shí)候則會出現不同的(de)情況。
a、不存在多(duō)餘的(de)應答(dá)節點
圖5 傳輸數據相同無應答(dá)
當所有的(de)總線節點發送的(de)數據均相同,那麽所有節點認爲自己成功發送了(le)數據,而等待總線其他(tā)節點應答(dá)。此時(shí)發送節點會因爲沒有得(de)到應答(dá)而被CAN節點識别爲發送失敗,從而重新占用(yòng)總線再次發送。
(注:此現象與應用(yòng)層有很大(dà)的(de)關系,節點也(yě)可(kě)以被識别爲發送成功而不再重發。)
b、存在多(duō)餘應答(dá)節點
圖6 傳輸數據相同有應答(dá)
在多(duō)個(gè)節點同時(shí)發送相同數據到總線,并存在其他(tā)節點不處于發送狀态,其他(tā)節點則會對(duì)總線進行應答(dá),發送節點會認爲CAN數據成功發送。從而隐藏了(le)這(zhè)種仲裁異常現象。
三、仲裁的(de)其他(tā)特性與測試建議(yì)
1、CAN總線中的(de)節點在仲裁失敗、發送失敗或者請求發送時(shí)總線被其他(tā)節點占用(yòng),一般會在下(xià)一次空閑到來(lái)時(shí)請求發送,總線負載率越高(gāo),遇到上面的(de)情況概率也(yě)就越大(dà),因此仲裁事件的(de)發生常出現在高(gāo)負載率的(de)總線環境下(xià),如果可(kě)以控制總線負載率在合理(lǐ)範圍内,可(kě)以大(dà)大(dà)減少仲裁事件的(de)發生。
2、每個(gè)CAN節點在發送報文時(shí),顯性電平都存在一定的(de)驅動能力,在仲裁事件發生時(shí),由于多(duō)個(gè)節點同時(shí)驅動總線,會造成CAN總線顯性電平電壓與平時(shí)高(gāo)一點(驅動點越多(duō),電壓越高(gāo))。同時(shí)由于每個(gè)節點同步性可(kě)能存在微小的(de)差異,其脈寬也(yě)可(kě)能發生改變。
3、當需要測試指定節點長(cháng)時(shí)間占用(yòng)不到總線的(de)表現時(shí),應該使用(yòng)高(gāo)優先級測試報文進行高(gāo)負載率發送(盡可(kě)能達到100%)。高(gāo)優先級報文一直占用(yòng)總線,低優先級報文永遠(yuǎn)占用(yòng)不到總線。當需要部分(fēn)允許部分(fēn)禁止,應設置測試報文優先級在允許報文與不允許報文之間。
4、如果需要測試指定節點高(gāo)負載率情況下(xià)報文周期特性,發送的(de)報文優先級不能高(gāo)于被測節點周期特性報文的(de)優先級。如果被測節點滿足周期性,周期到來(lái)後的(de)第一個(gè)空閑後報文發送就可(kě)以仲裁成功将該周期報文成功發送。
5、在某些CAN高(gāo)層總線協議(yì)中,存在可(kě)變優先級字段,(依據請求發送等待時(shí)間變化(huà)優先級)。如果需要驗證報文優先級變化(huà)特性,所發送的(de)報文優先級,需要使用(yòng)高(gāo)于初次請求優先級,低于最高(gāo)優先級的(de)報文。
CAN總線中,無論節點還(hái)是測試設備發送報文仲裁場(chǎng)應該不同,這(zhè)樣可(kě)以避免因仲裁異常造成的(de)錯誤出現。同樣在CAN測試時(shí),應依據測試目的(de)選擇合理(lǐ)的(de)CAN報文ID,避免仲裁特性影(yǐng)響測試效果。