1980年,Bosch的工程師開始研究汽車上高速串行通信的問題,并在1986年發(fā)布了CAN(Controller Area Network)總線。CAN以其多主,高速(最高1Mbps),抗干擾的特性被廣泛應(yīng)用汽車及各種工業(yè)環(huán)境。在此我們主要介紹一下CAN總線的特點(diǎn),幀類型,以及應(yīng)用中的注意事項(xiàng)。
1.CAN總線特點(diǎn)
1.1多主控制
跟我們常用的RS485只有一個(gè)主機(jī),從機(jī)只能等待主機(jī)的輪詢不同,在CAN總線中,當(dāng)任意一個(gè)節(jié)點(diǎn)監(jiān)測(cè)到總線空閑時(shí),就可以立即啟動(dòng)信息的發(fā)送,也就是每一個(gè)節(jié)點(diǎn)都可以當(dāng)主機(jī)。當(dāng)然,這馬上會(huì)引起我們的擔(dān)心。如同一個(gè)家庭每個(gè)人都當(dāng)家做主,那還不亂了套嗎?不急,我們來看一下。這個(gè)問題是如何被巧妙地解決的。
物理層,CAN采用差分總線。單片機(jī)引腳的邏輯電平0,被CAN收發(fā)器(PHY)轉(zhuǎn)換為顯性電平(Dominant),邏輯電平1被轉(zhuǎn)換為隱性電平(Reccesive)。總線上執(zhí)行的是“線與”邏輯,只要有一個(gè)節(jié)點(diǎn)輸出顯性電平,那么總線上就是顯性電平。
仲裁(Arbitration),CAN的發(fā)送總是以SOF(Start Of Frame)起始,緊跟器后是ID。在發(fā)送ID的同時(shí),節(jié)點(diǎn)監(jiān)聽總線上的顯隱狀態(tài),當(dāng)監(jiān)聽到的狀態(tài)與自己發(fā)送的不一致時(shí),此節(jié)點(diǎn)將停止發(fā)送,進(jìn)入只收模式。如下圖所示,每一幀消息所具有的ID決定了此消息的優(yōu)先級(jí),發(fā)送最高優(yōu)先級(jí)消息的節(jié)點(diǎn)獲得總線最后的控制權(quán),得以最終完整的發(fā)送自己的消息。
接收濾波(Filter)。一個(gè)掛在總線上的節(jié)點(diǎn)可以監(jiān)聽到所有的消息(Message),但通常我們只對(duì)其中某些消息感興趣,這時(shí)怎么辦呢?CAN模塊一般會(huì)提供接收濾波功能(Filter)。通過設(shè)置濾波寄存器,我們可以達(dá)到接收消息時(shí),比對(duì)ID所有位,也可以只比對(duì)ID某些位,從而達(dá)到只接收ID與自己完全相同的消息,或接收ID與自己部分相同的消息的目的。利用這種機(jī)制可以給節(jié)點(diǎn)編組,給組成員群發(fā)消息。
1.2速度快,距離遠(yuǎn)
CAN總線可以達(dá)到1Mbps的速率。總線速度隨著傳輸距離增加而下降,下面是一些典型速率。在一個(gè)數(shù)據(jù)幀內(nèi)可以傳送8個(gè)字節(jié)的數(shù)據(jù)。
1000kbps 40m
500kbps 130m
100kbps 620m
50kbps 1300m
5kbps 10000m
2012年,Bosch又發(fā)布了CANFD(CAN with Flexible Data-rate),最高速率可以達(dá)到10Mbps,在一個(gè)數(shù)據(jù)幀內(nèi)可以傳送64字節(jié)的數(shù)據(jù)。2015 年 ,國際標(biāo)準(zhǔn)化組織(ISO)正式發(fā)布支持CAN FD的11898-1協(xié)議。
2.幀類型
CAN協(xié)議很簡潔,只包含4種幀類型。
數(shù)據(jù)幀(Data Frame),用來把數(shù)據(jù)從發(fā)送節(jié)點(diǎn)傳送至接收節(jié)點(diǎn)。
遠(yuǎn)程幀(Remote Frame),一個(gè)節(jié)點(diǎn)用來請(qǐng)求其它節(jié)點(diǎn)發(fā)送數(shù)據(jù)。一個(gè)節(jié)點(diǎn)發(fā)送遠(yuǎn)程幀時(shí)會(huì)把Arbitration Filed最后一位RTR(置1),具有相同ID的節(jié)點(diǎn)會(huì)把數(shù)據(jù)發(fā)送到總線上。
錯(cuò)誤幀(Error Frame),當(dāng)一個(gè)節(jié)點(diǎn)檢測(cè)到錯(cuò)誤時(shí)會(huì)向總線發(fā)出錯(cuò)誤幀,以通知其它節(jié)點(diǎn)。
過載幀(Overload Frame),用來在數(shù)據(jù)幀或遠(yuǎn)程幀之間插入延時(shí)。
幀間隔(Interframe Space),不是一種幀類型。它是幀之間的間隙,由多個(gè)連續(xù)的隱性電平構(gòu)成。
在編程時(shí)我們直接用到的就是數(shù)據(jù)幀和遠(yuǎn)程幀。軟件編程比較簡單,需要注意的是一般需要設(shè)置寄存器中的初始化請(qǐng)求位(Initialization request),使模塊進(jìn)入初始化狀態(tài),才能開始進(jìn)行CAN模塊的各種配置,初始化完成后退出初始化狀態(tài),進(jìn)入運(yùn)行狀態(tài)。
3.CAN總線應(yīng)用注意事項(xiàng)
3.1終端匹配電阻
在CAN總線的兩端要用120歐的電阻端接進(jìn)行阻抗匹配,因?yàn)镃AN總線長度一般會(huì)比較長,傳輸?shù)?a target="_blank">信號(hào)速度快,特別是信號(hào)的邊沿跳變部分頻率很高。
傳輸線效應(yīng) 平常我們總是認(rèn)為電信號(hào)從一個(gè)引腳發(fā)出,通過導(dǎo)線,瞬間就會(huì)到達(dá)接收引腳,導(dǎo)線上的電壓處處是相等的。但是當(dāng)信號(hào)的頻率很高,或者導(dǎo)線特別長,總之導(dǎo)線的長度接近傳導(dǎo)信號(hào)波長的1/10后,我們就需要轉(zhuǎn)變一下我們的觀念,此時(shí)信號(hào)的傳輸主要受電纜特性阻抗的影響。
電纜特性阻抗 = 信號(hào)電場(chǎng)強(qiáng)度(伏特/米) / 磁場(chǎng)強(qiáng)度(安培/米)
電纜的特性阻抗與電纜的材質(zhì),粗細(xì),線纜之間的距離有關(guān),而與電纜的長度無關(guān)。電纜的特性阻抗還和信號(hào)的頻率有關(guān),但是當(dāng)頻率增加到一定數(shù)值時(shí),特性阻抗不再變化。常用的帶屏蔽雙絞線的特性阻抗是120歐。
信號(hào)在阻抗不連續(xù)處會(huì)產(chǎn)生反射,所以要保持電纜阻抗的連續(xù)性,而且線纜終點(diǎn)需要用等于電纜特性阻抗的電阻進(jìn)行端接,以消耗掉傳輸至端點(diǎn)的信號(hào),否則信號(hào)會(huì)反射回去和后續(xù)發(fā)出的信號(hào)產(chǎn)生疊加,引起錯(cuò)誤。
頻率與波長對(duì)應(yīng)關(guān)系
150K 2000m
500K 600m
1M 300m
10M 30m
端接電阻的另一個(gè)作用是可以使CAN總線從顯性狀態(tài)快速回到隱性狀態(tài)。因?yàn)樵陲@性狀態(tài)下,兩條線纜CAN_H, CAN_L之間的寄生電容會(huì)被充電,如果沒有一個(gè)放電回路,總線不能快速回到隱性狀態(tài)。
3.2EMC防護(hù)
CAN常常工作在強(qiáng)干擾的工業(yè)環(huán)境中,采用屏蔽雙絞線會(huì)極大的提升EMC防護(hù)性能。同時(shí)如果數(shù)字電路部分和CAN收發(fā)器之間用高速光耦隔離開,并且對(duì)兩部分采用完全隔離的電源供電,那么可以把總線上的干擾最大限度地隔離在外部。
需要注意的是屏蔽層只能在一點(diǎn)接入大地。如果在多個(gè)點(diǎn)接地,那么通過大地會(huì)形成電流環(huán)路,反而會(huì)引入噪聲。
3.3時(shí)鐘容差(Oscillator Tolerance)
總線的速度越高,需要的時(shí)鐘精度越高。一般在低于125kpbs時(shí)可以用低成本的陶瓷震蕩器(ceramic resonators),更高的速度下建議使用晶體振蕩器(Quartz,or Crystal Oscilators)。
3.4CAN模塊死機(jī)現(xiàn)象
CAN模塊內(nèi)部有監(jiān)控電路,總線上的異常,如短路等,會(huì)引起錯(cuò)誤計(jì)數(shù)器增長。TEC(Transmit Error Counter), REC(Receive Error Counter)。當(dāng)發(fā)送錯(cuò)誤TEC計(jì)數(shù)超過255后,CAN模塊進(jìn)入BUS-OFF模式,此節(jié)點(diǎn)不能發(fā)送也不能接收。這樣做的好處是可以避免由個(gè)別模塊的問題引起整個(gè)總線不能工作。
芯片一般會(huì)提供兩種恢復(fù)機(jī)制:自動(dòng)和手動(dòng)模式。比如在STM32單片機(jī)中,如果ABOM位設(shè)置為1,CAN模塊將不斷嘗試自動(dòng)恢復(fù)。如果ABOM=0,則需要程序進(jìn)入CAN初始化模式,重新配置后,再退出初始化進(jìn)入正常工作模式。
由于CAN總線非常可靠,不易出錯(cuò),所以在測(cè)試階段建議人為制造一些總線錯(cuò)誤,比如短路,斷路,強(qiáng)干擾之類,看程序是否能從異常狀態(tài)下恢復(fù)。
-
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44563瀏覽量
635848 -
CAN總線
+關(guān)注
關(guān)注
145文章
1952瀏覽量
130807
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論