CAN總線嘔心瀝血教程
《CAN總線嘔心瀝血教程》由會員分享,可在線閱讀,更多相關(guān)《CAN總線嘔心瀝血教程(6頁珍藏版)》請在裝配圖網(wǎng)上搜索。
哥很郁悶 為了 CAN 研究了不少 看了不少資料 現(xiàn)在我給大家總結(jié)一下 先看看工作原理 當(dāng) CAN 總線上的一個節(jié)點 站 發(fā)送數(shù)據(jù)時 它以報文的形式廣播給網(wǎng)絡(luò)中 所有節(jié)點 對每個節(jié)點來說 無論數(shù)據(jù)是否是發(fā)給自己的 都對其接收 每組 報文開頭的 11 位字符為標(biāo)識符 定義了報文的優(yōu)先級 這種報文格式成為面向 內(nèi)容的編制方案 同一系統(tǒng)中標(biāo)識符是唯一的 不可能有兩個站發(fā)送具有相同 標(biāo)識符的報文 當(dāng)幾個站同時競爭總線讀取時 這種配置十分重要 大體的工作原理我們搞清了 但是根本的協(xié)議我們還要花一番功夫 下面介 紹一個重要的名詞 顯性 和 隱性 在我看到的很多文章里 有很多顯性和隱性的地方 為此我頭痛不已 最終 我把它們徹底弄明白了 首先 CAN 數(shù)據(jù)總線有兩條導(dǎo)線 一條是黃色的 一條是綠色的 分別是 CAN High 線和 CAN Low 線 當(dāng)靜止?fàn)顟B(tài)時 這兩條導(dǎo)線上的電平一樣 這個電平稱為靜電平 大約為 2 5 伏 這個靜電平狀態(tài)就是隱形狀態(tài) 也稱隱性電平 也就是沒有任何干擾的時候的 狀態(tài)稱為隱性狀態(tài) 當(dāng)有信號修改時 CAN High 線上的電壓值變高了 一般來 說會升高至少 1V 而 CAN Low 線上的電壓值會降低一個同樣值 也是 1v 那么這時候 CAN High 就 是 2 5v 1v 3 5v 它就處于激活狀態(tài)了 而 CAN Low 降為 2 5v 1v 1 5v 可以看看這個圖 由此我們得到 在隱性狀態(tài)下 CAN High 線與 CAN Low 沒有電壓差 這樣我們看到?jīng)]有任 何變化也就檢測不到信號 但是在顯性狀態(tài)時 電壓差最低為 2V 我們就可以 利用這種變化才傳輸數(shù)據(jù)了 所以出現(xiàn)了那些幀 那些幀中的場 那些場中的 位 云云 在總線上通常邏輯 1 表示隱性 而 0 表示顯性 這些 1 啊 0 啊 就可以利用 起來為我們傳數(shù)據(jù)了 利用這種電壓差 我們可以接收信號 一般來說 控制單元通過收發(fā)器連接到 CAN 驅(qū)動總線上 這個收發(fā)器 顧名 思義 可發(fā)送 可接收 內(nèi)有一個接收器 該接收器是安裝在接收一側(cè)的差動 信號放大器 然后 這個放大器很自然地就放大了 CAN High 和 CAN Low 線 的電平差 然后傳到接收區(qū) 如下圖 由上圖可知 當(dāng)有電壓差 差動信號放大器放大傳輸 將相應(yīng)的數(shù)據(jù)位任可為 0 下面我們進(jìn)入重點難點 報文 所謂報文 就是 CAN 總線上要傳輸?shù)臄?shù)據(jù)報 為了安全 我們要給我們傳輸 的數(shù)據(jù)報編碼定一下協(xié)議 這樣才能不容易出錯 所以出現(xiàn)了很多的幀 以及 仲裁啊 CRC 效驗 這些都是難點 識別符的概念 識別符顧名思義 就是為了區(qū)分不同報文的可以鑒別的好多字符位 有標(biāo)準(zhǔn)的 和擴展的 標(biāo)準(zhǔn)的是 11 位 擴展的是 29 位 他有一個功能就是可以提供優(yōu)先 級 也就是決定哪個報文優(yōu)先被傳輸 報文標(biāo)識符的值越小 報文具有越高的 優(yōu)先權(quán) CAN 的報文格式有兩種 不同之處其實就是識別符長度不同 具有 11 位識別 符的幀稱為標(biāo)準(zhǔn)幀 而還有 29 位識別符的幀為擴展幀 CAN 報文有以下 4 個 不同的幀類型 分別是 1 數(shù)據(jù)幀 數(shù)據(jù)幀將數(shù)據(jù)從發(fā)送器傳輸?shù)浇邮掌?2 遠(yuǎn)程幀 總線節(jié)點發(fā)出遠(yuǎn)程幀 請求發(fā)送具有同一標(biāo)識符的數(shù)據(jù)幀 3 錯誤幀 任何節(jié)點檢測到總線錯誤就發(fā)出錯誤幀 4 過載幀 過載幀用已在先行的后續(xù)的數(shù)據(jù)幀 或遠(yuǎn)程幀 之間提供一 附加的延時 我們先研究數(shù)據(jù)幀吧 一 數(shù)據(jù)幀由 7 個不同位場組成 這里的位場 就是不同位的組合 這名字起的很爛 讓人看了感覺很抽象 我 們來看看這些個不同的位場吧 一開始是一位幀起始 也叫 SOF 它用顯性位表示 也就是 0 它告訴我們 兩 個線上有電壓差了 也就是有數(shù)據(jù)了 這個幀起始看起來只有一位 起始不簡 單了 為了讓所有的分站都同步于發(fā)送報文的發(fā)送站 好接收數(shù)據(jù) 有很多要 考慮的地方 然后下一個場是仲裁場 這個仲裁場是個難點 但是不要怕 有我在 你會很 明白地搞定的 這個仲裁很抽象 其實在這里就是為了解決一個問題 如果 2 個或 2 個以上的 單元同時開始傳送報文 那么就會有總線訪問沖突 那么仲裁機制就是用來根 據(jù)標(biāo)識符優(yōu)先級來一個一個的去掉低級別的數(shù)據(jù) 我們可以詳細(xì)的描述這場生 動的爭搶總線的戰(zhàn)斗 問題是多個數(shù)據(jù)發(fā)往總線 總線電平不會累積嗎 標(biāo)識 符越低 顯性位越多 是硬件仲裁的還是一種軟件機制 當(dāng)總線處于空閑狀態(tài)時呈隱性電平 此時任何節(jié)點都可以向總線發(fā)送顯性電平 作為幀的開始 2 個或 2 個以上的節(jié)點同時發(fā)送開始爭搶總線 但是總線只能被一個人 搶走 總線只屬于一個他 這時候到底怎么決定誰留下 誰滾蛋呢 我們開始考慮 思索 我們以前定義了標(biāo)識符 標(biāo)識符有優(yōu)先級 它越小 它優(yōu)先級越高 那么怎么實現(xiàn)的呢 看下面把 首先搞明白兩點 一 下面的圖 低波形代表 0 高波形代表 1 二 當(dāng)隱性碰到顯性 就變 為顯性 如圖所示 節(jié)點 A 和節(jié)點 B 的標(biāo)識符的第 10 9 8 位電平相同 因此兩個節(jié)點偵聽到的 信息和它們發(fā)出的信息相同 第 7 位節(jié)點 B 發(fā)出一個 1 但從節(jié)點上接收到的消息卻是 0 為什么呢 因為 A 節(jié)點同時發(fā)出顯性位 讓總線也變成顯性了 也就是 0 節(jié)點 B 會退出發(fā)送處于單純監(jiān)聽方式而不發(fā)送數(shù)據(jù) 節(jié)點 A 成功發(fā)送仲裁位從而獲得總線的控制 權(quán) 繼而發(fā)送全部消息 總線中的信號持續(xù)跟蹤最后獲得總線控制權(quán)發(fā)出的報文 本例中 節(jié)點 A 的報文將被跟蹤 這種非破壞性位仲裁方法的優(yōu)點在于 在網(wǎng)絡(luò)最終確定哪個節(jié)點 被傳送前 報文的起始部分已經(jīng)在網(wǎng)絡(luò)中傳輸了 因此具有高優(yōu)先級的節(jié)點的數(shù)據(jù)傳輸沒 有任何延時 在獲得總線控制權(quán)的節(jié)點發(fā)送數(shù)據(jù)過程中 其他節(jié)點成為報文的接收節(jié)點 并且不會在總線再次空閑之前發(fā)送報文 自己也算接收節(jié)點 是的 總線嘛 在這逐位的比較中 最終節(jié)點 B 因為第七位的偏差丟掉了總線 從此單純監(jiān)聽 江山就拱手讓給了節(jié)點 A 了 這就是仲裁機制 這里我們涉及到總線值 總線值 總線有二個互補的邏輯值 顯性 或 隱性 顯性 位和 隱性 位同時傳送 時 總線的結(jié)果值為 顯性 比如 在總線的 寫與 執(zhí)行時 邏輯 0 代表 顯性 等級 邏輯 1 代表 隱性 等級 上面我們說過 報文有兩種格式 標(biāo)準(zhǔn)和擴展 這里 不同的格式仲裁場是不 一樣的 標(biāo)準(zhǔn)格式下 仲裁場由 11 位識別符和 RTR 位組成 但在擴展格式里 包括 29 位識別符 SRR 位 IDE 位 RTR 位 RTR 位 Remote Tranmission Request BIT 全稱為 遠(yuǎn)程發(fā)送請求位 它在數(shù)據(jù) 幀里必須為顯性 0 但在遠(yuǎn)程幀里為隱性 1 我暈 為什么這么搞呢 不急 先留著這個問題 SRR 位 替代遠(yuǎn)程請求位 SRR 是一隱性位 也就是 1 它在擴展格式的標(biāo)準(zhǔn) 幀 RTR 位位置 那么標(biāo)準(zhǔn)幀怪不得優(yōu)先于擴展幀了 因為在傳輸完 11 位標(biāo)識 符之后 擴展幀的后 18 位在最后發(fā)送 先發(fā)送 11 位標(biāo)識符 輪到標(biāo)準(zhǔn)幀的 RTR 位和擴展幀的 SRR 位了 這時候 標(biāo)準(zhǔn)幀的 RTR 為顯性 而擴展幀 SRR 為隱性 這樣 總線自然就被標(biāo)準(zhǔn)幀占據(jù) 同時上面那個問題 也一目了 然了 CAN 總線協(xié)議設(shè)計者 肯定是設(shè)計了數(shù)據(jù)幀優(yōu)先于遠(yuǎn)程幀所以 IDE 全稱識別符擴展位 Identifier Extension Bit 它屬于擴展格式的仲裁場 標(biāo)準(zhǔn)格式的控制場 標(biāo)準(zhǔn)格式的 IDE 位為顯性 擴展格式里 IDE 位為隱性 這樣擴展格式的數(shù)據(jù)幀 優(yōu)先級又落下了一截 控制場 控制場有 6 位組成 標(biāo)準(zhǔn)的跟擴展的又不同 標(biāo)準(zhǔn)的格式里的幀先是 IDE 位 然后保留位 r0 然后數(shù)據(jù)長度代碼 共四位 分別是 DLC3 DLC2 DLC1 DLC0 而擴展格式里 IDE 替換為 r1 保留位 其余不 變 數(shù)據(jù)長度代碼指示了數(shù)據(jù)場里的字節(jié)數(shù)量 數(shù)據(jù)場 數(shù)據(jù)場由發(fā)送數(shù)據(jù)組成 可以為 0 8 個字節(jié) 從高位開始 MSB 先發(fā)送 CRC 場 包括 CRC 序列 和 CRC 界定符 這個 CRC 序列又是一個難點 具體什么是 CRC 序列呢 CRC 即循環(huán)冗余校驗碼 Cyclic Redundancy Check 是數(shù)據(jù)通信領(lǐng) 域中最常用的一種差錯校驗碼 其特征是信息字段和校驗字段的長度 可以任意選定 生成 CRC 碼的基本原理 任意一個由二進(jìn)制位串組成的代碼都可以和 一個系數(shù)僅為 0 和 1 取值的多項式一一對應(yīng) 例如 代碼 1010111 對應(yīng)的多項式為 x6 x4 x2 x 1 而多項式為 x5 x3 x2 x 1 對 應(yīng)的代碼 101111 參考一下下面的例題 自已再領(lǐng)悟一下吧 已知信息位為 1100 生成多項式 G x x3 x 1 求 CRC 碼 M x 1100 M x x3 1100000 G x 1011 M x x3 G x 1110 010 1011 R x 010 CRC 碼為 M x x 3 R x 1100000 010 1100010 其原理是 CRC 碼一般在 k 位信息位之后拼接 r 位校 驗位生成 編碼步驟如下 1 將待編碼的 k 位信息表示成多項式 M x 2 將 M x 左移 r 位 得到 M x xr 3 用 r 1 位的生成多項式 G x 去除 M x xr 得到余數(shù) R x 4 將 M x xr 與 R x 作模 2 加 得到 CRC 碼 應(yīng)答場 應(yīng)答場 ACK 長度為 2 個位 包含應(yīng)答間隙和應(yīng)答界定符 在 ACK 場里 發(fā)送站發(fā)送兩個隱性位 當(dāng)接收器正確接收到有效地報文 接收器就會在應(yīng)答 間隙期間 發(fā)送 ACK 信號 向發(fā)送器發(fā)送一顯性位以示應(yīng)答 二 遠(yuǎn)程幀 通過發(fā)送遠(yuǎn)程幀 總線的節(jié)點發(fā)出遠(yuǎn)程幀 請求以前發(fā)送給它數(shù)據(jù)幀的節(jié)點再 發(fā)送一遍 具體發(fā)送哪個數(shù)據(jù)幀 由遠(yuǎn)程幀的標(biāo)識符決定 遠(yuǎn)程幀的 RTR 是隱性的 沒有數(shù)據(jù)場 其余都與數(shù)據(jù)幀相同 三 錯誤幀 錯誤幀由兩個不同的場組成 第一個場是不同站提供的錯誤標(biāo)志的疊加 第二 個場是錯誤界定符 1 錯誤標(biāo)志 有兩種形式的錯誤標(biāo)志 主動地和被動的 這就讓人很明白了 也就是說主動 發(fā)出錯誤的節(jié)點發(fā)出錯誤幀時 就是主動地錯誤標(biāo)志 而接收錯誤幀的節(jié)點 就發(fā)出被動錯誤標(biāo)志 主動地錯誤標(biāo)志由 6 個連續(xù)的顯性位組成 被動的錯誤標(biāo)志由 6 個連續(xù)的隱形位組成 除非被其他節(jié)點的顯性位重寫 檢測到錯誤條件的錯誤激活的站通過發(fā)送主動錯誤標(biāo)志指示錯誤 這個錯誤幀 也可以看做有著跟數(shù)據(jù)幀類似的場結(jié)構(gòu) 錯誤標(biāo)志的形式顯然破壞了從幀起始 到 CRC 界定符的位填充規(guī)則 檢測到 5 個相同的位 就插入一個補充位 但是 錯誤幀卻有 6 個相同的位 顯然破壞了 或者破壞了 ACK 場或幀結(jié)尾場的固 定形式 所有其他的站由此檢測到錯誤條件 并于此同時發(fā)送錯誤標(biāo)志 并且 假如有很多站都有自己的錯誤發(fā)送 它們會都發(fā)送主動錯誤標(biāo)志 這種顯性標(biāo) 志顯然被疊加在一起 2 錯誤界定符 錯誤界定符包括8個 隱性 的位 錯誤標(biāo)志傳送了以后 每一個節(jié)點就發(fā)送一個 隱性 的位 并一直監(jiān)視總線直到檢 測出一個 隱性 的位為止 然后就開始發(fā)送其余7個 隱性 位 四 過載幀 過載幀包括 2 個位場 過載標(biāo)志和過載界定符 有三種過載的情況 這三種情況都會引起過載標(biāo)志的發(fā)送 1 接收器的內(nèi)部情況 此接收器對于下一數(shù)據(jù)幀或遠(yuǎn)程幀需要一定的延時 這種情況引發(fā)的過載幀只允許起始于所期望間歇的第一個位時間 2 在間歇的第 1 和第 2 字節(jié)檢測到一個顯性位 這里有個間歇的概念 我們可以講講 間歇屬于幀間空間的一部分 它包含 三個隱性位 間歇期間 所有的站不允許傳送數(shù)據(jù)幀或遠(yuǎn)程幀 它唯一要做的 就是標(biāo)示一個過載條件 3 如果 CAN 節(jié)點在錯誤界定符或過載界定符的第 8 位采樣到一個顯性位 有了上面的情況 則節(jié)點會發(fā)送一個過載幀 錯誤計數(shù)器不會增加 對于情況 2 3 引發(fā)的過載幀應(yīng)起始于所檢測到顯性位之后的位 通常為了延時下一個數(shù)據(jù)幀或遠(yuǎn)程幀 兩種過載幀均可產(chǎn)生 過載標(biāo)志 由 6 個顯性位組成 過載標(biāo)志的所有形式和主動錯誤標(biāo)志一樣 過載標(biāo)志的形式破壞了間歇場的固定形式 因此 所有其他的站都檢測到過 載條件并于此同時發(fā)出過載標(biāo)志 過載界定符 8 個隱形位 幀間空間 數(shù)據(jù)幀 或遠(yuǎn)程幀 與先行幀的隔離是通過幀間空間實現(xiàn)的 無論此先行幀 類型如何 所不同的是過載幀與錯誤幀之間沒有幀間空間 多個過載幀之間也 不是由幀間空間隔離的 幀間空間包括間歇 總線空閑的位場 如果錯誤被動的站已作為前一報文的 發(fā)送器 則其幀空間除了間歇 總線空閑外 還包括稱作掛起傳送的位場 1 間歇 Intermission 間歇包括3個 隱性 的位 間歇期間 所有的節(jié)點均不允許傳送數(shù)據(jù)幀或遠(yuǎn)程幀 唯 一要做的是標(biāo)示一個過載條件 如果 CAN 節(jié)點有一報文等待發(fā)送并且節(jié)點在間歇的第三位采集到一顯性位 則此位被 解釋為幀的起始位 并從下一位開始發(fā)送報文的標(biāo)識符首位 而不用首先發(fā)送幀的起始位 或成為一接收器 2 總線空閑 Bus Idle 總線空閑的時間是任意的 只要總線被認(rèn)定為空閑 任何等待發(fā)送報文的節(jié)點就會訪 問總線 在發(fā)送其他報文期間 有報文被掛起 對于這樣的報文 其傳送起始于間歇之后 的第一個位- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- CAN 總線 嘔心瀝血 教程
鏈接地址:http://italysoccerbets.com/p-10016981.html