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