LIN總線是目前常見的一種A類網(wǎng)絡協(xié)議。LIN的全稱為Local Interconnect Network。LIN主要功能是為CAN總線網(wǎng)絡提供輔助功能,應用場合有智能傳感節(jié)點、自動車窗節(jié)點等。目前最新的LIN協(xié)議是LIN2.2,制定于2010年。LIN的一大優(yōu)點是成本低,但其最大傳輸速率為20Kbps。建議的通信速率如下,低速2400bps,中速9600bps,高速19200bps。根據(jù)OSI參考模型,LIN總線僅規(guī)范了數(shù)據(jù)鏈路層和物理層。
LIN的部分應用
LIN的特點如下:
1.采用單主多從的組網(wǎng)方式,無CAN總線那樣的仲裁機制,最多可連接16個節(jié)點(1主15從)。 2.對硬件要求簡單,僅需UART/SCI 接口,輔以簡單驅動程序便可實現(xiàn) LIN 協(xié)議。故幾乎所有的MCU均支持LIN。 3.不需要單獨的晶振,便能完成主、從節(jié)點的同步,硬件成本大幅降低。 4.僅使用一根信號線便可完成信息的傳輸,即所謂的單總線設備。 5.傳輸速率最高可達20Kbps,符合A類網(wǎng)絡標準,滿足車身控制需要。 6.LIN 網(wǎng)絡中新節(jié)點的加入,對網(wǎng)絡中其他原有節(jié)點的軟硬件設計不會造成影響。
LIN網(wǎng)絡主從節(jié)點的功能
LIN網(wǎng)絡中的節(jié)點任務分為主機任務和從機任務兩類。其中,主機任務只在主機節(jié)點上運行,而從機任務在主機節(jié)點和從機節(jié)點上均可運行。也就是說,主機節(jié)點可以實現(xiàn)主機任務和從機任務。 A.主機任務主要執(zhí)行以下功能: 1.定義總線上的通信速率。(同步場?待考) 2.發(fā)送報文幀頭,包含同步間隔場、同步場和標識符場三個部分。 3.監(jiān)控總線通信,通過校驗和確定數(shù)據(jù)正確性與否。 4.使從機進入喚醒或睡眠狀態(tài),并響應從機的喚醒要求。 B.從機任務既可運行于主機又可運行于從機,它主要完成以下功能: 1.等待主機任務發(fā)送的同步間隔,使從機與主機于同步場中獲得同步。 2.分析標識符場,若與自己相關,則接收或發(fā)送數(shù)據(jù),若與自己無關則什么都不做。 3.檢查和發(fā)送校驗和。 4.接受主機任務的喚醒和睡眠請求。 綜上,主機報文的標識符能觸發(fā)與之對應的不同從機之間的通信。
LIN報文的幀結構
LIN 總線上具有“顯性”和“隱性”兩種互補的邏輯電平。其中,顯性電平(參考地電壓)是邏輯 0,隱性電平(電源電壓)是邏輯1。 LIN在總線上以具有固定格式的報文進行傳遞,但是這種報文數(shù)據(jù)段的長度是可以調整的。LIN網(wǎng)絡中的所有節(jié)點(包括主機節(jié)點)都具有從機任務,當接到主機任務的報文信息時,它們中的某一個要對報文做出響應。
報文頭僅可以由主機節(jié)點發(fā)出 LIN總線的一幀主要由兩部分組成,即報文頭(Header)和報文響應(Response)。其中,報文頭是由一個主機節(jié)點的主機任務發(fā)出的,而報文響應(以下簡稱響應)是由一個主機節(jié)點或從機節(jié)點的從機任務發(fā)出的。其中報文頭由同步間隔場(最小13個顯性位)、同步場(1個字節(jié),數(shù)據(jù)不變,0x55)、和PID場(1個字節(jié))三部分組成;報文響應由2/4/8個字節(jié)的數(shù)據(jù)場、校驗和場(1個字節(jié))所組成。報文頭和響應之間有一個幀內空間分隔,最小空間為0。
LIN的幀結構(英文版)
LIN的幀結構(彩圖版)
LIN的幀結構
示波器采出來的LIN波形,能看出0x00和0x55 LIN 的字節(jié)場格式就是通常的“SCI”或“UART”串行數(shù)據(jù)格式(N81編碼)。即每個字節(jié)場的長度是10個位定時(BIT TIME):1bit起始位+8bits數(shù)據(jù)位+1bit停止位。 起始位(START BIT)是一個“顯性”位,它標志著字節(jié)場的開始。接著是8個數(shù)據(jù)位,首先發(fā)送最低位。停止位(STOP BIT)是一個“隱性”位,它標志著字節(jié)場的結束。LIN報文幀中的同步場、標識符場、數(shù)據(jù)場、校驗和場的格式都符合上述字節(jié)場的格式。 下面對幾個重要的部分詳細說明。
同步間隔場
間隔場是唯一一個不符合字節(jié)場格式的場。從節(jié)點需要檢測到至少連續(xù)11個顯性位才認為是間隔信號。
同步場
一個字節(jié),即0x55。
LIN的被保護標識符場(PID場)
PID場定義了報文的內容和長度。如圖,PID場分為6個標識符位和2個ID奇偶校驗位。6個標識符位我們稱之為ID。如果加上2個奇偶校驗位就變成PID了,即Protected ID。6個標識符位中,標識符后兩位為數(shù)據(jù)長度控制位。總的來看,ID的范圍是0-0x3F。注意是ID,不是PID。要區(qū)分開。這一段要講的是我們需要將LIN的ID與PID分清楚,不能混淆。
上圖中的ID4和ID5為數(shù)據(jù)長度控制位(ID4是低位)。值為00或10時,數(shù)據(jù)長度為2個字節(jié)。值為01時,數(shù)據(jù)長度為4個字節(jié)。值為11時,數(shù)據(jù)長度為8個字節(jié)。在實際應用中,我并沒有發(fā)現(xiàn)ID4和ID5與真實的數(shù)據(jù)長度有什么關系。接觸到的LIN報文均為8個字節(jié)的數(shù)據(jù)。 P0和P1為奇偶校驗位,算法如下:
?
#include
?
?
數(shù)據(jù)場
數(shù)據(jù)場主要需注意每個字節(jié)先傳輸?shù)氖亲畹臀弧<慈绻骋恍盘栭L度超過1個字節(jié),采用低位在前的方式發(fā)送(小端)。
校驗和場(checksum)
校驗和場是數(shù)據(jù)場所有字節(jié)的和的反碼。所有數(shù)據(jù)字節(jié)的和的補碼,與校驗和字節(jié)相加所得的和必須是0xFF。 算法(Classical):累加所有字節(jié)。對每次加和進行判斷,如果和大于0xFF,那么就把高八位的1,與低八位相加,其實就是低八位加1(翻轉八位和)。得到最后的結果后,取其反碼,我們就得到了最后的校驗和。參照下圖理解一下。
如何算出LIN的校驗和場 講解一下上面的圖,0x4A+0x55 = 0x9F這個沒有疑問,再加0x93 = 0x132,很明顯,超過了0xFF,分解為0x1和0x32,突出的高8位刪除,加到低8位中,0x1+0x32=0x33。再加0xE5 = 0x118,又超了,0x1+0x18=0x19。取反(Not),0xE6。 練習:下圖是一些LIN總線數(shù)據(jù),以最后一組為例,2個0xFF之和為0x1FE,處理后仍然為0xFF。故8個0xFF加和之后仍為0xFF,取反碼為0x00。
一組LIN報文
校驗和場的兩種類型
校驗和場通常會有兩種不同的類型,英文簡稱為CST(Checksum Type)。一種是classic checksum(LIN 1.3),一種是enhanced checksum(LIN 2.0及以上)。上文講到的校驗和場算法實際上是classic的,即只對Data(數(shù)據(jù)場)進行校驗和的計算。Enhanced Checksum在計算時需要把PID也加入到計算隊列中。
9600波特率下,ChecksumType為classic 下圖是CST(校驗和類型)為Enhanced時的報文形態(tài)。此時校驗和的計算需要包含前面的PID字節(jié)。舉例,下圖中第一幀報文,ID為0x02,PID通過查表(參考文獻5)可得到對應的PID是0x42,0x42的反碼是0xBD。原理上一樣,只不過計算校驗和的時候,需要把PID也放進去。
PLIN-USB收到的LIN報文,很詳細 這里有個知識點一定要注意:標識符為0x3C和0x3D的幀只能使用經(jīng)典校驗,這兩組幀是LIN的診斷幀。即LIN 2.0及以上才有的診斷幀,需要使用經(jīng)典校驗,不能將PID也加入到校驗計算序列。自己寫LIN驅動的小伙伴要格外注意。
用Kvaser收到的第一個LIN報文 LIN總線的布線組網(wǎng) LIN網(wǎng)絡的節(jié)點數(shù)量不應超過16個,否則節(jié)點增加將減少網(wǎng)絡阻抗,會導致環(huán)境條件變差,從而不能進行正常的無錯誤通訊。BOSCH汽車電氣與電子中這樣描述,“LIN總線規(guī)范中沒有規(guī)定總線允許的最大節(jié)點數(shù)。......但實際應用中,為了保證數(shù)據(jù)傳輸?shù)目煽啃裕偩€允許的最大節(jié)點數(shù)為16個。“ 實驗證明(該實驗需要考證),每增加一個節(jié)點,就會減少約3%的阻抗;網(wǎng)絡中的通訊導線長度應小于或等于40m;主機節(jié)點的總線端電阻典型值是1k?,從機節(jié)點是30 k?。
LIN總線的應用
LIN總線上可以傳輸?shù)膬深悢?shù)據(jù),信號報文和診斷報文。 診斷報文的輸送是在具有兩個保留標識符的幀里面完成的。數(shù)據(jù)場的判讀取決于數(shù)據(jù)場本身以及通訊節(jié)點的狀態(tài)。 LIN具有調度表機制。調度表負責調度網(wǎng)絡各報文發(fā)送的順序。調度表在網(wǎng)絡系統(tǒng)設計階段確定。調度表使得LIN通信具有可預測性。主任務可以擁有多個調度表,并在不同的調度表之間切換。 LIN的描述文件叫做LDF文件,可以設置報文幀,信號和調度表等。
LIN幀的分類
LIN幀按照幀類型來分類可以分為普通幀、事件觸發(fā)幀、零星幀、診斷幀、用戶自定義幀和保留幀。 普通幀的標識符(ID)為0到0x3B。主任務發(fā)出報文頭,一個任務響應,一個或多個任務接收。 事件觸發(fā)幀的標識符為0到0x3B。事件觸發(fā)幀必須有一個獨立的ID,該ID可以與多個普通幀相關聯(lián)。在事件觸發(fā)幀時隙內發(fā)送幀頭,只有當相關聯(lián)的無條件幀內有信號被更新時,才發(fā)送幀響應。幀響應的第一個數(shù)據(jù)字節(jié)等于標識符,即響應最多可以傳輸7個字節(jié)的數(shù)據(jù);如果沒有幀響應,幀頭被忽略。幀響應可由多個節(jié)點發(fā)送,發(fā)生沖突時切換到“沖突解決調度表”,之后再切換回到原來的調度表。 零星幀表示共用一個時隙、在需要時才被發(fā)送的一組普通幀。標識符為0到0x3B。 診斷幀用來傳輸診斷或配置信息,一般包含8個字節(jié)數(shù)據(jù)。0x3C為主請求幀,0x3D為從響應幀(注意校驗方式是classic!)。診斷響應基于ISO15765-2傳輸層和ISO14229應用層。
診斷幀 用戶自定義幀標識符為0x3E,可以傳輸任何用戶自定義的信息。 保留幀的標識符為0x3F。略。 ? 關于LIN的版本 LIN2.0新增加了下列屬性:“增強校驗和(Enhanced)”、“重新配置和診斷”、“波特率自動探測”、“響應錯誤狀態(tài)監(jiān)控”。LIN2.0從機節(jié)點無法與LIN1.3主機節(jié)點操作。 關于睡眠 主節(jié)點可以發(fā)送一幀ID為0x3c,第一個字節(jié)為零的主請求幀來使處于工作狀態(tài)的從節(jié)點進入睡眠。這幀報文稱為睡眠指令。 從節(jié)點在接到睡眠指令之后,也可以選擇不進入睡眠狀態(tài)而繼續(xù)工作,這根據(jù)應用層協(xié)議而定。 當總線空閑4到10秒的時候,所有從節(jié)點必須進入睡眠狀態(tài)。(注:空閑的定義是沒有顯性位和隱性位之間的轉換。) 關于喚醒 在一個處于睡眠狀態(tài)的LIN網(wǎng)絡中,任何一個節(jié)點都可以發(fā)送喚醒信號。 喚醒信號是一個250us到5ms的顯性電平。 問題:這里的喚醒信號可否按照恒潤的教程理解為在20Kbit/s波特率下的0x0F,或在1Kbit/s波特率下的0x0F? 當從節(jié)點發(fā)出喚醒信號之后150ms,主節(jié)點仍未發(fā)送報頭時,從節(jié)點可以再次發(fā)送喚醒信號。當連續(xù)發(fā)送了3次喚醒信號之后如果主節(jié)點仍未發(fā)送報頭,從節(jié)點要等待1.5秒以后才可以再次發(fā)送喚醒信號。
編輯:黃飛
?
評論