LIN 匯流排入門
LIN匯流排是目前常見的一種A類網路協議。LIN的全稱為Local Interconnect Network。LIN主要功能是為CAN匯流排網路提供輔助功能,應用場合有智慧感測節點、自動車窗節點等。目前最新的LIN協議是LIN2.2,制定於2010年。LIN的一大優點是成本低,但其最大傳輸速率為20Kbps。建議的通訊速率如下,低速2400bps,中速9600bps,高速19200bps。根據OSI參考模型,LIN匯流排僅規範了資料鏈路層和物理層。
LIN的部分應用
LIN的特點如下:
1.採用單主多從的組網方式,無CAN匯流排那樣的仲裁機制,最多可連線16個節點(1主15從)。
2.對硬體要求簡單,僅需UART/SCI 介面,輔以簡單驅動程式便可實現 LIN 協議。故幾乎所有的MCU均支援LIN。
3.不需要單獨的晶振,便能完成主、從節點的同步,硬體成本大幅降低。
4.僅使用一根訊號線便可完成資訊的傳輸,即所謂的單匯流排裝置。
5.傳輸速率最高可達20Kbps,符合A類網路標準,滿足車身控制需要。
6.LIN 網路中新節點的加入,對網路中其他原有節點的軟硬體設計不會造成影響。
LIN網路主從節點的功能
LIN網路中的節點任務分為主機任務和從機任務兩類。其中,主機任務只在主機節點上執行,而從機任務在主機節點和從機節點上均可執行。也就是說,主機節點可以實現主機任務和從機任務。
A.主機任務主要執行以下功能:
1.定義總線上的通訊速率。(同步場?待考)
2.傳送報文幀頭,包含同步間隔場、同步場和識別符號場三個部分。
3.監控匯流排通訊,通過校驗和確定資料正確性與否。
4.使從機進入喚醒或睡眠狀態,並響應從機的喚醒要求。
B.從機任務既可運行於主機又可運行於從機,它主要完成以下功能:
1.等待主機任務傳送的同步間隔,使從機與主機於同步場中獲得同步。
2.分析識別符號場,若與自己相關,則接收或傳送資料,若與自己無關則什麼都不做。
3.檢查和傳送校驗和。
4.接受主機任務的喚醒和睡眠請求。
綜上,主機報文的識別符號能觸發與之對應的不同從機之間的通訊。
LIN報文的幀結構
LIN 總線上具有“顯性”和“隱性”兩種互補的邏輯電平。其中,顯性電平(參考地電壓)是邏輯 0,隱性電平(電源電壓)是邏輯1。
LIN在總線上以具有固定格式的報文進行傳遞,但是這種報文資料段的長度是可以調整的。LIN網路中的所有節點(包括主機節點)都具有從機任務,當接到主機任務的報文資訊時,它們中的某一個要對報文做出響應。
報文頭僅可以由主機節點發出
LIN匯流排的一幀主要由兩部分組成,即報文頭(Header)和報文響應(Response)。其中,報文頭是由一個主機節點的主機任務發出的,而報文響應(以下簡稱響應)是由一個主機節點或從機節點的從機任務發出的。其中報文頭由同步間隔場(最小13個顯性位)、同步場(1個位元組,資料不變,0x55)、和PID場(1個位元組)三部分組成;報文響應由2/4/8個位元組的資料場、校驗和場(1個位元組)所組成。報文頭和響應之間有一個幀內空間分隔,最小空間為0。
LIN的幀結構(英文版)LIN的幀結構(彩圖版)LIN的幀結構示波器採出來的LIN波形,能看出0x00和0x55
LIN 的位元組場格式就是通常的“SCI”或“UART”序列資料格式(N81編碼)。即每個位元組場的長度是10個位定時(BIT TIME):1bit起始位+8bits資料位+1bit停止位。
起始位(START BIT)是一個“顯性”位,它標誌著位元組場的開始。接著是8個數據位,首先發送最低位。停止位(STOP BIT)是一個“隱性”位,它標誌著位元組場的結束。LIN報文幀中的同步場、識別符號場、資料場、校驗和場的格式都符合上述位元組場的格式。
下面對幾個重要的部分詳細說明。
同步間隔場
間隔場是唯一一個不符合位元組場格式的場。從節點需要檢測到至少連續11個顯性位才認為是間隔訊號。
同步場
一個位元組,即0x55。
LIN的被保護識別符號場(PID場)
PID場定義了報文的內容和長度。如圖,PID場分為6個識別符號位和2個ID奇偶校驗位。6個識別符號位我們稱之為ID。如果加上2個奇偶校驗位就變成PID了,即Protected ID。6個識別符號位中,識別符號後兩位為資料長度控制位。總的來看,ID的範圍是0-0x3F。注意是ID,不是PID。要區分開。這一段要講的是我們需要將LIN的ID與PID分清楚,不能混淆。
上圖中的ID4和ID5為資料長度控制位(ID4是低位)。值為00或10時,資料長度為2個位元組。值為01時,資料長度為4個位元組。值為11時,資料長度為8個位元組。在實際應用中,我並沒有發現ID4和ID5與真實的資料長度有什麼關係。接觸到的LIN報文均為8個位元組的資料。
P0和P1為奇偶校驗位,演算法如下:
#include <stdio.h>
#include <windows.h>
int main()
{
short p0=0,p1=0;
short LIN_ID=0x22,PID=0x00;
p0 = (LIN_ID & 0x01) ^ ((LIN_ID & 0x02) >> 1) ^ ((LIN_ID & 0x04) >> 2) ^ ((LIN_ID & 0x10) >> 4); //按位異或
p0 = p0 & 0x01;
p1 = ~(((LIN_ID & 0x02) >> 1) ^ ((LIN_ID & 0x08) >> 3) ^ ((LIN_ID & 0x10) >> 4) ^ ((LIN_ID & 0x20) >> 5));
p1 = p1 & 0x01;
PID = (p1 << 7) | (p0 << 6) | LIN_ID;
printf("p0=%#x,p1=%#x,PID=%#X\n",p0,p1,PID);
system("pause");
return 0;
}
所謂奇偶校驗就是在傳送的每一個位元組後都加上一位,使得每個位元組中1的個數為奇數個或偶數個。接收方通過計算資料中1的個數是否滿足奇偶性來確定資料是否有錯。這個不用背,用的時候可以查表。
資料場
資料場主要需注意每個位元組先傳輸的是最低位。即如果某一訊號長度超過1個位元組,採用低位在前的方式傳送(小端)。
校驗和場(checksum)
校驗和場是資料場所有位元組的和的反碼。所有資料位元組的和的補碼,與校驗和位元組相加所得的和必須是0xFF。
演算法(Classical):累加所有位元組。對每次加和進行判斷,如果和大於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匯流排資料,以最後一組為例,2個0xFF之和為0x1FE,處理後仍然為0xFF。故8個0xFF加和之後仍為0xFF,取反碼為0x00。
一組LIN報文
校驗和場的兩種型別
校驗和場通常會有兩種不同的型別,英文簡稱為CST(Checksum Type)。一種是classic checksum(LIN 1.3),一種是enhanced checksum(LIN 2.0及以上)。上文講到的校驗和場演算法實際上是classic的,即只對Data(資料場)進行校驗和的計算。Enhanced Checksum在計算時需要把PID也加入到計算佇列中。
9600波特率下,ChecksumType為classic
下圖是CST(校驗和型別)為Enhanced時的報文形態。此時校驗和的計算需要包含前面的PID位元組。舉例,下圖中第一幀報文,ID為0x02,PID通過查表(參考文獻5)可得到對應的PID是0x42,0x42的反碼是0xBD。原理上一樣,只不過計算校驗和的時候,需要把PID也放進去。
PLIN-USB收到的LIN報文,很詳細
這裡有個知識點一定要注意:識別符號為0x3C和0x3D的幀只能使用經典校驗,這兩組幀是LIN的診斷幀。即LIN 2.0及以上才有的診斷幀,需要使用經典校驗,不能將PID也加入到校驗計算序列。自己寫LIN驅動的小夥伴要格外注意。
用Kvaser收到的第一個LIN報文
LIN匯流排的佈線組網
LIN網路的節點數量不應超過16個,否則節點增加將減少網路阻抗,會導致環境條件變差,從而不能進行正常的無錯誤通訊。BOSCH汽車電氣與電子中這樣描述,“LIN匯流排規範中沒有規定匯流排允許的最大節點數。......但實際應用中,為了保證資料傳輸的可靠性,匯流排允許的最大節點數為16個。“
實驗證明(該實驗需要考證),每增加一個節點,就會減少約3%的阻抗;網路中的通訊導線長度應小於或等於40m;主機節點的匯流排端電阻典型值是1kΩ,從機節點是30 kΩ。
LIN匯流排的應用
LIN總線上可以傳輸的兩類資料,訊號報文和診斷報文。
診斷報文的輸送是在具有兩個保留識別符號的幀裡面完成的。資料場的判讀取決於資料場本身以及通訊節點的狀態。
LIN具有排程表機制。排程表負責排程網路各報文傳送的順序。排程表在網路系統設計階段確定。排程表使得LIN通訊具有可預測性。主任務可以擁有多個排程表,並在不同的排程表之間切換。
LIN的描述檔案叫做LDF檔案,可以設定報文幀,訊號和排程表等。
LIN幀的分類
LIN幀按照幀型別來分類可以分為普通幀、事件觸發幀、零星幀、診斷幀、使用者自定義幀和保留幀。
普通幀的識別符號(ID)為0到0x3B。主任務發出報文頭,一個任務響應,一個或多個任務接收。
事件觸發幀的識別符號為0到0x3B。事件觸發幀必須有一個獨立的ID,該ID可以與多個普通幀相關聯。在事件觸發幀時隙內傳送幀頭,只有當相關聯的無條件幀內有訊號被更新時,才傳送幀響應。幀響應的第一個資料位元組等於識別符號,即響應最多可以傳輸7個位元組的資料;如果沒有幀響應,幀頭被忽略。幀響應可由多個節點發送,發生衝突時切換到“衝突解決排程表”,之後再切換回到原來的排程表。
零星幀表示共用一個時隙、在需要時才被髮送的一組普通幀。識別符號為0到0x3B。
診斷幀用來傳輸診斷或配置資訊,一般包含8個位元組資料。0x3C為主請求幀,0x3D為從響應幀(注意校驗方式是classic!)。診斷響應基於ISO15765-2傳輸層和ISO14229應用層。
診斷幀
使用者自定義幀識別符號為0x3E,可以傳輸任何使用者自定義的資訊。
保留幀的識別符號為0x3F。略。
關於LIN的版本
LIN2.0新增加了下列屬性:“增強校驗和(Enhanced)”、“重新配置和診斷”、“波特率自動探測”、“響應錯誤狀態監控”。LIN2.0從機節點無法與LIN1.3主機節點操作。
關於睡眠
主節點可以傳送一幀ID為0x3c,第一個位元組為零的主請求幀來使處於工作狀態的從節點進入睡眠。這幀報文稱為睡眠指令。
從節點在接到睡眠指令之後,也可以選擇不進入睡眠狀態而繼續工作,這根據應用層協議而定。
當匯流排空閒4到10秒的時候,所有從節點必須進入睡眠狀態。(注:空閒的定義是沒有顯性位和隱性位之間的轉換。)
關於喚醒
在一個處於睡眠狀態的LIN網路中,任何一個節點都可以傳送喚醒訊號。
喚醒訊號是一個250us到5ms的顯性電平。
問題:這裡的喚醒訊號可否按照恆潤的教程理解為在20Kbit/s波特率下的0x0F,或在1Kbit/s波特率下的0x0F?
當從節點發出喚醒訊號之後150ms,主節點仍未傳送報頭時,從節點可以再次傳送喚醒訊號。當連續傳送了3次喚醒訊號之後如果主節點仍未傳送報頭,從節點要等待1.5秒以後才可以再次傳送喚醒訊號。
關於LIN的基礎知識先介紹到這裡。推薦一個帖子:《白話LIN匯流排》,很生動形象!
白話 LIN匯流排, 晚會開始啦 - 汽車電子 - 電子工程世界-論壇
www.LIN-SUBBUS.org上的訊息顯示稱,LIN2.2A為最後一版非ISO的LIN匯流排標準。
LIN匯流排最新的specification(規範)將會是ISO 17987 Part 1-7 中的一部分。
本文轉自:https://zhuanlan.zhihu.com/p/38833752