1寫在前面
上一篇文章講述了CAN收發(fā)器的重要作用,也提及了一下CAN總線的優(yōu)勢主要在于CAN控制器。CAN控制器在CAN網(wǎng)絡(luò)中所處的位置如下圖:
本文講述的CAN控制器實現(xiàn)的幾個重要功能:CAN總線波特率、位時序、幀類型。
2
CAN總線波特率
CAN總線屬于異步通信,因此就有通信波特率,而這個波特率發(fā)生器就位于CAN控制器內(nèi)部。我們不需要了解它是如何產(chǎn)生的,但需要了解它的含義。這章節(jié)針對初學者講述以下兩點內(nèi)容。
2.1 異步通信
在串行通信中,主要分異步通信和同步通信。
同步通信:通信設(shè)備之間通過同步信號(CLK時鐘)來實現(xiàn)數(shù)據(jù)傳輸?shù)耐ㄐ沤型酵ㄐ拧H?a href="http://wenjunhu.com/tags/i2c/" target="_blank">I2C、SPI這類通信中都具有一個時鐘信號,其實在STM32中USART也具有同步功能,只是我們大多數(shù)人都只用了它的異步功能。
異步通信:簡單來說,就是通信設(shè)備之間通過約定一樣的時間來收發(fā)數(shù)據(jù)。而這個時間就會決定本節(jié)說的波特率。
2.2 波特率
很多工程師一直都沒徹底搞明白什么是波特率,我這里還是結(jié)合UART波特率來簡述一下其含義。
在電子通信領(lǐng)域,波特(Baud)即調(diào)制速率,指的是有效數(shù)據(jù)信號調(diào)制載波的速率,即單位時間內(nèi)載波調(diào)制狀態(tài)變化的次數(shù)。它是對符號傳輸速率的一種度量,1波特即指每秒傳輸1個符號。
UART每秒鐘傳送240個字符,而每個字符格式包含10位(1個起始位,1個停止位,8個數(shù)據(jù)位),這時的波特率為240Bd,比特率為10位*240個/秒=2400bps。
從上面的描述可以總結(jié):
比特率:即單位時間內(nèi)傳送的二進制位數(shù);
波特率:即單位時間內(nèi)傳輸?shù)姆杺€數(shù);
只有在每個符號只代表一個比特信息的情況下,波特率與比特率才在數(shù)值上相等,但是它們的意義并不相同。
3
位時序
上一章節(jié)講述了波特率,而決定波特率大小的就是本節(jié)說的位時序。在CAN標準中一個位可分為4段:
同步段(SS)
傳播時間段(PTS)
相位緩沖段1(PBS1)
相位緩沖段2(PBS2)
這些段又由可稱為 Time Quantum(簡稱Tq)的最小時間單位構(gòu)成。
1位分為4個段,每個段又由若干個Tq構(gòu)成,這稱為位時序。
而在STM32參考手冊中,將位時序分為三段,但它將它傳播段和位段1合并在一起了,如下圖:
1位由多少個Tq構(gòu)成、每個段又由多少個Tq構(gòu)成等,可任意設(shè)定位時序。通過設(shè)定位時序,決定傳輸?shù)牟ㄌ芈剩?/p>
這幾個參數(shù)會在以后編程中進行配置,從而決定通信的波特率。
關(guān)于同步,還有硬件同步、再同步等操作。但初學者可以不必過多理解,掌握上面基礎(chǔ)內(nèi)容就行了。更多關(guān)于位時序的內(nèi)容可以參看 ISO 11898 標準。
4
幀類型及格式說明
CAN總線是通過以下5種類型的幀進行通信:
數(shù)據(jù)幀:用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀。
遙控幀:用于接收單元向具有相同 ID 的發(fā)送單元請求數(shù)據(jù)的幀。
錯誤幀:用于當檢測出錯誤時向其它單元通知錯誤的幀。
過載幀:用于接收單元通知其尚未做好接收準備的幀。
幀間隔:用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開來的幀。
數(shù)據(jù)幀和遙控幀有標準格式和擴展格式兩種格式。標準格式有11個位的標識符ID,擴展格式有29個位的ID。
4.1 數(shù)據(jù)幀
如上圖,數(shù)據(jù)幀由7個段構(gòu)成:
(1) 幀起始
表示數(shù)據(jù)幀開始的段。
(2) 仲裁段
表示該幀優(yōu)先級的段。
(3) 控制段
表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
(4) 數(shù)據(jù)段
數(shù)據(jù)的內(nèi)容,可發(fā)送 0~8 個字節(jié)的數(shù)據(jù)。
(5) CRC 段
檢查幀的傳輸錯誤的段。
(6) ACK 段
表示確認正常接收的段。
(7) 幀結(jié)束
表示數(shù)據(jù)幀結(jié)束的段。
理解數(shù)據(jù)幀的含義,請從認真理解它的定義:用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀。
一般的CAN總線通信,總線上通信絕大部分時候都是數(shù)據(jù)幀。像在CANOpen協(xié)議中,用的最多的PDO過程數(shù)據(jù)對象就是通過數(shù)據(jù)幀進行的通信。
初學者可以先理解數(shù)據(jù)幀,然后其他就容易理解了。下面再來講述一下數(shù)據(jù)幀7段的詳情。
4.1.1 幀起始
標準和擴展格式相同。表示幀開始的段,1個位的顯性位(如下圖):
關(guān)于顯性和隱性電平,請參看我上一篇文章差分信號章節(jié)。
總線上的電平有顯性電平和隱性電平兩種。
總線上執(zhí)行邏輯上的線“與”時,顯性電平的邏輯值為“0”,隱性電平為“1”。
“顯性”具有“優(yōu)先”的意味,只要有一個單元輸出顯性電平,總線上即為顯性電平。并且,“隱性”具有“包容”的意味,只有所有的單元都輸出隱性電平,總線上才為隱性電平。(顯性電平比隱性電平更強)
4.1.2 仲裁段
標準格式和擴展格式在此的構(gòu)成有所不同。仲裁段表示該幀優(yōu)先級的段,擴展格式多了18位ID(如下圖):
RTR = 0代表數(shù)據(jù)幀,RTR = 1代表遠程幀。
為什么叫仲裁段,就是通過ID來判斷總線上哪一個節(jié)點具有優(yōu)先發(fā)送的權(quán)利。ID越小(0代表顯性),優(yōu)先級越高。
4.1.3 控制段
標準和擴展格式的構(gòu)成有所不同??刂贫斡?6 個位構(gòu)成(如下圖):
它們除了都有4位表示數(shù)據(jù)段長度代碼(DLC)外,標準幀有IDE(數(shù)值為0)位和r0保留位,擴展幀有r0和r1保留位。
保留位必須全部以顯性電平發(fā)送。但接收方可以接收顯性、隱性及其任意組合的電平。
4.1.4 數(shù)據(jù)段
標準和擴展格式相同。數(shù)據(jù)段表示傳輸數(shù)據(jù)的內(nèi)容,從 MSB(最高位)開始輸出,可發(fā)送 0~8 個字節(jié)的數(shù)據(jù),長度由前面控制段決定。
4.1.5 CRC段
標準和擴展格式相同。CRC段是檢查幀傳輸錯誤的幀,由 15 個位的 CRC 順序和 1 個位的 CRC 界定符(用于分隔的位)構(gòu)成。
相比485這類通信,CAN控制器就已經(jīng)把CRC校驗做了,不需要你的程序再次去計算,從而節(jié)約了處理器資源。
4.1.6 ACK段
標準和擴展格式相同。ACK段用來確認是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 個位構(gòu)成。
A.發(fā)送單元在 ACK 段發(fā)送 2 個位的隱性位。
B.接收到正確消息的單元在 ACK 槽(ACK Slot)發(fā)送顯性位, 通知發(fā)送單元正常接收結(jié)束。這稱作“發(fā)送 ACK”或者“返回 ACK”。
4.1.7 幀結(jié)束
標準和擴展格式相同。幀結(jié)束是表示該該幀的結(jié)束的段。由 7 個位的隱性位構(gòu)成。
4.2 遙控幀
和數(shù)據(jù)幀相比,遙控幀是接收單元向發(fā)送單元請求發(fā)送數(shù)據(jù)所用的幀。所以,遙控幀沒有數(shù)據(jù)段。因此,遙控幀由如下 6 個段組成:
(1) 幀起始(SOF)
表示幀開始的段。
(2) 仲裁段
表示該幀優(yōu)先級的段??烧埱缶哂邢嗤?ID 的數(shù)據(jù)幀。
(3) 控制段
表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。
(4) CRC 段
檢查幀的傳輸錯誤的段。
(5) ACK 段
表示確認正常接收的段。
(6) 幀結(jié)束
表示遙控幀結(jié)束的段。
這6個段和上面數(shù)據(jù)幀的內(nèi)容基本一樣,這里就不一一講述了。講一下遙控幀和數(shù)據(jù)幀的區(qū)別:
遙控幀的 RTR 位為隱性位,沒有數(shù)據(jù)段。
沒有數(shù)據(jù)段的數(shù)據(jù)幀和遙控幀可通過 RTR 位區(qū)別開來。
問題一:遙控幀沒有數(shù)據(jù)段,數(shù)據(jù)長度碼該如何表示?
遙控幀的數(shù)據(jù)長度碼以所請求數(shù)據(jù)幀的數(shù)據(jù)長度碼表示。
問題二:沒有數(shù)據(jù)段的數(shù)據(jù)幀有何用途?
例如,可用于各單元的定期連接確認/應(yīng)答、或仲裁段本身帶有實質(zhì)性信息的情況下。
4.3 錯誤幀
用于在接收和發(fā)送消息時檢測出錯誤通知錯誤的幀。錯誤幀由錯誤標志和錯誤界定符構(gòu)成。
(1) 錯誤標志
錯誤標志包括主動錯誤標志和被動錯誤標志兩種。
主動錯誤標志: 6 個位的顯性位。
被動錯誤標志: 6 個位的隱性位。
(2) 錯誤界定符
錯誤界定符由 8 個位的隱性位構(gòu)成。
4.4 過載幀
過載幀是用于接收單元通知其尚未完成接收準備的幀。過載幀由過載標志和過載界定符構(gòu)成。
(1) 過載標志
6 個位的顯性位。
過載標志的構(gòu)成與主動錯誤標志的構(gòu)成相同。
(2) 過載界定符
8 個位的隱性位。
過載界定符的構(gòu)成與錯誤界定符的構(gòu)成相同。
4.5 幀間隔
幀間隔是用于分隔數(shù)據(jù)幀和遙控幀的幀。數(shù)據(jù)幀和遙控幀可通過插入幀間隔將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分開。
過載幀和錯誤幀前不能插入幀間隔。
(1) 間隔
3 個位的隱性位。
(2) 總線空閑
隱性電平,無長度限制(0 亦可)。
本狀態(tài)下,可視為總線空閑,要發(fā)送的單元可開始訪問總線。
(3) 延遲傳送(發(fā)送暫時停止)
8 個位的隱性位。
只在處于被動錯誤狀態(tài)的單元剛發(fā)送一個消息后的幀間隔中包含的段。
-
CAN總線
+關(guān)注
關(guān)注
145文章
1951瀏覽量
130753 -
CANopen
+關(guān)注
關(guān)注
8文章
253瀏覽量
43588 -
波特率
+關(guān)注
關(guān)注
2文章
307瀏覽量
34141
發(fā)布評論請先 登錄
相關(guān)推薦
評論