CAN總線通信協議學習2——數據鏈路層之幀格式

1 幀格式

幀格式可理解為定義了傳輸的數據(叫報文)應該“長什么樣”來傳輸,也為后續設定一些規則如錯誤檢查機制提供了思路。


?

首先,幀格式可分為以下5種類型:

PS:CAN總線任意一個設備可當收可當發CAN總線有兩種數據傳輸方式:廣播式和請求式。

廣播式:CAN其中一個設備其不斷地發送報文到總線上,連接到總線上的其他設備“想收就收”。

請求式:CAN中哪個設備有收數據的需求,向發數據方發送一個請求,發數據方收到請求后,才發送報文到總線上。

1.1 數據幀

數據幀有兩種格式:標準格式和擴展格式

圖上的數字:代表每一段對應的所占的位數,不是點電平邏輯!(黑色粗線才是邏輯電平)

顏色解釋:看圖的最底下,無論是標準格式還是擴展格式,灰色代表邏輯0,白色代表邏輯1,紫色代表可0可1,ACK位槽特殊情況白色灰色各占一半,規定發送方必須白色即發送邏輯1,接收方必須發送邏輯0

1.1.1 標準格式:

(1)SOF段之前段(幀起始前):總線空閑,上一章提到,高速CAN空閑為1(黑色粗線為邏輯電平1)。

(2)SOF(幀起始):必須為0,表示開始發送了,要與幀之前空閑時1區別,故必須為0;

(3)ID:報文ID共11位,紫色,則視具體情況而定

(4)RTR:遠程請求標志位,用于區分數據幀(為0)還是遙控幀(為1),現在是數據幀,如必須為0;

(5)IDE:用于區分標準格式(為0)還是擴展格式(為1),這里為標準格式,故必須為0

(6)r0:保留位,還未用到,為了以后可能升級用,目前先固定設為0。

(7)DLC:表示數字段的長度,數據段要多少字節

(8)DATA:就是傳輸的數據

(9)CRC:校驗算法,會對SOF到DATA的數進行自動檢驗,得到一個檢驗碼存在這個位置。

(10)CRC界定符:設定為邏輯1

(11)ACK段:ACK槽——ACK界定符:ACK槽為發送方必須白色即發送邏輯1,接收方必須發送邏輯0(同時),ACK界定符設定為邏輯1。(理解:這段可認為是發送方和接收方操作總線權力短暫交接的過程,ACK段前后都是發送方在操作總線,ACK段則是接收方在操作總線,目的是為了讓發送方方知道有設備接收了,ACK槽前后要留有權力交接的時間,故設定了CRC界定符和ACK界定符,CRC界定符為邏輯1,發送方釋放總線,若有設備接收了,那么ACK槽就會接收方拉下總線,故會出現邏輯0,這樣發送方就知道有設備接收到了,接收方發出應答后,又要交出總線的控制權,故接收方在ACK界定符上要發邏輯1,釋放總線。)

PS:

  • 數據的應答是一位一位進行的,而不是等所有數據傳輸完,接收方才來應答。
  • ACK段可多個設備同時拉下總線。

(13)EOF(幀結束):設定為7個邏輯1,表示幀結束了。

1.1.2 擴展格式:

擴展格式是因為ID段不夠用用了,所以要加ID段的位數。

擴展格式為了要與標準格式的兼容,再碰到IDE位前,系統也不知道是標準格式還是擴展格式,因此,IDE前的兩種格式的解析方式,位數等必須一致(除了幀起始,擴展格式沒有),遇到IDE后,則可分標準格式解析還是擴展格式解析,即兩種格式可以不一樣了。


所以,看到紅色框內,即遇到IDE前,先都是11位ID。

此后,標準格式為RTR位+IDE,為了與之一樣,擴展格式位SSR+IDE,其實SSR是無用的,強制設定為1,為的是與標準格式的RTR位對應。

遇到IDE位后,擴展格式加進了18位ID,后與標準格式RTR位開始完全一致。

1.2 遙控幀

看結構,遙控幀無數據段(DATA),RTR為隱性電平1(與數據幀區分),其他部分與數據幀相同。

這樣理解:遙控幀是請求式,說明接收方向發送方請求發送,那自然沒有數據,故沒有數據段。

而當是請求式時,需要數據幀和遙控幀配合,先遙控幀(配有一個ID)發出給發送方,發送方收到后,以相同ID報文且用數據幀來發送數據,根據后續仲裁規則,當具有相同ID數據幀和遙控幀同時發送時,數據幀優先,則接收方可以收到數據。

1.3 錯誤幀

總線上所有設備都會監督總線的數據,錯誤”或“格式錯誤”或“應答錯誤”,這些設備便會發出錯誤幀來破壞數據,同時終止當前的發送設備

設備默認處于主動錯誤狀態,當某設備處于主動狀態時發生的錯誤太多,就會進入被動錯誤狀態。但無論是哪種狀態,但是設備不會亂發錯誤幀,是當某設備檢測出有錯誤時,該設備才會發出錯誤幀,即圖示錯誤幀的波形

設備處于主動狀態時發出的錯誤幀的波形為:6個顯性位(邏輯0)+6個顯性位(邏輯0)【用于延遲】+錯誤界定符(固定8個邏輯1)

理解:當總線上某一個設備處于主動狀態發現錯誤時,發出6個0,相當于拉下總線,當總線上的傳輸的數據有1時就會被破換掉,因為0強于1(之前提到),那么最終其他設備收到的數據就被破換掉了。


設備處于被動錯誤狀態時發出的錯誤幀波形為:6個隱性位(邏輯1)+6個隱性位(邏輯1)【用于延遲】+錯誤界定符(固定8個邏輯1)

理解:當總線上某一個設備處于被動狀態發現錯誤時,發出6個1,相當于放開總線,就相當于自己這個設備自己破壞自己發的數據,但不破壞總線上別人發的數據(因為總線上數據是1的話就沒影響,是0的話,0強于1也沒影響)。


  • 兩種錯誤幀都有6位用于延遲:是因為當某一設備發出錯誤幀時,可能會引起其他設備也出現錯誤,那么其他設備也可能發錯誤幀,相當于給一個延遲時間,在來通過界定符來表示結束。
  • 有的同學可能回想,主動發出的錯誤幀時,發出了六個0,如果剛好總線上的數據也是6個0,那不是沒有破換掉數據?或者說不知道是錯誤幀還是數據,這種情況其實是不可能發生的!!!,連續出現6個0或者6個的情況只能是錯誤幀,因為CAN還設定了位填充規則(文章末尾)。

1.4 過載幀

當接收方收到大量數據而無法處理時,其可以發出過載幀,延緩發送方的數據發送,以平衡總線負載,避免數據丟失。

可以這樣理解:因為發送方的發送頻率是其自己決定的,當接收方接收不過來的時候,接收方就可以發出一個過載幀來破壞掉這個數據(過載幀和錯誤幀類似,連續發送了6個0,我們說錯誤幀的時候提到過這樣會破壞數據),發送方的數據沒被收到,那么發送方就會重試,那么,破壞和重試這個過程所用的時間就相當于給接收方延遲,讓它有機會慢點收數據。(或者如果發送方有相應的處理機制,收到過載幀后就會調整發送頻率)。

過載幀形式:6個顯性(邏輯0)+延遲一部分(未確定具體多少位0)+過載界定符(8個1)。

1.5 幀間隔

幀間隔的作用是將數據幀和遠程幀與前面的幀分離開。

比如:當設備連續發送數據幀時,需要有幀間隔把這些數據幀分離開。

幀間隔也分主動狀態和被動狀態。

圖上方為主動狀態:3位隱性電平(邏輯1)+ 總線空閑(n位邏輯1)

圖下方為被動狀態:3位隱性電平(邏輯1)+ 延遲傳送(8位邏輯1)+?總線空閑(n位邏輯1)

2 位填充

數據幀和遙控幀發送到總線前其實是進行了位填充再發送到總線上的。

位填充規則:發送方每發送5個相同電平后,自動追加一個相反電平的填充位,接收方檢測到填充位時,會自動移除填充位,恢復原始數據。


以下通過下圖幾個例子來理解:

“即將發送”表示設備要發出去的數據,”移除填充后”是接收方實際接受到的數據,可以看到,以下三個例子這兩項都是對應一樣的。

第一組:

要發送的數據是100000110,根據位填充規則,連續發送了5個0后,要在他后面追加一個相反電平1,如“實際發送”/“實際接收”所示,接收方最終接收的數據又會把這個追加的1移除。

第二組:

要發的是10000011110,同樣,連續5個0后補1得到100000111110,發現補了一個1后又出現了連續5個1的情況,則在后續再追加一個0得到1000001111100,最后實際接收會把這兩個填充位都移除。即:位填充插入的數據位,要和原始數據后續的數據位合并,進行新的位填充判定。

第三組:

要發011111111110,連續5個1后補0得到0111110111110,根據第二組得到的規則,追加的0要和后續的位數一起進行為位填充規則判定,發現無連續0,但原始數據中,又出現5個1,0111110111110,故補0得到:01111101111100,同樣,最后實際接收會把這兩個填充位都移除。

位填充作用:

  • 增加波形的定時信息,利于接收方執行“再同步”,防止波形長時間無變化,導致接收方不能確掌握數據采樣時機。
  • 將正常數據流與“錯誤幀”和“過載幀”區分開,標志“錯誤幀”和“過載幀”的特異性。(就是我們前面講錯誤幀時提到的,不可能在總線上傳輸的數據出現連續6個相同電平,如果出現,必是錯誤幀或過載幀)
  • 保持CAN總線在發送正常數據流時的活躍狀態,防止被誤認為總線空閑。(CAN總線規定,當出現11個1后表示CAN總線處于空閑狀態,由上面例子的第三組可以看到,傳輸的數據不可能是連續11個1的情況,出現了則必是表示CAN總線處于空閑狀態。)

注:以上均是通過學習參考文獻、嗶哩嗶哩網站上江協科技官方號以及網絡資源所得的個人經驗,如有侵權,請聯系我,歡迎指正。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72284.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MATLAB中asManyOfPattern函數用法

目錄 語法 說明 示例 匹配盡可能多的模式實例 指定要匹配的最小模式數 指定要匹配的最小和最大模式數 asManyOfPattern函數的功能是模式匹配次數盡可能多。 語法 newpat asManyOfPattern(pat) newpat asManyOfPattern(pat,minPattern) newpat asManyOfPattern(pat,m…

1×1卷積的作用與原理詳解

11卷積的作用與原理詳解 文章目錄 11卷積的作用與原理詳解引言1. 什么是11卷積?2. 11卷積的數學表達3. 11卷積的主要作用3.1 改變通道數(升維/降維)3.1.1 降維(Dimension Reduction)3.1.2 升維(Dimension I…

網絡配置的基本信息

目錄 一、網絡接口信息 1、關閉虛擬化服務 2、配置臨時IP 3、配置靜態IP 4、常見網絡命令 5、安裝Wireshark 一、網絡接口信息 輸入 ip address,會出現下面的內容 網卡名稱及其含義: 網卡名稱說明lo 表示本地回環地址。 ens32 有線網卡&#xff0c…

dify綁定飛書多維表格

dify 綁定飛書和綁定 notion 有差不多的過程,都需要套一層應用的殼子,而沒有直接可以訪問飛書文檔的 API。本文記錄如何在dify工具中使用新增多條記錄工具。 創建飛書應用 在飛書開放平臺創建一個應用,個人用戶創建企業自建應用。 自定義應…

深入解析Crawl4AI:為AI應用量身定制的高效開源爬蟲框架

引言 在當今數據驅動的時代,人工智能(AI)和大型語言模型(LLM)的發展對高質量數據的需求日益增長。如何高效地從互聯網上獲取、處理和提取有價值的數據,成為了研究人員和開發者面臨的關鍵挑戰。Crawl4AI作為…

nginx 動態計算攔截非法訪問ip

需求:在Nginx上實現一個動態攔截IP的方法,具體是當某個IP在1分鐘內訪問超過60次時,將其加入Redis并攔截,攔截時間默認1天。 技術選型:使用NginxLuaRedis的方法。這種方案通過Lua腳本在Nginx處理請求時檢查Redis中的黑…

【軟件測試】論壇系統功能測試報告

文章目錄 1.前言2.項目介紹3. 對項目進行測試3.1 設計測試用例3.2 執行測試用例 1.前言 這次測試是我學習階段的練習,由于缺少需求規格說明等文檔,需要我盡可能發散思維去設計更多的測試用例。但無論如何測試至關重要,以下是核心原因&#x…

MyBatis TypeHandler 詳解與實戰:FastJson 實現字符串轉 List

在 MyBatis 中&#xff0c;TypeHandler 是實現 Java 類型與數據庫類型雙向轉換 的核心組件。無論是處理基礎數據類型還是復雜的 JSON、枚舉或自定義對象&#xff0c;它都能通過靈活的擴展機制滿足開發需求。本文將通過一個 將數據庫 JSON 字符串轉換為 List<User> 的案例…

《HelloGitHub》第 107 期

興趣是最好的老師&#xff0c;HelloGitHub 讓你對編程感興趣&#xff01; 簡介 HelloGitHub 分享 GitHub 上有趣、入門級的開源項目。 github.com/521xueweihan/HelloGitHub 這里有實戰項目、入門教程、黑科技、開源書籍、大廠開源項目等&#xff0c;涵蓋多種編程語言 Python、…

【每日一題 | 2025】2.24 ~ 3.2

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;每日一題 文章目錄 1. 【2.24】P10424 [藍橋杯 2024 省 B] 好數2. 【2.25】P8665 [藍橋杯 2018 省 A] 航班時間3. 【2.26】P10905 [藍橋杯 2024 省 C] 回文字符串4. 【2.27】P10425 [藍橋杯 2024 省 B] R 格式5. 【2.28】P10426…

【03】STM32F407 HAL 庫框架設計學習

【03】STM32F407 HAL 庫框架設計學習 摘要 本文旨在為初學者提供一個關于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;庫框架設計的詳細學習教程。通過本文&#xff0c;讀者將從零開始&#xff0c;逐步掌握STM32F407的基本知識、HAL庫的配置步驟…

跟著官方文檔學習UE C++ TArray容器系列 迭代 和 排序

一.首先測試下&#xff0c;官方案例 迭代器的方法&#xff0c;有點不常見。有點像個指針&#xff0c;迭代完還自帶break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

C++中的“結界”機制:作用域與變量可見性探秘

一、編程世界的“結界”概念 源自佛學的結界概念&#xff0c;在C中體現為作用域機制。程序中的每個函數都會形成獨立的作用域屏障&#xff0c;如同魔法結界般保護內部變量&#xff0c;使其與外界的同名變量互不干擾。這種機制保證了代碼模塊的獨立性和安全性&#xff0c;但當存…

3-6 WPS JS宏 工作表移動復制實例-1(工作表的拆分操作)學習筆記

************************************************************************************************************** 點擊進入 -我要自學網-國內領先的專業視頻教程學習網站 *******************************************************************************************…

Qt 對象樹詳解:從原理到運用

1. 什么是對象樹&#xff1f; 對象樹是一種基于父子關系的對象管理機制。在 Qt 中&#xff0c;所有繼承自 QObject 的類都可以參與到對象樹中。 當一個對象被設置為另一個對象的父對象時&#xff0c;子對象會被添加到父對象的內部列表中&#xff0c;形成一種樹狀結構。 Qt 提…

使用hutool將json集合對象轉化為對象

集合之間相互轉化 //List轉Json&#xff0c;maps是List類型的參數 String json JSONUtil.toJsonStr(maps); System.out.println("這是json字符串: "json);//Json轉List JSONArray objects JSONUtil.parseArray(json); List<Map> maps1 JSONUtil.toList(objec…

Qt關于平滑滾動的使用QScroller及QScrollerProperties類說明

一、觸控時代的滾動工具&#xff1a;QScroller類設計介紹 1.1 從機械滾輪到數字慣性 在觸控設備普及前&#xff0c;滾動操作如同老式打字機的滾軸&#xff0c;只能通過鼠標滾輪或滾動條進行離散式控制。QScroller的出現如同給數字界面裝上了"慣性飛輪"&#xff0c;…

JavaAPI(網絡編程)

網絡通信協議 通信協議 ?所謂通信協議&#xff0c;是指通信雙方在進行數據交換時必須遵守的規則和約定。?這些規則確保了雙方能夠有效地進行通信&#xff0c;實現信息的交換和資源共享。通信協議定義了傳輸時的數據格式、控制信息以及傳輸順序和速度等&#xff0c;確保雙方…

Java---入門基礎篇(下)---方法與數組

前言 本篇文章主要講解有關方法與數組的知識點 ,是基礎篇的一部分 , 而在下一篇文章我會講解類和對象的知識點 入門基礎篇上的鏈接給大家放在下面啦 ! Java---入門基礎篇(上)-CSDN博客 感謝大家點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb; 歡迎各位大佬指點…

Python 爬蟲 – BeautifulSoup

Python 爬蟲&#xff08;Web Scraping&#xff09;是指通過編寫 Python 程序從互聯網上自動提取信息的過程。 爬蟲的基本流程通常包括發送 HTTP 請求獲取網頁內容、解析網頁并提取數據&#xff0c;然后存儲數據。 Python 的豐富生態使其成為開發爬蟲的熱門語言&#xff0c;特…