UDS學習筆記(一)——CAN總線介紹

最近剛入職車企,在燒寫汽車整車控制器的時候,接觸到了UDS協議。因此想要做一個能夠燒寫整車控制器的硬件。在查閱網上的資料之後,發現很多的資料都不齊全,同時自己也是一個新手,對CAN總線也接觸不是很多。因此看那些資料的時候也十分的困惑。我之前學習過串口,SPI,I2C等總線,因此理解CAN總線起來相對也比較容易。在之後的學習中,因此我會盡量用自己的話去形容那些比較官方的語言。

因爲自己還沒具有能夠設計硬件的能力,使用的硬件爲一些開源的電子產品,有:樹莓派3B以及MCP2515模塊。同時使用github上開源的UDSonpython協議進行快速開發,如果你也想一起學習UDS協議的話,在具備這些硬件的同時,因此你還需具備Python,C++的能力。

首先讓我們學習一下什麼是CAN通信吧,我想做的東西比較複雜,因此底層基礎是要打好來的。官方的話不說太多,想必能看這篇文章的對CAN總線都有一個基本的認識吧。它有由差分信號組成的兩條線。兩條線上的信號大小相等,方向相反。因此同一時刻,在CAN總線中,只能有一個設備發生消息,另一個設備接受消息。這就是CAN總線的半雙工特性

那麼就會有人問了,爲什麼同樣使用兩條線(一條發送數據,一條接受數據)的RS232就可以實現全雙工,而CAN總線只能實現半雙工呢?是不是CAN總線太弱了?其實是因爲兩個的應用場景不一樣,對於RS232來說,其使用是短距離,低速度的一個應用場景,而CAN總線是一個遠距離,高速度的應用場景。而在雙絞線上傳輸差分信號時穩定性要好很多,因此適合於較遠距離的傳輸。

CAN總線 串口總線
CAN_H TX
CAN_L RX
兩條線信息量相同 兩條線信息量不同

 

在瞭解到了CAN總線的硬件之後,那麼我們就要學習CAN總線的消息這麼傳輸了。

對於前面提到的半雙工的CAN總線,那麼很容易就會想到一個問題,如果總線上兩個設備都想發送消息,然後誰能優先發送數據呢?因此就涉及到了優先權的判定,幀的ID越小,優先權越高。同時要注意是是,幀的ID是賦予給幀的,而不是賦予給節點。因此兩個節點可能會發出同樣的幀ID參考資料    參考資料2。因此如果兩個節點設置成能夠發生相同的幀,還是會出現擁堵現象。就會導致錯誤等等。爲此,CAN報文有四種消息類型。

  • 數據幀:數據幀將數據從發送器傳輸到接收器。(最常見使用的幀)
  • 遠程幀:總線單元發出遠程幀,請求發送具有同一標識符的數據幀。 ()
  • 錯誤幀:任何單元檢測到總線錯誤就發出錯誤幀。
  • 過載幀:過載幀用在相鄰數據幀或遠程幀之間的提供附加的延時。

 

https://github.com/satish77/ip_uds_bl_tool/tree/master/ip_uds_bl

https://github.com/GoodnightV/UDS-based-Refresher/blob/master/DiagboxSRC/src/main.cpp

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