CAN總線技術(shù)學(xué)習(xí)(二)
CAN總線協(xié)議有兩種:CAN2.0A和CAN2.0B協(xié)議,CAN2.0A支持幀ID為11位的標(biāo)準(zhǔn)幀,CAN2.0B協(xié)議支持幀ID為11位的標(biāo)準(zhǔn)幀和幀ID為29位的擴(kuò)展幀,如圖1和圖2所示。
圖1CAN標(biāo)準(zhǔn)幀
圖2CAN擴(kuò)展幀
下面解釋幾個(gè)CAN總線問題:
位填充:上述圖中都提到位填充的問題,即當(dāng)發(fā)送的一幀CAN信息中出現(xiàn)連續(xù)5個(gè)相同位時(shí),控制器會自動填充一個(gè)相反的位進(jìn)去,控制器接收一幀CAN信息時(shí)發(fā)現(xiàn)5個(gè)相同的位,也會自動把其后的一個(gè)翻轉(zhuǎn)位去掉。那么可能我們會問為什么要做這種看似無用的操作呢?因?yàn)镃AN總線通訊屬于異步通訊,雖然通訊雙方約定設(shè)定相同的波特率通訊,但是每一位(bit)的寬度也不可能絕對相同,多個(gè)相同的位累積起來可能出現(xiàn)較大的誤差,造成接收信息出錯,那么如何解決這個(gè)問題呢?CAN協(xié)議中規(guī)定在位跳轉(zhuǎn)時(shí)要做同步補(bǔ)償,那么這樣可以消除多個(gè)位累積造成的錯誤,但是如果CAN幀信息連續(xù)出現(xiàn)多個(gè)0或1,接收方?jīng)]辦法監(jiān)測到翻轉(zhuǎn)位,不能做出正確的補(bǔ)償,可能導(dǎo)致發(fā)送方發(fā)了10位0,接收方監(jiān)測出11個(gè)0出來的情況出現(xiàn),所以當(dāng)發(fā)送方連續(xù)發(fā)送5個(gè)0時(shí),要位填充一個(gè)1進(jìn)去,然后再發(fā)送下面的位,而接收方接收到5個(gè)0后接收到下面的1可以做出相應(yīng)的同步補(bǔ)償,同時(shí)要丟棄這個(gè)填充位。按照CAN協(xié)議規(guī)定如果在CAN信息中接收到連續(xù)6個(gè)以上的相同位被認(rèn)為是錯誤信息,CAN控制器錯誤計(jì)數(shù)加1。
CAN協(xié)議:如上圖所示,標(biāo)準(zhǔn)幀標(biāo)識符(幀ID)有11位,擴(kuò)展幀標(biāo)識符(幀ID)有29位,CAN2.0B協(xié)議也兼容CAN2.0A協(xié)議,可以同時(shí)識別標(biāo)準(zhǔn)幀和擴(kuò)展幀。標(biāo)準(zhǔn)幀和擴(kuò)展幀的區(qū)別在于IDE位,IDE為0時(shí)表示標(biāo)準(zhǔn)幀,IDE為1時(shí)表示擴(kuò)展幀。
CAN信號:CAN總線使用一對差分信號通訊,即CAN_H和CAN_L,通過識別它們的壓差獲取0或1的信息,上電后兩個(gè)信號對地都會有一定的電壓,即V_CANH和V_CANL,通過判斷V_CANH-V_CANL識別信息,總線信號分為顯性(壓差為1V以上,也即數(shù)字0)和隱性(壓差小于0.5V,也即數(shù)字1)。一般在沒有數(shù)據(jù)通訊時(shí)V_CANH和V_CANL都為2.5V,所以CAN總線默認(rèn)為沒有壓差(隱性,數(shù)字1),當(dāng)有起始位SOF(數(shù)字0,顯性)時(shí)每個(gè)網(wǎng)絡(luò)上的節(jié)點(diǎn)都能監(jiān)測到,準(zhǔn)備接收信息,如圖3所示。
圖3CAN總線電壓示意圖
逐位仲裁機(jī)制:CAN節(jié)點(diǎn)發(fā)送的信息都會被自己接收并判斷。當(dāng)CAN總線上兩個(gè)節(jié)點(diǎn)同時(shí)發(fā)送CAN信息時(shí),CAN節(jié)點(diǎn)也會比較自己發(fā)送的數(shù)據(jù)和接收的數(shù)據(jù)是否一致,由于CAN信號有顯性(數(shù)字0,壓差大于1V)和隱性(數(shù)據(jù)1,壓差小于0.5V)兩種,當(dāng)一個(gè)節(jié)點(diǎn)發(fā)送0而另一個(gè)節(jié)點(diǎn)發(fā)送1時(shí),總線表現(xiàn)為顯性0,那么發(fā)送1的節(jié)點(diǎn)監(jiān)測到后知道發(fā)送總線沖突,自動退出發(fā)送,所以可以看出,CAN總線信息小的優(yōu)先級高。通過這種方式可以實(shí)現(xiàn)非破壞性逐位仲裁,優(yōu)先級高的節(jié)點(diǎn)正常發(fā)送,不受任何影響。
評論