一、LIN總線幀結構
一個完整的LIN總線報文幀“Message Frame”包含報頭“Header”和響應“Response”,主任務發送報頭,從任務用響應來補充報頭形成完整的報文。
截取自LIN Specification PackageRevision 2.1
其中幀頭包括間隔場、同步段以及標識符場,應答包括數據段和校驗和場。每個字節之間存在字節間隔(Inter-byte Space);在報頭與響應之間存在響應間隔(Response Space);兩幀LIN報文之間存在幀間間隔(Inter-frame Space)。下面將詳細介紹每個段的具體內容格式。
1.間隔場
間隔場由間隔信號和間隔界定符組成。間隔場表示一幀報文的起始,由主節點發出。間隔信號至少由13個顯性位組成,間隔界定符至少由1個隱形位組成。間隔場是唯一一個不符合字節場格式的場,從節點需要檢測到至少連續11個顯性位才認為是間隔信號。
截取自LIN Specification PackageRevision 2.1
2.同步場
同步場顧名思義它的作用是確保所有從節點使用與主節點相同的波特率發送和接收數據,以下降沿為判斷標志,同步段采用一個固定的字節結構0X55。從節點通過接收主節點發出的同步段,計算出主節點位速率,根據計算結果對自身的位速率重新作調整。計算公式如下:1位時間 =(第7位的下降沿時刻 - 起始位的下降沿時刻)/ 8
截取自LIN Specification PackageRevision 2.1
3.標識符場
標識符場由兩部分組成,受保護 ID 段的前 6 位叫作幀 ID(Frame ID),加上兩個奇偶校驗位后稱作受保護 ID段。
截取自LIN Specification PackageRevision 2.1
幀ID的范圍在0x00~0x3F之間,共64個。幀ID標識了幀的類別和目的地。從任務對于幀頭作出的反應(接收/發送/忽略應答部分)都是依據幀ID判斷的。如果幀ID傳輸錯誤,將會導致信號無法正確到達目的地,因此引入奇偶校驗位。校驗公式如下,其中“⊕”代表“異或”運算,“?”代表“取非”運算。
P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4
P1 = ? (ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5)
4.數據場
數據場用于存儲節點發送的數據,數據場長度1到8個字節,采用低字節先發,低位先發策略,如果某一信號長度超過1個字節,采用低位在前的方式發送。
截取自LIN Specification PackageRevision 2.1
5.校驗和場
檢驗和場用于校驗接收到的數據是否正確。校驗分為經典校驗(Classic Checksum)和增強校驗(Enhance Checksum)。經典校驗僅校驗數據場,適用于診斷幀和與 LIN1.x 從機節點通信;增強校驗校驗標識符場和數據場,適用于與 LIN2.x 從機節點通信(診斷幀除外)。采用標準型校驗和還是增強型校驗和由主機節點管理,發布節點和各收聽節點根據幀ID來判斷采用哪種校驗和。
截取自LIN Specification PackageRevision 2.1
- LIN總線幀結構干擾
LIN幀的不同場格式需要按照協議進行開發,為了測試樣件是否不響應錯誤的幀結構,就需要對LIN幀中各個場分別進行干擾以達到所需要的測試目的。實現干擾的方式有很多,本文通過CAPL自帶函數來進行相應的干擾,下面將對CAPL函數linSendHeaderError()、linInvertRespBit()、linInvertHeaderBit()
進行介紹。
- linSendHeaderError()
該函數用于干擾報文頭,包含三個參數,一個是syncByte,用于設置同步場位;一個是idWithParity,用于設置標識符場;最后一個是StopAfterError,該位置1表示如果報頭中一旦有某個場出現錯誤,則終止之后報頭場的發送。
具體參數如圖所示
截取自Vector Browser Helper
下面通過一個干擾ID為0x33的報文PID場中奇偶校驗位的實例,來幫助大家進一步深入理解該函數。
// Force an error in header of LIN frame with ID=0x33 by setting wrong protected ID
on key 'h'
{
byte linID, protectedID, corParity, errParity, errPID;
// calculate protected ID with wrong parity bits
linID = 0x33; // use frame ID=0x33
protectedID = linGetProtectedID(linID); // get protected ID
corParity = (protectedID & 0xC0) >> 6; // extract parity (0xC=0=11000000)
errParity = (corParity ^ 0x2) & 0x3; // calculate wrong parity using XOR
errPID = linID | (errParity << 6); // calculate PID with wrong parity
linSendHeaderError(0x55, errPID, 0);
}
給大家大致解釋一下腳本的實現邏輯,首先通過linGetProtectedID()可以獲取該報文正確的PID值,然后通過corParity = (protectedID & 0xC0) >> 6提取出奇偶校驗位,與0x2異或干擾校驗位,最后通過errPID = linID | (errParity << 6)得出一個干擾過奇偶校驗位的PID值并賦值給自己先前聲明的errPID即得到了一個帶有錯誤奇偶校驗位的PID值,通過函數linSendHeaderError(0x55,errPID,0)發送錯誤PID值的LIN報頭,即實現了對PID場的干擾。
2.linInvertRespBit()
該函數用于干擾響應,主要關注的參數如下,byteIndex用來指定干擾數據場第幾字節(如果該參數值設置為報文長度,則干擾的是校驗位長度);bitIndex用來指定干擾相對應第幾位;level值為0的話,則把相應位從隱形干擾成顯性,如果為1則反之從顯性干擾成隱性;numberOfExecutions這個參數用來定義干擾的個數。
具體參數如圖所示
截取自Vector Browser Helper
下面通過下面的示例,來幫助大家進一步深入理解該函數。
on key 'i'
{
...
// Invert first bit of byte field 8 for LIN frame with ID=0x33
linInvertRespBit(0x33, 7, 0);
...
// Invert bit 7 of checksum byte field for LIN frame with ID=0x33
linInvertRespBit(0x33, 8, 6);
...
// Invert stop bit of byte field 8 for LIN frame with ID=0x33
linInvertRespBit(0x33, 7, 8);
...
}
第一個函數是干擾第8個比特,由于bitIndex是0,所以干擾的是該比特的第一個位,其中第二個函數如果byteIndex的長度和DLC長度一樣,則說明干擾的是該報文的checksum位。
3.linInvertHeaderBit()
該函數用于干擾報頭,主要關注的參數如下,byteIndex用來指定干擾數據場類型,如果為-1,則是干擾間隔場,如果為0干擾同步場,如果為1干擾PID場;bitIndex用來指定干擾相對應第幾位,如果為8則是干擾stopbit;level值為0的話,則把相應位從隱形干擾成顯性,如果為1則反之從顯性干擾成隱性;numberOfExecutions這個參數用來定義干擾的個數;disturbAfterHeaderID這個參數用來指定在該ID之后進行干擾,這個參數需要搭配waitForHeaders使用,如果設置waitForHeaders為0,disturbAfterHeaderID為5,則是等收到ID為5的報文后,在下一個報頭直接進行干擾。
具體參數如圖所示
截取自Vector Browser Helper
- 小結
通過上述的介紹,大家應該對基于CAPL對LIN報文各場干擾有了一定的了解了。通過發送干擾的報頭或者對從節點的響應進行干擾,然后再發送正常幀,即可通過該正常幀的數據,對ResponseError位是否能正確置位進行測試了。
北匯信息作為Vector中國的合作伙伴,致力于為中國汽車客戶提供優質的工具支持、解決方案以及測試服務。
圖片來源:LIN Specification PackageRevision 2.1以及Vector
-
LIN
+關注
關注
4文章
216瀏覽量
40302 -
CANoe
+關注
關注
4文章
66瀏覽量
8665
發布評論請先 登錄
相關推薦
評論