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