J1939 入門教程

SAE J1939協議是基於CAN2.0B協議之上的應用層協議,但是SAE J1939協議並不僅僅是個應用層協議,她對物理層,數據鏈路層,網絡層,應用層,故障診斷, 網絡層管理層等都做了詳細的規定,只不過這其中很多規定都跟CAN2.0B一致。我們這裏只介紹J1939的應用層,對軟件開發來說已經足夠。 對熟悉CAN2.0B協議的小夥伴來說,其實只要掌握下面幾個關鍵點,J1939就瞬間不再神祕。

  • J1939協議是基於CAN2.0B的應用層協議,所有J1939報文都是使用29位標誌符。

CAN報文中我們有11位標誌符的標準幀也有29位標誌符的擴展幀,在J1939協議中,我們所有報文都是29位標誌符, 數據域則跟CAN報文的數據沒有區別。

  • CAN報文是基於ID的,而J1939協議是基於PGN的。

這一點幾乎就是J1939協議的全部內容。CAN2.0B使用29位的標誌符來區分不同的報文,J1939對這29標誌符進行了重新的分類和解釋。打個不是很恰當的比方, 以前CAN2.0B協議根據人的體重來區分不同的人,只要一樣重(ID)就認爲是相同的人羣,體重越瘦的就越是受CAN2.0B協議喜歡(優先級越高),現在J1939也是測量體重, 只不過是把人的腦袋,軀幹,雙手,雙腿分別測量,然後對這幾個重量進行某種運算(比如腦袋重量的平方,軀幹重量與雙手重量乘積,以及雙腿重量這三個數字之和), 只要運算的結果(PGN)一致,就認爲這些人是一個人羣。

也就是說,J1939對CAN2.0B中的29位標誌進行了重新解釋,我們使用下面這張圖來說明一下:

J1939對CAN ID進行了重新劃分,加上最多8個字節的數據域,構成了J1939 的協議數據單元(Protocol Data Unit, PDU),其中前3位表示優先級位(Priority, P), 之後是擴展數據頁位(Extended Data Page, EDP),數據頁位(Data Page,DP), PDU格式位(PDU Format, PF), PDU特定域位(PDU Specific, PS), 源地址位(Source Address,SA) 以及數據域(Data Filed)。

J1939的協議數據單元與CAN 報文幀相比要少一部分,比如SOF, SRR, IDE等,這是因爲這部分完全由CAN 2.0B控制,J1939並未對這部分做任何修改。 J1939與CAN報文幀的對比可參考下圖:

如上圖所示,J1939重新劃分了29位的CAN ID,中間18位共同組成了參數組編號(Parameter Group Number, PGN),在CAN 報文中,我們根據CAN ID來區分不同報文,在J1939中, 我們根據PGN來區分不同的報文。J1939-71中對不同的PGN做了一系列詳細的規定,不同的PGN來表示不同的數據或者功能。J1939-71對PGN的規定非常詳細,足足有六百多頁, 對於用戶來說,可能熟悉自己常用的一些PGN就足夠了,具體需要某些功能時去查詢就好了。

總結一下就是,J1939跟CAN 2.0B不同的地方就在於,J1939是以PGN爲中心,通過不同的PGN來區分不同的類型,比如有些PGN傳輸控制命令,有些PGN傳輸數據, 有些傳輸請求,有些傳輸響應等等。在使用CAN傳輸數據時,CAN協議往往是我們自己定義的, 而J1939-71中對不同的PGN做了詳細的規定,相當於已經幫我們做好了協議。當然實際情況中我們也可以自定義PGN。理解了這些後,學習J1939就會變得很簡單, 之後再對J1939的細節做一些介紹。

J1939 PDU各部分介紹

下面分別對協議數據單元的幾個部分做簡單介紹:

  • 優先級(P)

根據CAN2.0B 的仲裁機制,ID越小優先級越高,按照J1939協議的劃分,優先級在整個ID的最前面,實際上依然控制着ID大小,即CAN報文的優先級。 只不過在J1939協議中優先級僅僅用於優化發送數據時的報文延遲,接收報文時則完全忽略優先級。 J1939中的優先級可以從最高的0(000b)到最低優先級7(111b)。默認情況下控制類報文的優先級爲3,其他報文的優先級爲6。 當分配新的PGN或總線上流量改變時,允許提高或者降低優先級。

  • 擴展數據頁(Extended Data Page, EDP,保留位)

擴展數據頁(EDP)聯合數據頁(DP)可以決定CAN報文幀中CAN ID的結構,目前爲保留位,均設置爲0。

  • 數據頁(Data Page,DP)

用於聯合擴展數據頁來決定CAN ID結構,當EDP爲0時,DP爲0或者1分別表示第0頁或者第1頁PGN。如下圖所示:

  • PDU格式(PF)

PF用來確定PDU的格式,兩種格式計算得到PGN的方式不同,我們會在後面介紹這兩種計算方式。

  • PDU特定域(PS)

PS的定義取決於PF, 它可能表示目標地址(Source Address, SA),可能表示組擴展(Group Extension,GE), 如果PF < 0xF0則表示爲DA,否則表示爲GE。如下圖所示:

  • 目標地址(DA)

DA是報文的目標地址,除目標地址的設備外,其他設備應該忽略此報文。如果目標地址爲0xFF,則表示爲全局地址,此時所有設備都應該監聽此報文並在收到報文後做出響應。

PGN 計算方法

有了上面的概念後我們再介紹一下PGN的計算方法,PGN的計算方法其實非常簡單,用下面的公式即可:

if (PF < 0xF0){
    PGN = (DP << 9) + (PF << 8);
}else{
    PGN = (DP << 9) + (PF << 8) + PS;
}

讓我們來計算一下兩種PF下各有多少個PGN,對於PF < 0xF0的情況,PGN數目應該等於 2 * 0xF0 = 480, 對於PF >= 0xF0的情況, PGN數目應等於2 * 16 * 256 = 8192, 所以兩種情況PGN總數應爲480 + 8192 = 8672

多幀傳輸機制

當傳輸的數據大於8個字節時,無法通過一幀CAN報文來裝載,此時就需要使用多幀傳輸。J1939多幀傳輸的規則很簡單,就是把數據域的第一個字節拿出來當作編號, 這樣原來每幀CAN報文最多可傳輸8個字節內容,由於現在被編號佔用了1個字節,只能傳輸7個字節。由於編號範圍爲1-255,所以多幀傳輸的最大數據長度是255 * 7 = 1785個。 需要注意,最後一幀報文實際需要傳輸的內容可能不足7字節,比如一共要傳輸9個字節,第一幀CAN報文傳輸了7個字節,第二幀CAN報文只能傳輸2個字節, 這樣加上1個編號字節,還剩5個字節,這5個字節要全部設置爲0xFF。發送數據時,按照編號把數據拆裝成多幀報文,接收數據時,則按照編號重新組裝成完整的數據。

可疑參數編號(Suspect Parameter Number,SPN)

SPN是指數據域中的某個參數,J1939-71不僅對PGN做了詳細的規定,對SPN也做了詳細的規定,並對每個參數做了編號。通過下面的例子可能更好理解一些。

PGN 與 SPN 的例子

我們以PGN65213爲例(爲什麼用這個例子?爲什麼其他博客也用這個例子?因爲J1939-71裏面就是用的這個例子)。J1939-71中PGN65213的例子如下:

這表示PGN65213只用了4個字節,其中第1個參數Estimated Percent Fan Speed佔用1個byte,起始位爲第1個字節,SPN爲975。 第二個參數Fan Drive State 佔用了第2個字節的前4位, SPN 爲977, 第3個參數Fan Speed佔用2個字節,SPN爲1639。 目前我們只知道這三個參數每個參數存儲的位置,長度,但是並不知道每個參數的分辨率, 偏移量,範圍等信息,要知道具體每個參數的詳細規定,需要查看具體SPN的規定。 三個SPN的規定都能在J1939-71中找到,如下所示:

根據SPN975的內容,如果風扇估計的百分比轉速爲50%, 由於分辨率爲 0.4%/bit, 偏移量爲0,則這個字節的數值應爲 40% / 0.4% = 100 = 0x64

根據SPN977, 如果風扇當前因油溫過高而運轉,則風扇驅動狀態爲3。

根據SPN1639, 如果風扇當前轉速爲1500 rpm,由於分辨率爲 0.125 rpm/bit,偏移量爲0, 則這兩個字節的數值應爲: 1500 / 0.125 = 12000 = 0x2EE0

在上面假設都成立的情況下,我們進一步假設ECU地址爲0x9C, 優先級爲默認值6, 且此ECU需要往VCU發送PGN65213(0xFEBD) PGN65213在J1939-71中的詳細描述如下圖:

根據定義,EDP = 0, DP = 0, PF = 0xFE, PS = 0xBD, 由於ECU地址爲0x9C,則CAN報文ID爲 0x18FEBD9C, 數據域Byte1 = 0x64, Byte2 = 0xF3, Byte3 = 0xE0, Byte4 = 0x2E, Byte5 = Byte6 = Byte7 = Byte8 = 0xFF。

 

 

原文地址:J1939入門教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章