yuanshun819
液壓菜鳥
液壓菜鳥
  • 發帖數20
  • 液壓幣1枚
kauj===asjdfhjk...
閱讀:831回復:0

[分享]液壓CAN總線

樓主#
更多 發布于:2025-06-28 14:55
事先聲明,下面所說的很多有關CAN的知識,是我自己的學習和理解,而且不會按照教科書教的那樣來學習,可能不見得正確,懂的人,可以糾正哈。
        一直以來,我都是很頭疼學習各種協議的,因為協議太多了。從串口通訊協議開始,通訊協議就是一直在不斷增長。可只要是你在學習硬件開發,就不得不學。這不像純軟件開發,基本不會觸及底層的東西,你只需要在應用層面做好自己應用,關注業務上的東西就行。這也是很無奈的事情。
        CAN有關的器件和模塊也買了一些,估計落在上面的灰塵已經達到7nm的程度了吧?不知道這個想法能不能像棒子那樣去申遺?哈哈哈哈。說笑了,下面開始正是學習CAN有關的東西,先從CAN的物理構成學起吧。這里我就不學習CAN的發展史了,只說我想要了解的知識點。
        首先刨去協議及有關的處理芯片,CAN的總線只需要兩根線,線少,可以節省資源。CAN總線是用來傳遞數字信息的,它的總線上不是簡單的高低電平信號,而是通過兩條線上的電壓差來呈現高低電平信息的。兩條線的電壓差等于0V時,表示傳遞的是高電平,邏輯1,這是隱性電平;電壓差等于2V,表示傳遞的是低電平,邏輯0,這是顯性電平。這就是差分信號。這個壓差的實現,是由控制器實現,沒必要深入學,嘿嘿。選擇差分信號方式傳遞信息的好處是,很容易排除外來噪音干擾,延長傳遞距離。
注1:低電平信號在CAN總線上的表現

 
注2:高電平信號在CAN總線上的表現


 
 
 
        現在我已經知道了CAN總線是如何傳遞數字信號的了,那么假如我想通過CAN總線傳遞一個字符,比如0(十六進制的0x30,二級制的0011
0000),總線是如何傳遞的呢?我知道在SPI總線傳遞數據時,有時鐘脈沖這個信號用來幫助解析二進制信號,在時鐘的某個脈沖沿獲得正確的電平信號,從得到正確的結果。但在CAN總線上沒有這種機制。那么利用CAN總線傳遞這個0字符的時候,肯定要按照二進制的數值位來傳遞的,加入高位在前方式傳遞,在CAN總線上就應該是以下變化的信號:
1、總線壓差=2V ,傳遞Bit7的0
2、總線壓差=2V,傳遞Bit6的0
3、總線壓差=0V ,傳遞Bit5的1
4、總線壓差=0V ,傳遞Bit4的1
5、總線壓差=2V,傳遞Bit3的0
6、總線壓差=2V,傳遞Bit2的0
7、總線壓差=2V,傳遞Bit1的0
8、總線壓差=2V,傳遞Bit0的0
        但在接收的時候在什么時機解析這種電壓變化就很重要了,否則一定會得到錯誤的結果。因此我想,是不是CAN總線也需要在發收的時候要統一某個協議,類似串口通訊中的統一的波特率,來確認正確的通訊呢?帶著這個疑問,我繼續學習。
在CAN總線上,每一個節點,都如下形式的構成:

        CAN控制器有自己的工作時鐘(CAN時鐘),一個完整周期的時鐘,視為Tq。利用這個Tq和一套復雜的通訊協議,CAN控制器可以實現數據的同步。因為協議也比較復雜,我瞬間失去了深入學習的興趣,決定放棄了。反正這個同步是由控制器實現的,不需要程序參與。好吧,接下來,和通訊有關的東西,我只關注和程序處理有關的部分。
CAN總線報文類型
        CAN總線上傳輸的信息稱為報文,當總線空閑時任何連接的單元都可以開始發送新的報文。CAN通信是通過以下5種類型的幀進行的:數據幀,遙控幀,錯誤幀,過載幀,幀間隔。
1、數據幀
是節點想要發送數據時使用的額幀。由幀起始、仲裁段、控制段、數據段、CRC段、ACK段、幀結束這幾部分構成。

2、遙控幀
又叫遠程幀,用于接收單元具有相同ID的發送單元請求數據的幀。幀格式與數據幀相似,只是RTR位為隱性狀態,而且沒有數據段。

3、錯誤幀
當節點在收發數據檢查到有錯誤的時候,會以錯誤幀的形式,通知參與通訊的其他節點。

4、過載幀
當某個節點沒有做好接收下一幀數據時,會發出過載幀。一個節點最多可產生兩條連續的過載幀來延遲下一條保溫發送。其幀格式,與主動錯誤幀格式相同。
5、幀間隔
用來分隔前面任意類型的幀與下一個數據幀或者遠程幀。

CAN總線數據收發過程
我們以下面兩個單元之間的通訊過程,來說明CAN收發數據的處理過程。

1、當A想要發送數據的時候,要檢查A的RXD,如果RXD=1,表示總線處于空閑狀態,可以實施發送處理。數據可以通過TXD發送給A的CAN控制器。
2、B單元通過RXD接收來自A單元的數據后,馬上使B的RXD=0,B的CAN控制器會將這個信息通過TXD反映到CAN總線上。
3、A單元在收到來自B單元的反應RXD=0的信號時,表示收到B單元已經收到數據的應答。
好了,看到這個過程,終于到了我能順暢理解的部分了。我可以把這個過程簡單理解為以下步驟:
對A方:
1、總線忙不?
2、總線不忙,發送我要發的數據
3、對方收到沒?
4、對方收到了,好,通訊結束。
對B方:
1、收到發給我的數據
2、數據都接收完了?
3、是,都接收收完了,告知對方。
看,就這么簡單,哈哈哈??墒怯袀€問題哈,
1、對A方,數據要發給誰,在哪里體現呢?
2、對B方,怎么知道這個數據是給我的?
這就涉及到數據的構成了,我以前學習單片機的串口的多機通訊時,在通訊數據包中,是包含了子機編號的,這個編號決定了數據是想要發給誰的。我自己在做RF2401的無線通訊時,也在數據包中設置了來源設備號和目標設備號,從而確定數據是來自哪里和發向哪里的。
CAN總線其實沒有主從的概念,每個設備都是一個節點,節點之間是可以相互通訊的。CAN總線上的每個節點不需要設置節點的地址,而是通過消息的標識符(也就是前面說的ID段)來區別信息。因為CAN總線的消息是廣播的(就是大家都可以收到消息),比如總線上有節點A,節點B,節點C,那么節點A發消息,節點B和節點C都會收到消息;
當一個節點要向其它節點發送數據時,該節點的CPU將要發送的數據和自己的標識符傳送給本節點的CAN控制芯片,并處于準備狀態;當它發現總線可用時,轉為發送報文狀態。CAN控制芯片將數據根據協議組織成一定的報文格式發出,這時CAN總線上的其它節點處于接收狀態。每個節點通過控制器中過濾碼(Filter Code )和掩碼(Mask Code),再檢驗總線上消息的標識符(標準模式下有11個標識符位,擴展模式下有29個標識符位),來判斷是否接收這個消息(Message Filtering)。而過濾碼和掩碼是可以自行設置的。
簡單地說,CAN的報文中是不包含地址信息的,接收方根據需要,決定是否接收報文信息。雖然沒有,但我們可以在某些標識位或者數據段人為加進去指明目標的信息。
現在,我只是對CAN通訊有了初步的了解。要深入學習的知識還很多,慢慢學,慢慢積累吧。
喜歡0 評分0
游客

返回頂部