本文主要介紹CAN總線的幀類型及結(jié)構(gòu)。
CAN總線定義五種幀類型,分別為數(shù)據(jù)幀、遠(yuǎn)程幀、錯誤幀、過載幀和幀間隔。數(shù)據(jù)幀就是總線上傳輸用戶數(shù)據(jù)的幀,其最高有效載荷是8字節(jié)(CAN FD為64字節(jié)),除了有效載荷外,數(shù)據(jù)幀還包括必要的幀頭幀位部分以執(zhí)行CAN標(biāo)準(zhǔn)通信,比如消息標(biāo)識符(Identifier)、數(shù)據(jù)長度代碼、校驗信息等。遠(yuǎn)程幀是用來向總線上其它節(jié)點(diǎn)請求數(shù)據(jù)的幀,它的幀結(jié)構(gòu)與數(shù)據(jù)幀相似,只不過沒有有效載荷部分;錯誤幀是表示通信出錯的幀;幀間隔是用來隔離數(shù)據(jù)幀或者遙控幀的。
數(shù)據(jù)幀和遠(yuǎn)程幀有標(biāo)準(zhǔn)格式和擴(kuò)展格式兩種格式。標(biāo)準(zhǔn)格式有11位的標(biāo)識符,擴(kuò)展格式有29位標(biāo)識符。
幀類型 | 幀用途 | 備注 |
數(shù)據(jù)幀 | 用于發(fā)送單元向接收單元傳送數(shù)據(jù)的幀 | 分為標(biāo)準(zhǔn)格式和擴(kuò)展格式,標(biāo)準(zhǔn)格式有11位標(biāo)識符,擴(kuò)展格式有29位標(biāo)識符 |
遙控幀 | 用于接收單元向具有相同ID的發(fā)送單元請求數(shù)據(jù)的幀 | |
錯誤幀 | 用于當(dāng)檢測出錯誤時向其它單元通知錯誤的幀 | |
過載幀 | 用于接收單元通知其尚未做好接收準(zhǔn)備的幀 | |
幀間隔 | 用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開來的幀 | 過載幀和錯誤幀前不能插入幀間隔 |
數(shù)據(jù)幀
數(shù)據(jù)幀的幀結(jié)構(gòu)如下圖所示:
各個字段定義及長度分別為:
SOF:表示數(shù)據(jù)幀開始;(1bit)
Identifier:標(biāo)準(zhǔn)格式11 bit,擴(kuò)展格式29 bit包括Base Identifier(11bit)和Extended Identifier(18bit),該區(qū)段標(biāo)識數(shù)據(jù)幀的優(yōu)先級,數(shù)值越小,優(yōu)先級越高;
RTR:遠(yuǎn)程傳輸請求位,0時表示為數(shù)據(jù)幀,1表示為遠(yuǎn)程幀,也就是說RTR=1時,消息幀的Data Field為空;(1bit)
IDE:標(biāo)識符擴(kuò)展位,0時表示為標(biāo)準(zhǔn)格式,1表示為擴(kuò)展格式;(1bit)
DLC:數(shù)據(jù)長度代碼,0~8表示數(shù)據(jù)長度為0~8 Byte;(4bit)
Data Field:數(shù)據(jù)域;(0~8Byte)
CRC Sequence:校驗域,校驗算法G(x) = x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1;(15bit)
DEL:校驗域和應(yīng)答域的隱性界定符;(1bit)
ACK:應(yīng)答,確認(rèn)數(shù)據(jù)是否正常接收,所謂正常接收是指不含填充錯誤、格式錯誤、 CRC 錯誤。發(fā)送節(jié)點(diǎn)將此位為1,接收節(jié)點(diǎn)正常接收數(shù)據(jù)后將此位置為0;(1bit)
SRR:替代遠(yuǎn)程請求位,在擴(kuò)展格式中占位用,必須為1;(1bit)
EOF:連續(xù)7個隱性位(1)表示幀結(jié)束;(7bit)
ITM:幀間隔,Intermission (ITM),又稱Interframe Space (IFS),連續(xù)3個隱性位,但它不屬于數(shù)據(jù)幀。幀間空間是用于將數(shù)據(jù)幀和遠(yuǎn)程幀與前面的幀分離開來的幀。數(shù)據(jù)幀和遠(yuǎn)程幀可通過插入幀間空間將本幀與前面的任何幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分開。過載幀和錯誤幀前不能插入幀間空間。
遠(yuǎn)程幀
一般情況,數(shù)據(jù)是由發(fā)送單元主動向總線上發(fā)送的,但也存在接收單元主動向發(fā)送單元請求數(shù)據(jù)的情況。遠(yuǎn)程幀的作用就在于此,它是接收單元向發(fā)送單元請求發(fā)送數(shù)據(jù)的幀。遠(yuǎn)程幀與數(shù)據(jù)幀的幀結(jié)構(gòu)類似,如下圖所示。
遠(yuǎn)程幀與數(shù)據(jù)幀的幀結(jié)構(gòu)區(qū)別如下表所示:
幀起始 | 仲裁段 | 控制段 | 數(shù)據(jù)段 | CRC段 | ACK段 | 幀結(jié)束 | |
意義 | 表示幀開始 | 表示數(shù)據(jù)優(yōu)先級 | 表示數(shù)據(jù)段的字節(jié)數(shù) | ||||
數(shù)據(jù)幀 | 1位顯性位 | 11位或29位(RTR位為顯性) | 6位 | 0~8個字節(jié) | 15位CRC值和1位CRC界定符 | 1位ACK槽和1位ACK界定符 | 7位隱性位 |
遙控幀 | 1位顯性位 | 可請求具有相同ID的數(shù)據(jù)幀(RTR位為隱性) | 6位 | 無 |
當(dāng)總線上具有相同標(biāo)識符的數(shù)據(jù)幀和遠(yuǎn)程幀同時發(fā)送時,由于數(shù)據(jù)幀的 RTR 位是顯性的,數(shù)據(jù)幀將在仲裁中贏得總線控制權(quán)。
錯誤幀
用于在接收和發(fā)送消息時檢測出錯誤時,通知錯誤的幀。錯誤幀由錯誤標(biāo)志和錯誤界定符構(gòu)成。錯誤幀的幀結(jié)構(gòu)如下圖所示。
錯誤標(biāo)志:6-12 個顯性/隱性重疊位
主動錯誤標(biāo)志(6個顯性位):處于主動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標(biāo)志
被動錯誤標(biāo)志(6個隱性位):處于被動錯誤狀態(tài)的單元檢測出錯誤時輸出的錯誤標(biāo)志
錯誤界定符:8 個隱性位
過載幀
過載幀是用于接收單元通知發(fā)送單元它尚未完成接收準(zhǔn)備的幀。在兩種情況下,節(jié)點(diǎn)會發(fā)送過載幀:
接收單元條件的制約,要求發(fā)送節(jié)點(diǎn)延緩下一個數(shù)據(jù)幀或遠(yuǎn)程幀的傳輸;
幀間空間(Intermission)的3 bit內(nèi)檢測到顯性位
每個節(jié)點(diǎn)最多連續(xù)發(fā)送兩條過載幀。過載幀由過載標(biāo)志和過載界定符(8 個隱性位)構(gòu)成。過載幀的結(jié)構(gòu)如下圖所示。
幀間隔
幀間隔是用來隔離數(shù)據(jù)幀(或者遙控幀)的,也就是說,數(shù)據(jù)幀(或者遙控幀)通過插入幀間隔可以將本幀與先行幀(數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀)分隔開來。但是過載幀和錯誤幀的前面不能插入幀間隔。
幀間隔有兩種不同的形式:
主動錯誤狀態(tài)的幀間隔
被動錯誤狀態(tài)的幀間隔
間隔段:連續(xù)三個隱性位;間隔段期間,所有節(jié)點(diǎn)不允許發(fā)送數(shù)據(jù)幀或遙控幀,只要在這期間監(jiān)聽到顯性位,接收節(jié)點(diǎn)就會發(fā)送過載幀。
空閑段:連續(xù)隱性位,個數(shù)不一定,0個或者多個都可以。總線空閑的時間是任意長的,只要總線空閑,節(jié)點(diǎn)就可以競爭總線。
暫停段:又叫做延遲傳送段,只有處于被動錯誤狀態(tài)的節(jié)點(diǎn)在發(fā)送幀間隔的時候,才會在幀間隔中插入8個連續(xù)隱性位的暫停段。
以上就是針對CAN總線的幀結(jié)構(gòu)的介紹。
-
CAN總線
+關(guān)注
關(guān)注
145文章
1936瀏覽量
130628 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6888瀏覽量
88825 -
通信
+關(guān)注
關(guān)注
18文章
5969瀏覽量
135850
原文標(biāo)題:硬件接口協(xié)議之“CAN總線報文”
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論