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