由于Socket CAN涉及到CAN總線協(xié)議、套接字、Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)等。因此,為了能夠全面地了解Socket CAN的原理。我們需要了解以下幾個(gè)方面的知識(shí)點(diǎn):
(1)CAN總線協(xié)議;
(2)Socket原理;
(3)Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng);
當(dāng)熟悉以下三個(gè)方面的知識(shí)點(diǎn)后,我們?cè)偃シ治龌贚inux的Socket CAN的驅(qū)動(dòng)。這樣的話理解起來(lái)更加容易、易懂。
(4)Socket CAN的驅(qū)動(dòng);
一、CAN總線協(xié)議
由于CAN總線協(xié)議的內(nèi)容太多,作為博文來(lái)說(shuō),不適宜很詳細(xì)的講解。需要深入了解的朋友們可以Google一下。以下只是作些簡(jiǎn)要的說(shuō)明。
CAN是ControllerArea Network(控制器局域網(wǎng))的縮寫。CAN通信協(xié)議在1986年由德國(guó)電氣商博世公司所開(kāi)發(fā),主要面向汽車的通信系統(tǒng)。現(xiàn)已是ISO國(guó)際標(biāo)準(zhǔn)化的串行通信協(xié)議。根據(jù)不同的距離、不同的網(wǎng)絡(luò),可配置不同的速度,最高速度為1MBit/s。
CAN被細(xì)分為三個(gè)層次:
(1)CAN對(duì)象層(the object layer);
(2)CAN傳輸層(the transfer layer);
(3)CAN物理層(the phyical layer);
對(duì)象層和傳輸層包括所有由ISO/OSI模型定義的數(shù)據(jù)鏈路層的服務(wù)和功能。
對(duì)象層的作用范圍包括:
(1)查找被發(fā)送的報(bào)文。
(2)確定由實(shí)際要使用的傳輸層接收哪一個(gè)報(bào)文。
(3)為應(yīng)用層相關(guān)硬件提供接口。
傳輸層的作用主要:
(1)傳送規(guī)則,也就是控制幀結(jié)構(gòu)、執(zhí)行仲裁、錯(cuò)誤檢測(cè)、出錯(cuò)標(biāo)定、故障界定。
(2)總線上什么時(shí)候開(kāi)始發(fā)送新報(bào)文及什么時(shí)候開(kāi)始接收?qǐng)?bào)文,均在傳輸層里確定。
(3)位定時(shí)的一些普通功能也可以看作是傳輸層的一部分。
(4)傳輸層的修改是受到限制的。
物理層的作用:
在不同節(jié)點(diǎn)之間根據(jù)所有的電氣屬性進(jìn)行位信息的實(shí)際傳輸。當(dāng)然,同一網(wǎng)絡(luò)內(nèi),物理層對(duì)于所有的節(jié)點(diǎn)必須是相同的。盡管如此,在選擇物理層方面還是很自由的。
圖1 CAN協(xié)議所對(duì)應(yīng)的ISO模型
CAN具有以下的屬性:
(1)報(bào)文(Messages):簡(jiǎn)單來(lái)說(shuō)就是具有固定格式的數(shù)據(jù)包。
(2)信息路由(Information Routing):即,報(bào)文尋找結(jié)點(diǎn)的方式。
(3)位速率(Bit rate):數(shù)據(jù)位的傳輸速度。
(4)優(yōu)先權(quán)(Priorities):即報(bào)文發(fā)送的優(yōu)先權(quán)。
(5)遠(yuǎn)程數(shù)據(jù)請(qǐng)求(Remote Data Request):通過(guò)發(fā)送遠(yuǎn)程幀,需要數(shù)據(jù)的節(jié)點(diǎn)可以請(qǐng)求另一節(jié)點(diǎn)發(fā)送相應(yīng)的數(shù)據(jù)幀。
(6)多主機(jī)(Multimaster):總線空閑時(shí),任何結(jié)點(diǎn)都可以開(kāi)始傳送報(bào)文。
(7)仲裁(Arbitration):當(dāng)2個(gè)及以上的單元同時(shí)開(kāi)始傳送報(bào)文,那么就會(huì)有總線訪問(wèn)沖突。仲裁是確定哪個(gè)單元的具有發(fā)送優(yōu)先權(quán)。
(8)安全性(Safety):CAN的每一個(gè)節(jié)點(diǎn)均采取了強(qiáng)有力的措施以進(jìn)行錯(cuò)誤檢測(cè)、錯(cuò)誤標(biāo)定及錯(cuò)誤自檢。
(9)錯(cuò)誤檢測(cè)(Error Detection):包括監(jiān)視、循環(huán)冗余檢查、位填充、報(bào)文格式檢查。
(10)錯(cuò)誤檢測(cè)的執(zhí)行(Performance of Error Detection)
(11)錯(cuò)誤標(biāo)定和恢復(fù)時(shí)間(Error Sinalling and Recovery Time):任何檢測(cè)到錯(cuò)誤的結(jié)點(diǎn)會(huì)標(biāo)志出已損壞的報(bào)文。此報(bào)文會(huì)失效并將自動(dòng)地開(kāi)始重新傳送。如果不再出現(xiàn)新的錯(cuò)誤,從檢測(cè)到錯(cuò)誤到下一報(bào)文的傳送開(kāi)始為止,恢復(fù)時(shí)間最多為29個(gè)位的時(shí)間。
(12)故障界定(Fault Confinement):CAN結(jié)點(diǎn)能夠把永久故障和短暫擾動(dòng)區(qū)分開(kāi)來(lái)。永久故障的結(jié)點(diǎn)會(huì)被關(guān)閉。
(13)連接(Connections):CAN串行通訊鏈路是可以連接許多結(jié)點(diǎn)的總線。理論上,可連接無(wú)數(shù)多的結(jié)點(diǎn)。但由于實(shí)際上受延遲時(shí)間或者總線線路上電氣負(fù)載的影響,連接結(jié)點(diǎn)的數(shù)量是有限的。
(14)單通道(Single Channel):總線是由單一進(jìn)行雙向位信號(hào)傳送的通道組成。
(15)總線值(Bus value):總線可以具有兩種互補(bǔ)的邏輯值之一:“顯性”(可表示為邏輯0)或“隱性”(可表示為邏輯1)。
(16)應(yīng)答(Acknowledgment):所有的接收器檢查報(bào)文的連貫性。對(duì)于連貫的報(bào)文,接收器應(yīng)答;對(duì)于不連貫的報(bào)文,接收器作出標(biāo)志。
(17) 睡眠模式/喚醒(Sleep Mode / Wake-up):為了減少系統(tǒng)電源的功率消耗,可以將CAN器件設(shè)為睡眠模式以便停止內(nèi)部活動(dòng)及斷開(kāi)與總線驅(qū)動(dòng)器的連接。CAN器件可由總線激活,或系統(tǒng)內(nèi)部狀態(tài)而被喚醒。
1、CAN總線的報(bào)文格式
CAN傳輸?shù)膱?bào)文,可分為五種類型:
(1)數(shù)據(jù)幀:用于發(fā)送結(jié)點(diǎn)向接收結(jié)點(diǎn)傳送數(shù)據(jù)的幀。
(2)遠(yuǎn)程幀:總線結(jié)點(diǎn)發(fā)出遠(yuǎn)程幀,請(qǐng)求發(fā)送具有同一識(shí)別符的數(shù)據(jù)幀。
(3)錯(cuò)誤幀:任何結(jié)點(diǎn)檢測(cè)到一總線錯(cuò)誤就發(fā)出錯(cuò)誤幀。
(4)過(guò)載幀:過(guò)載幀用以在先行的和后續(xù)的數(shù)據(jù)幀(或遠(yuǎn)程幀)之間提供一附加的延時(shí)。
(5)幀間隔:用于將數(shù)據(jù)幀及遠(yuǎn)程幀與前面的幀分離開(kāi)來(lái)的幀。
數(shù)據(jù)幀由7個(gè)不同的位場(chǎng)組成:
數(shù)據(jù)幀有標(biāo)準(zhǔn)格式和和遠(yuǎn)程格式,以下是其格式表示:
圖2 數(shù)據(jù)幀格式
遠(yuǎn)程幀由6個(gè)不同的位場(chǎng)組成:
遠(yuǎn)程幀沒(méi)有數(shù)據(jù)幀的數(shù)據(jù)場(chǎng),以下是其格式表示:
圖3 遠(yuǎn)程幀格式
錯(cuò)誤幀用于在接收和發(fā)送消息時(shí)檢測(cè)出錯(cuò)誤,通知錯(cuò)誤的幀。錯(cuò)誤幀由錯(cuò)誤標(biāo)志和錯(cuò)誤界定符構(gòu)成。
錯(cuò)誤標(biāo)志包括主動(dòng)錯(cuò)誤標(biāo)志和被動(dòng)錯(cuò)誤標(biāo)志兩種。
主動(dòng)錯(cuò)誤標(biāo)志:6個(gè)位的顯性位,處于主動(dòng)錯(cuò)誤狀態(tài)的單元檢測(cè)出錯(cuò)誤時(shí)輸出的錯(cuò)誤標(biāo)志。
被動(dòng)錯(cuò)誤標(biāo)志:6個(gè)位的隱性位,處于被動(dòng)錯(cuò)誤狀態(tài)的單元檢測(cè)出錯(cuò)誤時(shí)輸出的錯(cuò)誤標(biāo)志。
錯(cuò)誤界定符由8個(gè)位的隱性位構(gòu)成。
錯(cuò)誤幀格式如下表示:
圖4 錯(cuò)誤幀格式
過(guò)載幀是用于接收單元通知其尚未完成接收準(zhǔn)備的幀。過(guò)載幀由過(guò)載標(biāo)志和過(guò)載界定符構(gòu)成。過(guò)載幀格式如下表示:
圖5 過(guò)載幀格式
幀間隔是用于分隔數(shù)據(jù)幀和遠(yuǎn)程幀的幀。數(shù)據(jù)幀和遠(yuǎn)程幀可通過(guò)插入幀間隔將本幀與前面的任何幀(數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀、過(guò)載幀)分開(kāi)。過(guò)載幀和錯(cuò)誤幀前不能插入幀間隔。幀間隔如下圖所示:
圖6 幀間隔格式
2、CAN總線的仲裁方式
在總線空閑態(tài),最先開(kāi)始發(fā)送消息的單元獲得發(fā)送權(quán)。多個(gè)單元同時(shí)開(kāi)始發(fā)送時(shí),各發(fā)送單元從仲裁段的第一位開(kāi)始進(jìn)行仲裁。連續(xù)輸出顯性電平最多的單元可繼續(xù)發(fā)送。即逐位地對(duì)比各個(gè)結(jié)點(diǎn)發(fā)出的報(bào)文ID。由于線與的關(guān)系,顯示位“0”可以覆蓋隱性位“1”,因此ID最小的節(jié)點(diǎn)贏得仲裁,總線上表現(xiàn)為該結(jié)點(diǎn)的報(bào)文,其他結(jié)點(diǎn)失去仲裁,退出發(fā)送,轉(zhuǎn)為接收狀態(tài)。
標(biāo)準(zhǔn)格式ID與具有相同ID的遠(yuǎn)程幀或者擴(kuò)展格式的數(shù)據(jù)幀在總線上競(jìng)爭(zhēng)時(shí),標(biāo)準(zhǔn)格式的RTR位為顯性位的具有優(yōu)先權(quán),可繼續(xù)發(fā)送。
圖7 仲裁方式
3、位填充(BitStuffing)
位填充是為了防止突發(fā)錯(cuò)誤而設(shè)定的功能。位填充的規(guī)則如下:
(1)5位連續(xù)相同電平之后,必須填充一位反向位,即不允許有6個(gè)連續(xù)相同位;
(2)SOF之前為總線空閑狀態(tài),不需要同步,因此不需要位填充;
(3)CRC之后為固定格式,不允許填充;
(4)由CAN控制器自動(dòng)實(shí)現(xiàn);
4、CAN的錯(cuò)誤處理
CAN控制器檢測(cè)錯(cuò)誤共有以下5種:
(1)位填充錯(cuò)誤;
在使用位填充的幀場(chǎng)內(nèi),結(jié)點(diǎn)如果檢測(cè)到6個(gè)連續(xù)相同的位值,則產(chǎn)生位填充錯(cuò)誤,在下一位開(kāi)始時(shí),該結(jié)點(diǎn)將發(fā)送一個(gè)錯(cuò)誤幀。
(2)位錯(cuò)誤;
在發(fā)送期間,結(jié)點(diǎn)檢測(cè)到總線的位值與自身發(fā)送的位值不一致時(shí),則產(chǎn)生位錯(cuò)誤,在下一位開(kāi)始時(shí),該結(jié)點(diǎn)將發(fā)送一個(gè)錯(cuò)誤幀。
(3)CRC錯(cuò)誤;
接收結(jié)點(diǎn)計(jì)算的CRC碼與數(shù)據(jù)幀本身自帶的CRC碼不一致,接收結(jié)點(diǎn)將丟棄該幀,并在ACK界定符之后發(fā)送一個(gè)錯(cuò)誤幀。
(4)應(yīng)答錯(cuò)誤;
發(fā)送結(jié)點(diǎn)在ACK Slot位會(huì)發(fā)送隱性位,同時(shí)監(jiān)聽(tīng)總線是否為顯性位,如果是顯性位,則表明至少一個(gè)節(jié)點(diǎn)正確收到該幀;如果是隱性位,將產(chǎn)生ACK錯(cuò)誤,發(fā)送結(jié)點(diǎn)發(fā)送一個(gè)錯(cuò)誤幀。
(5)格式錯(cuò)誤;
發(fā)送結(jié)節(jié)在(CRC界定符、ACK界定符、幀結(jié)束EOF)固定格式的位置檢測(cè)到顯性位時(shí),將發(fā)生格式錯(cuò)誤,并發(fā)送一個(gè)錯(cuò)誤幀。
5、CAN總線同步
CAN總線的通信方式為NRZ方式。各個(gè)位的開(kāi)關(guān)或者結(jié)尾都沒(méi)有附加同步信號(hào)。發(fā)送結(jié)點(diǎn)以與位時(shí)序同步的方式開(kāi)始發(fā)送數(shù)據(jù)。另外,接收結(jié)點(diǎn)根據(jù)總線上電平的變化進(jìn)行同步并進(jìn)行接收工作。
但是,發(fā)送結(jié)點(diǎn)和接收結(jié)點(diǎn)存在的時(shí)鐘頻率誤差及傳輸路徑上的(電纜、驅(qū)動(dòng)器等)相位延遲會(huì)引進(jìn)同步偏差。因此接收結(jié)點(diǎn)需要通過(guò)同步的方式調(diào)整時(shí)序進(jìn)行接收。
同步的作用是盡量使本地位時(shí)序與總結(jié)信號(hào)的位時(shí)序一致(本地同步段與總結(jié)信號(hào)邊沿同步)。只有接收結(jié)點(diǎn)需要同步;同步只會(huì)發(fā)生在隱性到顯性電平的跳沿。
同步的方式為硬件同步和再同步。
-
CAN
+關(guān)注
關(guān)注
57文章
2769瀏覽量
464378 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210387 -
Socket
+關(guān)注
關(guān)注
0文章
212瀏覽量
34885
原文標(biāo)題:嵌入式Linux下的Socket CAN驅(qū)動(dòng)理解
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
嵌入式Linux下的USB設(shè)備驅(qū)動(dòng)技術(shù)
![<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>下</b>的USB設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>技術(shù)](https://file1.elecfans.com//web2/M00/A5/95/wKgZomUMORmAR5K-AABIzpy1YR8305.jpg)
嵌入式LINUX下,CAN都是用socketcan嗎?會(huì)要求自己寫驅(qū)動(dòng)嗎
嵌入式Linux下LED報(bào)警燈驅(qū)動(dòng)設(shè)計(jì)
基于嵌入式LINUX下CAN設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)
嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用
嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用
嵌入式Linux下CAN總線驅(qū)動(dòng)程序設(shè)計(jì).rar
![<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>下</b><b class='flag-5'>CAN</b>總線<b class='flag-5'>驅(qū)動(dòng)</b>程序設(shè)計(jì).rar](https://file.elecfans.com/web2/M00/49/5B/pYYBAGKhtEiAdFcsAAAJ60J7Tcc765.jpg)
嵌入式Linux系統(tǒng)和驅(qū)動(dòng)開(kāi)發(fā)
嵌入式Linux下CAN接口調(diào)試
ARM11嵌入式系統(tǒng)Linux下LCD的驅(qū)動(dòng)的設(shè)計(jì)
![ARM11<b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>Linux</b><b class='flag-5'>下</b>LCD的<b class='flag-5'>驅(qū)動(dòng)</b>的設(shè)計(jì)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式linux報(bào)警,嵌入式Linux下LED報(bào)警燈驅(qū)動(dòng)設(shè)計(jì)及編程.doc
![<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>報(bào)警,<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>下</b>LED報(bào)警燈<b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)及編程.doc](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論