這是乙個can擴充套件幀的完整結構圖,針對剛入門的小夥伴來說。不需要每乙個元素都理解,思想的套路是讓大家先能看懂報文。至於其他的元素就在實際的工作中進行擴充套件學習。
擴充套件幀頭部有32位的仲裁字段,仲裁欄位中對於我們最有用的就是11位的識別符號和18位的拓展識別符號
這29位的資料就組成了我們通常所說的報文id,或者叫做pgn(parameter group number)。
以乙個常見的發動機報文id:0x18fef100為例
0x:表示報文以16進製制進行標識;
f1:表示ps,長度8個位,匯流排工程師根據實際需要進行定義,好比乙個人的姓;
fe:表示pf,長度8個位,匯流排工程師根據實際需要進行定義,好比乙個人的名字;
18:表示優先順序(priority),長度3個位,18對應的優先順序位6;
如上圖的結構,priority處於第27~29位,priority的二進位制表示位,對應到25~32這乙個位元組就是十六進製制的0x18
資料段
資料段用於存放,當前報文所要傳輸的資料。每一幀資料最大可以存放8個位元組,共64個位的資料。這64個位可以包含好很多個訊號,匯流排工程師需要定義每乙個訊號的起始位置、長度、解析度、偏移量。
以j1939-71為中eec1報文為例子,下半部分可以看到資料段包含了哪些訊號,在【parameter name】對他們進行描述。前面對應定義了該訊號的啟示位置【start position】與長度【length】。需要注意的【start position】以位元組為單位,如【1.5】表示第乙個位元組的第五個位。根據資料啟示位置與長度擷取出來的整數值成為原值
【spn】則是標準1939協議對該條訊號資料的解析規則的定義,為了讓大家容易搜尋,搜尋spn 190就能夠得到engine speed這條訊號的解析規則。最需要關心的就是這個解析度【resoultion】,偏移量【offset】。需要通過這兩個引數對原值進行運算,得到解析值
公式:解析值=原值*解析度+偏移量(用於接收)
原值=(解析值-偏移量)/解析度(用於傳送)
例子:設接收到的engine speed的原值為0x2ee0(十進位制12000),求發動機實際轉速。
發動機轉時候=12000*0.125+0=1500rpm
注:實際定義協議中不需要有spn直接定**析與偏移即可。
zynq CAN中斷傳送J1939資料
1 手冊 認真翻譯上邊的一段話 示例 使用中斷的方式來想txfifo中寫入資料 在中斷模式中,寫操作可以持續直到can.isr txfll 產生乙個中斷。資料能夠持續寫入txfifo直到txfifo被寫滿。當txfifo寫滿的時候,can.isr txfll 和 can.sr txfll 被設定成1...
J1939 多包報文傳輸
以j1939 rc retarder configration 報文為例,19個位元組,需要分3條報文傳送。1 將要傳送多包報文之前先會廣播一條id為0x18ecff 形式的一條報文tpcm 以目前理解最後 為源位址,rc報文的話為0f 資料場會提示接下來將會傳送多少條報文,包含什麼資訊 rc 2 ...
DBC和J1939理解(也許不正確,探索階段)
version hinbnnnyynnnyynnnnnnnnnnnnynnnyyynnynnnnnn 4 4 4nnn ns ns desc cm ba def ba val cat def cat filter ba def def ev data envvar data sgtype sgtyp...