CAN總線的應用在現(xiàn)在看來越來越廣泛,我廠設備從最初的ARM9與ARM7平臺、期間升級過度到CortexA8與Cortex M3平臺,再到現(xiàn)在的Cortex M4平臺,圍繞CAN進行了一系列產品的開發(fā),CAN總線的穩(wěn)定性是毋庸置疑的。
CAN總線網絡主要掛在CAN_H和CAN_L,各個節(jié)點通過這兩條線實現(xiàn)信號的串行差分傳輸,為了避免信號的反射和干擾,還需要在CAN_H和CAN_L之間接上120歐姆的終端電阻,但是為什么是120歐姆呢?那是因為電纜的特性阻抗為120歐。
CAN收發(fā)器的作用是負責邏輯電平和信號電平之間的轉換。
即從CAN控制芯片輸出邏輯電平到CAN收發(fā)器,然后經過CAN收發(fā)器內部轉換將邏輯電平轉換為差分信號輸出到CAN總線上,CAN總線上的節(jié)點都可以決定自己是否需要總線上的數(shù)據(jù)。具體的管教定義如下:
CAN總線采用不歸零碼位填充技術,也就是說CAN總線上的信號有兩種不同的信號狀態(tài),分別是顯性的(Dominant)邏輯0和隱形的(recessive)邏輯1,信號每一次傳輸完后不需要返回到邏輯0(顯性)的電平。
位填充規(guī)則:發(fā)送器只要檢測到位流里有5個連續(xù)相同值的位,便自動在位流里插入補充位。
狀態(tài) | 邏輯信號 | 電壓范圍 |
顯性Dominant | 0 | |
隱性recessive | 1 |
CAN總線采用的'線與'的規(guī)則進行總線沖裁。即1&0=0;所以0為顯性。
類型 | 標準 | 最高速率 | 描述 |
高速CAN | CAN/ISO 11839-2 | 1Mbit/秒 | 最通用的CAN總線類型 |
低速CAN | ISO/ISO 11839-3 | 125Kbit/秒 | 容錯,在一條總線短路的時候仍然能工作 |
單線CAN | SAE J2411 | 50Kbit/秒 | 高速模式可達到100Kbit/s主要用在汽車上,例如通用公司 |
CAN總線上任意兩個節(jié)點的最大傳輸距離與其位速率有關,如下表:
位速率/kbps | 1000 | 500 | 250 | 125 | 100 | 50 | 20 | 10 | 5 |
最大距離/m | 40 | 130 | 270 | 530 | 620 | 1300 | 3300 | 6700 | 10000 |
如果想要更遠的傳輸(大于10公里);可以考慮用多個CAN控制器連接或是加其他通訊協(xié)議(如485或是TCP/IP)的接口芯片組成的一個設備,這樣就可實現(xiàn)長距離的通訊需求。
只要總線空閑,總線上任何節(jié)點都可以發(fā)送報文,如果有兩個或兩個以上的節(jié)點開始傳送報文,那么就會存在總線訪問沖突的可能。但是CAN使用了標識符的逐位仲裁方法可以解決這個問題。
CAN標準定義了四種消息類型,每條消息用一種叫做比特位仲裁(Arbitration)機制來控制進入CAN總線,并且每條消息都標記了優(yōu)先權。另外CAN標準還定義了一系列的錯誤處理機制。
CAN總線中有標準幀和擴展幀兩種格式,兩種格式不同的地方在于仲裁域格式的不同,看下面兩個表格可以很清楚的看出兩者的不同,下面第一個表是標準幀(CAN2.0 A),第二個為擴展幀(CAN2.0 B):
域 | 描述 |
仲裁域 | 仲裁域決定了當總線上兩個或是多個節(jié)點爭奪總線時的優(yōu)先權。 |
數(shù)據(jù)域 | 包含了0到8字節(jié)的數(shù)據(jù)。 |
CRC域 | 包含了15位的校驗和,校驗和用來做錯誤檢測。 |
應答槽 | 任何一個已經正確接收到消息的控制器在每一條消息的末端發(fā)送一個應答位,發(fā)送器檢查消息是否存在應答位,如果沒有就重發(fā)消息。 |
上圖就是遠程幀的幀格式,它相對與數(shù)據(jù)幀沒有遠程幀,但是要注意發(fā)送遠程幀的時候RTR位要置1,表示發(fā)送的是遠程幀。下圖更加清晰了呈現(xiàn)了這種結構。
下面通過以下數(shù)據(jù)結構框圖概括各個部分的定義:
剛才說到一個節(jié)點上檢測到錯誤會導致總線上所有的節(jié)點都會檢測到錯誤并發(fā)送錯誤標志,這是為什么呢?
因為單一節(jié)點上的錯誤標志格式違背了從幀起始到CRC界定符的位填充規(guī)則,也破壞了ACK域或幀結尾的固定格式。下面簡要說下位填充規(guī)則。
位填充規(guī)則:發(fā)送器只要檢測到位流里有5個連續(xù)相同值的位,便自動在位流里插入補充位。
注意:位填充規(guī)則只是針對數(shù)據(jù)幀和遠程幀,錯誤幀和過載幀格式固定。
所以所有其他的節(jié)點會檢測到錯誤條件并且開始發(fā)送錯誤標志,因此錯誤幀就是各個站的不同錯誤標志疊加在一起的結果。
當某個節(jié)點發(fā)送錯誤幀(帶有錯誤標志),其他節(jié)點收到了錯誤幀,檢測到錯誤條件,就通過發(fā)送'被動錯誤標志'的錯誤幀來提示錯誤。
傳送了錯誤標志以后,每一個站就發(fā)送一個隱性位,并一直監(jiān)視總線直到檢測出一個隱性位為止,然后就開始發(fā)送其余7個隱性位。
過載幀是接收節(jié)點用來向發(fā)送節(jié)點告知自身接收能力的幀。
過載幀跟錯誤幀結構類似包括過載標志和過載定界符,有3中情況會引起過載:
上圖中很清晰的表示了過載標志有6個顯性位組成,而疊加部分和'主動錯誤'標志一樣,過載的標志破壞的是間歇域的固定格式。所以導致其他的節(jié)點都檢測到過載條件,并一同發(fā)出過載標志。
這里所說的針間空間包括'間歇'、'總線空閑'的位域。如果是發(fā)送前一報文的'被動錯誤'的站,則還包括叫做'掛起傳輸'的位域。
若不是'被動錯誤'的站,或作為前一報文的接收器的站,幀間空間格式為下圖:
若是'被動錯誤'的站,如果想要發(fā)送8個隱性電平,在發(fā)送其他幀,幀間空間格式為下圖,即包括了掛起傳輸,
特別的在間歇期間,所有的節(jié)點都不允許傳送數(shù)據(jù)幀和遠程幀,唯一看做的是標示一個過載條件。
只要總線空閑,任何節(jié)點就可以往總線發(fā)送數(shù)據(jù),并且是開始于間歇之后的第一個位。一旦總線上檢測到顯性位即邏輯'0',可以認為是幀的開始。
錯誤類型 | 出錯條件 | 出錯域 | 幀測單元 | |
比特錯誤 bit error | 發(fā)送的位值與所監(jiān)控的位值不相符合(填充比特和ACK比特除外) | 數(shù)據(jù)幀(SOF~EOF) | 發(fā)送單元 接收單元 | |
填充錯誤stuff error | 偵測到6個連續(xù)相同的電平 | 數(shù)據(jù)幀(SOF~CRC) 遠程幀(SOF~CRC) | 發(fā)送單元 接收單元 | |
CRC 錯誤 | 計算結果和接收到的CRC不同 | 數(shù)據(jù)幀(CRC) 遠程幀(CRC) | 接收單元 | |
格式錯誤 Form Error | 某個固定的格式位置出現(xiàn)無效的比特 | 數(shù)據(jù)幀: (CRC Delimiter, ACK Delimiter EOF) 遠程幀: (CRC Delimiter,ACK Delimiter) 錯誤幀: (Error Frame Delimiter) 過載幀: (Overload Delimiter) | 接收單元 | |
應答錯誤 Acknowledgment | 發(fā)送端在應答間隙所監(jiān)視的位不為顯性,即邏輯0,發(fā)送器就檢測到一個應答錯誤。 | 數(shù)據(jù)幀(ACK slot) 遠程幀(ACK slot) | 發(fā)送單元 |
錯誤條件 | Transmit Error Counter | Receive Error Counter | |
1 | RECEIVER端偵測到一個位Error錯誤,除了發(fā)送ACTIVE ERROR FLAG 和OVERLOAD FLAG | - | 1 |
2 | TRANSMITIER 發(fā)送ERROR FLAG | 8 | |
3 | TRANSMITTER發(fā)送ACTIVE ERROR FLAG OVERFLAG時偵測到BIT ERROR | 8 | |
4 | 當RECEIVER發(fā)送ACTIVE ERROR FLAG或OVERFLAG時偵測到BIT ERROR | 8 | |
5 | 一個幀被成功發(fā)送之后(取得ACK并且知道END OF FRAME完成都沒有錯誤) | -1 IF TEC=0,TEC will not be changed | - |
6 | 一個幀被成功接收(知道ACK域都沒有檢測到錯誤,并成功發(fā)送ACK比特) | - | 1. if 1 <= REC <= 127 -> REC-1 2. if REC = 0 -> REC = 0 3. if REC > 127 -> REC = a value Between 119 to 127 |
7 | 在總線上檢測到128此連續(xù)的11個1,'bus off'的節(jié)點允許變成不再是'bus off' | Cleared to TEC = 0 | Cleared to REC = 0 |
為防止某些節(jié)點自身出錯而一直發(fā)送錯誤幀,干擾其他節(jié)點通信,CAN協(xié)議規(guī)定了節(jié)點的3種狀態(tài)及行為,如下圖:
聯(lián)系客服