部分摘錄自:https://zhuanlan.zhihu.com/p/30247549
CAN總線標准數據幀的結構
在實際應用中,CAN總線的一個幀主要由幀信息,幀ID和幀數據組成。
幀信息:四類,標准數據幀(汽油車、電機)、標准遠程幀(少見)、擴展數據幀(廣大柴油車、部分汽油車)、擴展遠程幀(少見)
有童鞋經常會問到CAN2.0A和CAN2.0B是啥,2.0A是僅支持標准幀的意思,幀ID最高11位,也即0x000-0x7FF。2.0B是支持標准幀加擴展幀的意思,幀ID最高29位,也即0x0000 0000-0x1FFF FFFF。要注意,CAN2.0B已經包含了CAN2.0A,他們倆是包含與被包含的關系。
幀ID是什么?通俗講是CAN的一種“地址”。CAN有個特點是競爭機制,幀ID越小越有占用總線資源的權利,越會優先發送。舉個例子,燈光信號幀ID 0x555,發動機溫度傳感器幀ID 0x111,那么當兩個信號同時發出時,發動機的信號會優先發送,燈光在后面排隊。通常在一個CAN系統中,不同的設備,發出CAN信號的幀ID都是不一樣的,或者說,CAN信號的每個幀ID都有一個固定的用途。如果一組CAN信號的幀ID,它們的用途都被確定下來,並在一個文檔中得到了解釋,那么我們管這個叫CAN總線的應用層協議,或者高層協議。常見的有ISO15765,SAE J1939,CANopen(電機和挖溝機控制器用)。在車輛行業中,如果對車輛CAN總線上的每個幀ID及每個幀數據都做出了標准的解釋,形成了文件的話,我們叫這個文件為DBC文件。設計CAN節點時我們應該注意,不要給不同的節點設置相同的幀ID,這樣會導致仲裁錯誤,進而導致接收不到某個CAN節點的數據。為什么CAN節點ID不能相同?
11位和29位是什么意思呢?11位指的是標准幀的幀ID范圍是0x000-0x7FF(0x是十六進制的意思),7FF翻譯成二進制是111 1111 1111,對吧,十一個“1”。同理,29位指擴展幀的幀ID范圍是0x0000 0000-0x1FFF FFFF,1FFF FFFF翻譯成二進制是29個1。大致明白了吧。29位的分配ID能力要比11位的強,11位能夠表示的信息總量小一點。
幀數據很簡單了,說下特點吧。與串口相比,CAN的幀數據只有8個字節,即64個位,不會再多了。當然,CAN FD作為新型總線解決了僅有8字節這個問題。有興趣大家可以了解下CAN FD。
波特率,要注意常見的CAN波特率大多都是整數。常見的車輛波特率有500K,250K,125K,100K。波特率和收音機頻率一樣,如果兩個CAN設備的通信波特率不一致的話,是不能進行通訊的。如果你需要設計CAN總線節點,波特率的設置是一個難點,應認真仔細查閱MCU關於CAN控制器部分的datasheet。初步了解可查看以下鏈接:非標准的CAN波特率怎么計算
終端電阻,CAN和RS485一樣,要在終端減少差分信號的反射。我記得最經典的一張圖是這么畫的,水流在試管(平躺)的尾部受阻,水也就涌了回來。差分信號也是如此,你不在兩個終端加電阻,信號會反彈回來影響通訊。終端電阻在CAN總線上要有兩個,阻值為120歐姆,並聯,最遠的兩端一邊一個。多了不行少了也不行。你不確定的話,用萬用表量一下,CANH和CANL之間60歐姆左右最好。如果有多個節點的話,終端電阻應適當加大。
為什么添加終端電阻可以參閱:小電阻之大作用——CAN終端電阻
好的,現在你應該已經明白,幀ID、幀信息和幀數據都是什么,知道CAN總線波特率是什么,終端電阻是什么,重要的是,你收到一個陌生設備發出的CAN總線數據了。你成功的邁出了學習CAN總線最重要的一步。如果你連接不上你的車或其他CAN設備,那屬於連接問題,請參閱指導文檔
綜上,CAN總線是很有發展的。更多資料在下方。
https://pan.baidu.com/s/1LCodo0w45GmFqAD7FdyvCg
附:相關英文縮寫含義
標識符擴展位,IDE,Identifier Extension。
數據長度編碼,DLC,Data Length Code。
應答,ACK,Acknowledgement。
循環冗余校驗,CRC。
替代遠程請求位,SRR,Substitute Remote Request。
遠程發送請求,RTR,Remote Transmission Request