首先,什么是CAN呢。
學(xué)過散裝英語的人,應(yīng)該都有知道有一個(gè)單詞叫can 。
那我們要講的這個(gè)CAN,很多時(shí)候,發(fā)音可以和can一樣。
這么說來,CAN通信的CAN,并不是一個(gè)單詞,而是縮寫了。
那這個(gè)CAN是由什么縮寫的呢。
Controller
Area
Network
組合起來就是CAN了。接觸過CAN的讀者應(yīng)該了解,CAN應(yīng)用在汽車總線比較多。
一開始我也以為CAN里的C,指的是Car。Car Area Network ,唉,好像也可以哦。
拋開散裝英語,這那個(gè)CAN,大意就是一種控制器的局域(區(qū)域)網(wǎng)絡(luò)總線了。
就是支持CAN通信的設(shè)備,通過總線接到一個(gè)通信局域網(wǎng)絡(luò)里。這個(gè)局域網(wǎng)和我們說的以太網(wǎng)的局域網(wǎng)不是一回事。
實(shí)際上,在控制器通信數(shù)據(jù)采集領(lǐng)域,其實(shí)應(yīng)該是由以太網(wǎng),串口和CAN三分天下的局面。
三者都支持總線。但是我們常見的主要是以太網(wǎng)和串口的控制器居多。高端點(diǎn)的主要是以太網(wǎng),低端的設(shè)備主要就是串口。可能也和易用性,成本等原因,當(dāng)然也有領(lǐng)域的不同吧。
像CAN主要在于汽車領(lǐng)域?yàn)橹鳌?/p>
那些說還有什么SPI,IIC,IIS,1-Wire之類的,你出去。此總線非彼總線。
那么CAN不是以太網(wǎng),它是什么呢。
請(qǐng)看。
在筆者報(bào)名參加了88塊學(xué)畫畫培訓(xùn)班之后,畫下了如下不是很嚴(yán)謹(jǐn)?shù)腃AN總線圖。
為什么說不嚴(yán)謹(jǐn)呢。因?yàn)闆]有畫上地線,還在終端電阻之類的。
眼力好的同學(xué)呢,很快就發(fā)現(xiàn)了,CAN總線,其實(shí)就是由H線和L線組成的。
似乎有一種似曾相識(shí)的感覺,卻又說不上為什么,這么咋一看,說它是485總線都會(huì)有人信。
單純從線來看,確實(shí)和485總線很相似。所以接下來介紹CAN,會(huì)盡量和我們熟悉的485總線類比。
CAN總線的這兩根線呢,一般叫做CAN-High和CAN-Low。簡(jiǎn)稱嘛就是CAN-H和CAN-L .
再簡(jiǎn)一點(diǎn)就是H和L了。
會(huì)有同學(xué)問了,可以再簡(jiǎn)一些嘛。這個(gè)問題問得好。
據(jù)悉,有些485設(shè)備已經(jīng)可以不區(qū)分+和-,也就是485的A和B兩根線可以反著接也能自動(dòng)識(shí)別和適應(yīng)。
但是在CAN設(shè)備上,這個(gè)不是很成熟,所以,還是盡量要區(qū)分H和L。
同樣的,CAN的通信,也是靠H和L兩根線的差分信號(hào)進(jìn)行傳輸信號(hào)的。這點(diǎn)和485很類似了。
(圖片來源于網(wǎng)絡(luò))
通過不同的電平組合信號(hào),就能傳輸0和1信號(hào),也就是一個(gè)位的信號(hào)。
8個(gè)位就組成一個(gè)字節(jié)。N個(gè)字節(jié)就組成了CAN協(xié)議了。
(圖片來源于網(wǎng)絡(luò))
(圖片來源于網(wǎng)絡(luò))
CAN的通信和485(也就是串口通信)很類似,也是有什么起始位,停止位之類的。
只是CAN會(huì)復(fù)雜一些,多了很多段。
其實(shí)多出來的內(nèi)容,無非就是增加CAN通信的各種穩(wěn)定性,協(xié)議可靠性等等。
對(duì)用戶來說,那個(gè)起始位停止位其實(shí)不關(guān)心的。
只需要CAN設(shè)備雙方通信參數(shù)匹配,就可以用來傳輸應(yīng)用層數(shù)據(jù)了。
所以應(yīng)用層數(shù)據(jù)才是我們比較關(guān)心的,也是我們使用中用到的。
剛才也提到了,CAN通信雙方參數(shù)匹配,主要是要適配哪些呢。
像串口通信,要設(shè)置的波特率,數(shù)據(jù)位,停止位,校驗(yàn)位。
但是CAN呢,很多時(shí)候,只需要設(shè)置波特率就可以了。
畢竟波特率也是影響傳輸速度和距離的關(guān)鍵因素,至于什么數(shù)據(jù)位,校驗(yàn)位,CAN通信懶得去讓用戶設(shè)置,全都統(tǒng)一多好。省得用戶一個(gè)個(gè)去操心了,是吧。
與其叫波特率,其實(shí)叫比特率更為合適。不同的比特率,能支持的通信線長(zhǎng)度也不一樣。具體根據(jù)需要匹配即可。
超過500米的通信線通信,筆者還沒有嘗試過,有條件的同學(xué),可以去購(gòu)買繁易支持CAN通信的FBox網(wǎng)關(guān)或者觸摸屏去使用。
前面介紹了一大堆,簡(jiǎn)單用幾句話概括就是:
CAN通信只需要兩根線(H,L),雙方設(shè)置同樣的波特率,就可以進(jìn)行收發(fā)數(shù)據(jù)。
CAN收發(fā)數(shù)據(jù),收的是什么,發(fā)的又是什么呢。
這應(yīng)該是CAN通信關(guān)鍵的內(nèi)容了。
CAN通信和串口通信不一樣。
串口通信至少要發(fā)送一個(gè)字節(jié),通信雙方需要約定好通信內(nèi)容格式長(zhǎng)度等,比較著名的就是modbus協(xié)議,當(dāng)然還有各種PLC協(xié)議的串口協(xié)議,也都是約定好格式。
而CAN通信,在這點(diǎn)就稍微好一些,只要是CAN通信的,都是標(biāo)準(zhǔn)的。
不管是哪一家的CAN設(shè)備,通信雙方收發(fā)的內(nèi)容格式,就是統(tǒng)一的。
就像串口通信,都規(guī)定使用modbus rtu協(xié)議一樣。
那我們這個(gè)CAN協(xié)議報(bào)文,就和modbus 類比一下。
modbus的通信,主要是讀取位和字變量。位有0x,1x,字有3x,4x。地址訪問都是65535個(gè)。
就拿4x地址來說,就是有65535個(gè)字。一個(gè)字是16個(gè)位。
可以把modbus理解為16位數(shù)據(jù)寬度的協(xié)議。modbus就類比于16位系統(tǒng)電腦。
看看CAN報(bào)文。CAN_ID如果類比于4X這樣的寄存器地址的話,地址是有536870911個(gè)地址,5億個(gè)地址。
然后每個(gè)地址能表示的數(shù)據(jù)是8個(gè)字節(jié),也就是4個(gè)字。64個(gè)位。
那CAN就是64位系統(tǒng)了。
modbus為6萬個(gè)字。
CAN為5億個(gè)4字,10億個(gè)雙字,20億個(gè)字。地址表示空間范圍遠(yuǎn)超串口的modbus 。
在CAN報(bào)文里,最前面三個(gè)位,主要是標(biāo)志位。用于表示不同的通信類型。
就剛才的報(bào)文格式來看,好像說不上為什么,感覺看得懂,但又哪里不太明白,也不知道怎么問。
學(xué)過modbus報(bào)文的人都知道,modbus報(bào)文呢,有主站發(fā)送方和從站回復(fù)方的。主站請(qǐng)求數(shù)據(jù),從站回復(fù)數(shù)據(jù)。主從站報(bào)文不一樣的。。
這就對(duì)了,從報(bào)文上,沒有提到誰是主,誰是從哦。難道主從發(fā)送的都是同樣的報(bào)文。
沒錯(cuò),就是這么大膽。
比如0000 0012 08 00 01 02 03 04 05 06 07 這個(gè)CAN報(bào)文,
指就是幀ID地址為0x12,發(fā)送8個(gè)數(shù)據(jù)長(zhǎng)度,數(shù)據(jù)內(nèi)容是00 01 02 03 04 05 06 07 。
主站可以發(fā)送給從站,從站也可以發(fā)送給主站。
CAN報(bào)文可以沒有主從概念。但是我們從使用上,可以分主從。
從站發(fā)這個(gè)報(bào)文給主站,相當(dāng)于上報(bào)從站的數(shù)據(jù)給主站,比如溫度,濕度等變量。
如果是主站發(fā)送這個(gè)報(bào)文給從站,相當(dāng)于主站給從站發(fā)送寫命令或者控制命令。
思維敏捷的同學(xué)馬上就反應(yīng)過來了。
我主站都沒有問呢,你個(gè)從站就給我發(fā)內(nèi)容,你知道我要讀什么內(nèi)容了嗎?
剛才提到,CAN總線的地址負(fù)載能力大概在5億個(gè)左右。如果是標(biāo)準(zhǔn)幀,只有0x7FF個(gè)。
那么就需要使用CAN通信設(shè)備的人,進(jìn)行地址規(guī)劃,什么地址內(nèi)容代表什么。
話是這么說了,但是一想,好像哪里不對(duì)。modbus是可以主動(dòng)請(qǐng)求數(shù)據(jù)的。難道CAN也不行嗎?
這就是所謂的遠(yuǎn)程幀了。
遠(yuǎn)程幀呢,大概意思就是,主站如果想請(qǐng)求某個(gè)幀ID(地址)的數(shù)據(jù),剛向總線發(fā)送一個(gè)遠(yuǎn)程幀。也就是這個(gè)報(bào)文上,某個(gè)標(biāo)志位置1的事。這時(shí)候?qū)Ψ皆O(shè)備向總線發(fā)送數(shù)據(jù)幀,就完成一次主動(dòng)請(qǐng)求數(shù)據(jù)了。
補(bǔ)充一下,另一個(gè)設(shè)備收到遠(yuǎn)程幀呢,在CAN里面,并不會(huì)要求其它設(shè)備一定要回復(fù)。回復(fù)不回復(fù)遠(yuǎn)程幀,取決于這個(gè)CAN設(shè)備的程序,可以回,可以不回,愛回不回。
以上就是通俗的介紹一些CAN通信的內(nèi)容了,拋開那些繁瑣的細(xì)節(jié)。畢竟對(duì)我們CAN的使用者來說,不需要深入了解CAN里的每一個(gè)細(xì)節(jié)。
有時(shí)候就是把CAN設(shè)備拿出來,把兩根線接好,上電,通信進(jìn)行通信,看到數(shù)據(jù)即可。大不了就是設(shè)置了一個(gè)波特率。
雙方再維護(hù)一下數(shù)據(jù)點(diǎn)表,哪個(gè)地址代表什么意思。對(duì)著數(shù)據(jù)點(diǎn)表添加數(shù)據(jù),調(diào)試,通信正常,關(guān)機(jī),走人。
CAN通信只是一個(gè)基本的通信接口或者協(xié)議。
在CAN之后,還有CANOpen之樣的二次協(xié)議。
評(píng)論
查看更多