CAN是Controller Area Network的縮寫(xiě)(以下稱(chēng)為CAN),它的設(shè)計(jì)目標(biāo)是以最小的CPU負(fù)荷來(lái)高效處理大量的報(bào)文。 1986年德國(guó)電氣商BOSCH公司開(kāi)發(fā)出面向汽車(chē)的CAN通信協(xié)議。 此后,CAN通過(guò)ISO11898及ISO11519進(jìn)行了標(biāo)準(zhǔn)化,現(xiàn)在在歐洲已是汽車(chē)網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。 現(xiàn)在,CAN的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面。
CAN協(xié)議特點(diǎn):
多主控制:
在總線(xiàn)空閑時(shí),所有節(jié)點(diǎn)均可發(fā)送信息。 如果出現(xiàn)兩個(gè)及以上節(jié)點(diǎn)同時(shí)開(kāi)始發(fā)送信息時(shí),總線(xiàn)會(huì)根據(jù)標(biāo)識(shí)符(Identifier以下稱(chēng)為ID)進(jìn)行仲裁,ID越小則優(yōu)先級(jí)高,則仲裁優(yōu)勝,仲裁優(yōu)勝的節(jié)點(diǎn)繼續(xù)發(fā)送,仲裁失利的節(jié)點(diǎn)立即轉(zhuǎn)入接收狀態(tài)。 需注意,ID并不是表示節(jié)點(diǎn)地址,而是指示所發(fā)送的報(bào)文的優(yōu)先級(jí)。
系統(tǒng)的靈活性:
如上所述,與CAN總線(xiàn)的各節(jié)點(diǎn)沒(méi)有類(lèi)似于“地址”的信息。 因此在總線(xiàn)上增減節(jié)點(diǎn)時(shí),連接在總線(xiàn)上的其它節(jié)點(diǎn)的軟硬件設(shè)計(jì)均不受影響。
高可靠性:
CAN協(xié)議具有錯(cuò)誤檢測(cè)、錯(cuò)誤通知、故障封閉和錯(cuò)誤恢復(fù)功能。 CAN總線(xiàn)上的任意節(jié)點(diǎn)均可檢測(cè)錯(cuò)誤(錯(cuò)誤檢測(cè)); 檢測(cè)到錯(cuò)誤后向總線(xiàn)發(fā)送錯(cuò)誤幀以通知其他節(jié)點(diǎn)(錯(cuò)誤通知); 同時(shí)每個(gè)節(jié)點(diǎn)內(nèi)部有一個(gè)錯(cuò)誤計(jì)數(shù)功能,每次檢測(cè)到錯(cuò)誤之后,錯(cuò)誤計(jì)數(shù)值累加,當(dāng)某節(jié)點(diǎn)持續(xù)錯(cuò)誤導(dǎo)致計(jì)數(shù)連續(xù)累加,直到大于256后,此故障節(jié)點(diǎn)從總線(xiàn)上斷開(kāi),避免影響其他節(jié)點(diǎn)(故障封閉)。 且發(fā)送節(jié)點(diǎn)如果在發(fā)送信息的過(guò)程中檢測(cè)到錯(cuò)誤,待錯(cuò)誤結(jié)束后會(huì)自動(dòng)重發(fā)此信息直到成功發(fā)送(錯(cuò)誤恢復(fù))。
通信速度較快,通信距離遠(yuǎn):
最高1Mbps(距離小于40m),最遠(yuǎn)可達(dá)10km(速率低于5Kbps)。
可連接節(jié)點(diǎn)多:
CAN總線(xiàn)是可同時(shí)連接多個(gè)節(jié)點(diǎn)。 節(jié)點(diǎn)數(shù)量理論上是沒(méi)有限制的。 但實(shí)際上節(jié)點(diǎn)數(shù)量受總線(xiàn)時(shí)間延遲及電氣負(fù)載的限制。 降低通信速度,可連接的節(jié)點(diǎn)數(shù)增加; 提高通信速度,則可連接的節(jié)點(diǎn)數(shù)減少。
正是因?yàn)镃AN協(xié)議的這些特點(diǎn),使得CAN特別適合工業(yè)過(guò)程監(jiān)控設(shè)備的互連,因此,越來(lái)越受到工業(yè)界的重視,并已公認(rèn)為最有前途的現(xiàn)場(chǎng)總線(xiàn)之一。 CAN協(xié)議經(jīng)過(guò)ISO標(biāo)準(zhǔn)化后有兩個(gè)標(biāo)準(zhǔn):ISO11898標(biāo)準(zhǔn)和ISO11519-2標(biāo)準(zhǔn)。 其中ISO11898是針對(duì)通信速率為125Kbps~1Mbps的高速通信標(biāo)準(zhǔn),而ISO11519-2是針對(duì)通信速率為125Kbps以下的低速通信標(biāo)準(zhǔn)。 本文例程使用的是1Mbps的通信速率,使用的是ISO11898標(biāo)準(zhǔn)。
CAN協(xié)議介紹
本章主要介紹CAN的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、總線(xiàn)物理層特性、幀類(lèi)型、幀結(jié)構(gòu)、位填充機(jī)制、位格式、同步機(jī)制、仲裁機(jī)制、錯(cuò)誤處理機(jī)制等。 另外還有CAN協(xié)議的更多細(xì)節(jié)請(qǐng)參考BOSCH CAN協(xié)議,本文不再詳述。
CAN網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
如下圖1:CAN總線(xiàn)由兩條差分線(xiàn)CANH和CANL組成,各個(gè)節(jié)點(diǎn)通過(guò)較短的支線(xiàn)接入CAN總線(xiàn)。 各節(jié)點(diǎn)從通信協(xié)議而言是沒(méi)有主從和地址區(qū)分的,每個(gè)節(jié)點(diǎn)均可以平等的收發(fā)數(shù)據(jù)。 另外,在CAN總線(xiàn)的兩端各有一個(gè)120Ω的終端電阻,來(lái)做阻抗匹配,以減少回波反射。
圖1 CAN網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
CAN總線(xiàn)物理層特性
如下圖2:顯性電平對(duì)應(yīng)邏輯“0”,CANH和CANL壓差2.5V左右。 而隱性電平對(duì)應(yīng)邏輯“1”,CANH和CANL壓差為0V。 在總線(xiàn)上,顯性電平具有優(yōu)先權(quán),只要有一個(gè)節(jié)點(diǎn)輸出顯性電平,總線(xiàn)上即為顯性電平。 而隱形電平則具有包容的意味,只有所有的節(jié)點(diǎn)都輸出隱性電平,總線(xiàn)上才為隱性電平。
圖2 CAN總線(xiàn)電平特性
幀類(lèi)型
如下表1,CAN包含了以下5種幀類(lèi)型。 其中數(shù)據(jù)幀和遠(yuǎn)程幀由用戶(hù)控制收發(fā); 錯(cuò)誤幀、過(guò)載幀和間隔幀是CAN總線(xiàn)上各節(jié)點(diǎn)硬件根據(jù)對(duì)應(yīng)狀態(tài)發(fā)送,用戶(hù)不能也無(wú)需控制。
表1 CAN幀類(lèi)型
如下圖3,包含了各類(lèi)型幀結(jié)構(gòu)示意。
圖3 CAN各幀類(lèi)型
幀結(jié)構(gòu)
本文僅對(duì)標(biāo)準(zhǔn)數(shù)據(jù)幀進(jìn)行詳細(xì)介紹,其他幀類(lèi)型可參考圖3與標(biāo)準(zhǔn)數(shù)據(jù)幀進(jìn)行對(duì)比理解。
一幀標(biāo)準(zhǔn)數(shù)據(jù)幀包含如下部分:
幀起始:為1bit顯性位。 由于CAN總線(xiàn)空閑時(shí)是隱性電平,幀起始的顯性位用于提示總線(xiàn)上的節(jié)點(diǎn)“一幀信息傳輸開(kāi)始了”。
仲裁段:表示該幀優(yōu)先級(jí)的段,包含標(biāo)識(shí)符和幀類(lèi)型(數(shù)據(jù)/遠(yuǎn)程幀)。
控制段:表示數(shù)據(jù)的字節(jié)數(shù)、標(biāo)識(shí)符類(lèi)型(標(biāo)準(zhǔn)/擴(kuò)展標(biāo)識(shí)符)及保留位的段。
數(shù)據(jù)段:數(shù)據(jù),一幀可發(fā)送0~8個(gè)字節(jié)的數(shù)據(jù)(數(shù)據(jù)長(zhǎng)度根據(jù)控制段的DLC決定)。
CRC段:發(fā)送節(jié)點(diǎn)將CRC計(jì)算區(qū)域(不包含填充位)進(jìn)行CRC計(jì)算后放入CRC段發(fā)送。 接收節(jié)點(diǎn)也對(duì)CRC計(jì)算區(qū)域進(jìn)行CRC計(jì)算,并與收到的CRC域進(jìn)行對(duì)比,若CRC對(duì)比結(jié)果有誤則向總線(xiàn)發(fā)送錯(cuò)誤幀,若對(duì)比結(jié)果正確則隨后發(fā)送應(yīng)答。
ACK段:含應(yīng)答位(ACK SLOT)和應(yīng)答間隔符(ACK DELIMITER)。 發(fā)送節(jié)點(diǎn)在ACK段均發(fā)送隱性電平; 接收節(jié)點(diǎn)如果在接收過(guò)程中沒(méi)有檢測(cè)到錯(cuò)誤,則在應(yīng)答位輸出1bit顯性電平,以通知發(fā)送節(jié)點(diǎn)“這幀數(shù)據(jù)被正確的接收了”。
幀結(jié)束:表示數(shù)據(jù)幀結(jié)束的段,為7bit隱性電平。
圖4 CAN標(biāo)準(zhǔn)數(shù)據(jù)幀
位填充
由于CAN總線(xiàn)只有CANH/CANL兩條差分線(xiàn),沒(méi)有CLK線(xiàn)來(lái)做同步,所以CAN是直接通過(guò)數(shù)據(jù)流中間的跳變沿來(lái)做同步的(參考下文同步機(jī)制)。 而為了避免數(shù)據(jù)流中出現(xiàn)大段沒(méi)有跳變沿的情況,CAN加入了“位填充”機(jī)制。
即發(fā)送器只要檢測(cè)到位流里有5個(gè)連續(xù)相同值的位,便自動(dòng)在位流里插入一相反電平的填充位。 例如,原始數(shù)據(jù)流為“0000000111110001…”,經(jīng)過(guò)位填充后實(shí)際輸出到CAN總線(xiàn)的數(shù)據(jù)流為“000001001111100001…”,加下劃線(xiàn)的位即為填充位。
位填充的范圍為幀起始(SOF)~CRC域(不含CRC間隔符),參考上圖4。
位格式
AT32的CAN一個(gè)bit可分為3段:
同步段(SYNC_SEG)
位段1(BIT SEGMENT 1),包括CAN標(biāo)準(zhǔn)里的PROP_SEG和PHASE_SEG1,記為BSEG1。
位段2(BIT SEGMENT 2),即CAN標(biāo)準(zhǔn)里的PHASE_SEG2,記為BSEG2。
這些段又由Time Quantum(以下稱(chēng)為T(mén)q)的最小時(shí)間單位構(gòu)成。
1位分為3個(gè)段,每個(gè)段又由若干個(gè)Tq構(gòu)成,這稱(chēng)為位時(shí)序。
1位由多少個(gè)Tq構(gòu)成、每個(gè)段又由多少個(gè)Tq構(gòu)成等,可以任意設(shè)定位時(shí)序。 用戶(hù)通過(guò)設(shè)定位時(shí)序和Tq長(zhǎng)度來(lái)設(shè)定CAN的波特率和采樣點(diǎn)。 關(guān)于波特率和采樣點(diǎn)設(shè)置,后文詳細(xì)介紹。
各段作用及AT32的CAN可配置的Tq數(shù)見(jiàn)下表2:
表2 位的各段的作用
如下圖5,同步段、位段1和位段2組成一個(gè)bit。 BSEG1和BSEG2段交界處為采樣點(diǎn),即接收節(jié)點(diǎn)采樣的時(shí)間點(diǎn)。
圖5 位時(shí)序
同步機(jī)制
硬同步(HARD SYHCHRONIZATION):
硬同步后,內(nèi)部的位時(shí)間從同步段重新開(kāi)始。 因此,硬同步強(qiáng)迫由硬同步引起的沿處于重新開(kāi)始的位時(shí)間同步段之內(nèi)。 即下圖6的理想跳變沿情況。
重新同步跳轉(zhuǎn)寬度(RESYHCHRONIZATION JUMP WIDTH):
重新同步的結(jié)果,使位段1增長(zhǎng),或使位段2縮短。 位段增長(zhǎng)或縮短的數(shù)量有一個(gè)上限,此上限由重新同步跳轉(zhuǎn)寬度給定。 重新同步跳轉(zhuǎn)寬度應(yīng)設(shè)置于1~4Tq之間。
如下圖6:
當(dāng)在BSEG1段檢測(cè)到下降沿,則BSEG1段增長(zhǎng)Tdelay,當(dāng)前bit整體增長(zhǎng)Tdelay,其中Tdelay<=重新同步跳轉(zhuǎn)寬度。
當(dāng)在BSEG2段檢測(cè)到下降沿,則BSEG2段縮短Tadvance,當(dāng)前bit整體縮短Tadvance,其中Tadvance<=重新同步跳轉(zhuǎn)寬度。
圖6 重同步跳躍
仲裁機(jī)制
只要總線(xiàn)空閑,任何單元都可以開(kāi)始發(fā)送報(bào)文。 如果2個(gè)或2個(gè)以上的單元同時(shí)開(kāi)始傳送報(bào)文,那么就會(huì)有總線(xiàn)訪(fǎng)問(wèn)沖突。 通過(guò)對(duì)ID進(jìn)行逐位仲裁可以解決這個(gè)沖突。 仲裁的機(jī)制確保了報(bào)文和時(shí)間均不損失。 當(dāng)具有相同ID的數(shù)據(jù)幀和遠(yuǎn)程幀同時(shí)初始化時(shí),數(shù)據(jù)幀優(yōu)先于遠(yuǎn)程幀。 仲裁期間,每一個(gè)發(fā)送節(jié)點(diǎn)都對(duì)發(fā)送位的電平與被監(jiān)控的總線(xiàn)電平進(jìn)行比較。 如果電平相同,則這個(gè)節(jié)點(diǎn)可以繼續(xù)發(fā)送。 如果發(fā)送的是一“隱性”電平而監(jiān)測(cè)到是一“顯性”電平(見(jiàn)總線(xiàn)電平),那么該節(jié)點(diǎn)就失去了仲裁,必須立即退出發(fā)送狀態(tài)并轉(zhuǎn)入接收狀態(tài)。
例如下圖7,節(jié)點(diǎn)1和節(jié)點(diǎn)2同時(shí)發(fā)送一幀數(shù)據(jù),ID段前幾bit相同。 直到紅色處,節(jié)點(diǎn)1發(fā)送隱性電平“1”,節(jié)點(diǎn)2發(fā)送顯性電平“0”。 此時(shí)節(jié)點(diǎn)2仲裁優(yōu)勝,繼續(xù)發(fā)送,總線(xiàn)電平和節(jié)點(diǎn)2發(fā)送值一致; 而節(jié)點(diǎn)1仲裁失利,在下一bit轉(zhuǎn)入接收,后續(xù)節(jié)點(diǎn)1的發(fā)送引腳保持隱性電平。
圖7 仲裁機(jī)制
錯(cuò)誤處理機(jī)制
錯(cuò)誤類(lèi)型
CAN協(xié)議定義了以下5種不同的錯(cuò)誤類(lèi)型:
位錯(cuò)誤(Bit Error)
單元在發(fā)送位的同時(shí)也對(duì)總線(xiàn)進(jìn)行監(jiān)視。 如果所發(fā)送的位值與所監(jiān)視的位值不相符合,則在此位時(shí)間里檢測(cè)到一個(gè)位錯(cuò)誤。 AT32將位錯(cuò)誤細(xì)分為顯性位錯(cuò)誤(發(fā)送顯性位但檢測(cè)到隱性位)和隱性位錯(cuò)誤(發(fā)送隱性位但檢測(cè)到顯性位)。 CAN節(jié)點(diǎn)在發(fā)送狀態(tài)會(huì)出現(xiàn)此類(lèi)錯(cuò)誤。
但是在仲裁場(chǎng)(ARBITRATION FIELD)的填充位流期間或應(yīng)答間隙(ACK SLOT)發(fā)送一“隱性”位的情況是例外的——此時(shí),當(dāng)監(jiān)視到一“顯性”位時(shí),不會(huì)發(fā)出位錯(cuò)誤。 當(dāng)發(fā)送器發(fā)送一個(gè)被動(dòng)錯(cuò)誤標(biāo)志但檢測(cè)到“顯性”位時(shí),也不視為位錯(cuò)誤。
位填充錯(cuò)誤(Stuff Error)
如果在使用一幀報(bào)文的位填充區(qū)域(參考圖4的“位填充區(qū)域”)檢測(cè)到6個(gè)連續(xù)相同的位電平時(shí),將檢測(cè)到一個(gè)位填充錯(cuò)誤。 CAN節(jié)點(diǎn)在接收狀態(tài)會(huì)出現(xiàn)此類(lèi)錯(cuò)誤。
CRC錯(cuò)誤(CRC Error)
CRC序列包括發(fā)送器的CRC計(jì)算結(jié)果。 接收器計(jì)算CRC的方法與發(fā)送器相同。 如果計(jì)算結(jié)果與接收到CRC序列的結(jié)果不相符,則檢測(cè)到一個(gè)CRC錯(cuò)誤。 CAN節(jié)點(diǎn)在接收狀態(tài)會(huì)出現(xiàn)此類(lèi)錯(cuò)誤。
格式錯(cuò)誤(Form Error)
當(dāng)一個(gè)固定形式的位場(chǎng)含有1個(gè)或多個(gè)非法位,則檢測(cè)到一個(gè)格式錯(cuò)誤。 例如在CRC間隔符/ACK間隔符的位場(chǎng)檢測(cè)到顯性位,則會(huì)檢測(cè)到格式錯(cuò)誤。 例外:接收器的幀末尾最后一位期間的顯性位不被當(dāng)作幀錯(cuò)誤。 CAN節(jié)點(diǎn)在接收狀態(tài)會(huì)出現(xiàn)此類(lèi)錯(cuò)誤。
應(yīng)答錯(cuò)誤(Acknowledgment Error)
只要在應(yīng)答位(ACK SLOT)期間所監(jiān)測(cè)的位不為“顯性”,則發(fā)送器會(huì)檢測(cè)到一個(gè)應(yīng)答錯(cuò)誤。 CAN節(jié)點(diǎn)在發(fā)送狀態(tài)會(huì)出現(xiàn)此類(lèi)錯(cuò)誤。
錯(cuò)誤狀態(tài)
CAN節(jié)點(diǎn)檢測(cè)到錯(cuò)誤之后,根據(jù)不同狀態(tài)和錯(cuò)誤類(lèi)型會(huì)對(duì)發(fā)送錯(cuò)誤計(jì)數(shù)器(TEC[7:0])/接收錯(cuò)誤計(jì)數(shù)器(REC[7:0])進(jìn)行加1或加8(具體增加規(guī)則請(qǐng)參考BOSCH CAN協(xié)議),每正確的發(fā)送/接收一幀數(shù)據(jù)后,發(fā)送/接收錯(cuò)誤計(jì)數(shù)器減1。 因此發(fā)送/接收錯(cuò)誤計(jì)數(shù)器值表明了CAN節(jié)點(diǎn)和網(wǎng)絡(luò)的穩(wěn)定程度。 根據(jù)發(fā)送/接收錯(cuò)誤計(jì)數(shù)器值,一個(gè)節(jié)點(diǎn)的狀態(tài)會(huì)處于以下三種之一:
錯(cuò)誤主動(dòng)
“錯(cuò)誤主動(dòng)”的節(jié)點(diǎn)可以正常地參與總線(xiàn)通訊并在錯(cuò)誤被檢測(cè)到時(shí)發(fā)出主動(dòng)錯(cuò)誤標(biāo)志(6個(gè)顯性位)。 見(jiàn)下圖8,TEC<128且REC<128即為錯(cuò)誤主動(dòng)狀態(tài)。
錯(cuò)誤被動(dòng)
“錯(cuò)誤被動(dòng)”的節(jié)點(diǎn)可參與總線(xiàn)接收和發(fā)送數(shù)據(jù)/遠(yuǎn)程幀。 但檢測(cè)到錯(cuò)誤時(shí)只能發(fā)送錯(cuò)誤被動(dòng)標(biāo)志(6個(gè)隱形位)。 見(jiàn)下圖8,255≥TEC>128且255≥REC>128即為錯(cuò)誤被動(dòng)狀態(tài)。
離線(xiàn)
“離線(xiàn)”的節(jié)點(diǎn)相當(dāng)于直接從CAN總線(xiàn)斷開(kāi),不能收/發(fā)任何信息。 見(jiàn)下圖8,TEC>255即為離線(xiàn)狀態(tài)。
AT32離線(xiàn)管理:AT32 CAN從離線(xiàn)狀態(tài)恢復(fù)分兩種情況:
1)當(dāng)CAN主控制寄存器(CAN_MCTRL)AEBOEN位為‘0’時(shí),需要軟件請(qǐng)求進(jìn)入凍結(jié)模式,再請(qǐng)求退出凍結(jié)模式,然后在通信模式下等待CAN節(jié)點(diǎn)RX檢測(cè)到128次11個(gè)連續(xù)隱性位,隨后該節(jié)點(diǎn)會(huì)從離線(xiàn)狀態(tài)恢復(fù)。
2)當(dāng)AEBOEN位為‘1’時(shí),通信模式下CAN節(jié)點(diǎn)RX檢測(cè)到128次11個(gè)連續(xù)隱性位,就自動(dòng)從離線(xiàn)狀態(tài)恢復(fù)。
圖8 錯(cuò)誤狀態(tài)
AT32的CAN
AT32的CAN支持標(biāo)準(zhǔn)CAN協(xié)議2.0A和2.0B。 且在兼容標(biāo)準(zhǔn)CAN協(xié)議的基礎(chǔ)上增加了一些功能和可配置選項(xiàng)。 其中CAN 2.0A和2.0B的主要差別在于:CAN 2.0A僅支持11bit ID,即只支持標(biāo)準(zhǔn)幀; CAN 2.0B支持11bit/29bit ID,即支持標(biāo)準(zhǔn)幀和擴(kuò)展幀。
本章節(jié)主要介紹AT32 CAN的主要設(shè)計(jì)結(jié)構(gòu)和使用,介紹了AT32 CAN的正常通信流程,包括發(fā)送流程、接收流程、報(bào)文過(guò)濾、波特率及采樣點(diǎn)設(shè)置等。 其他AT32 CAN相關(guān)設(shè)計(jì),例如錯(cuò)誤管理、中斷管理等,請(qǐng)參考RM相關(guān)章節(jié)。
整體功能介紹
隨著CAN網(wǎng)絡(luò)節(jié)點(diǎn)和報(bào)文數(shù)量的增加,需要一個(gè)增強(qiáng)的過(guò)濾機(jī)制處理各種類(lèi)型的報(bào)文,減少接收?qǐng)?bào)文的處理時(shí)間,采用FIFO的方案,使得CPU可以長(zhǎng)時(shí)間處理應(yīng)用層任務(wù)而不會(huì)丟失報(bào)文。 同時(shí)發(fā)送報(bào)文由硬件控制發(fā)送優(yōu)先級(jí)順序。 基于以上考慮,CAN控制器提供28組位寬可配置的標(biāo)識(shí)符過(guò)濾器組,2個(gè)接收FIFO,每個(gè)FIFO都可以存放3個(gè)完整的報(bào)文。 共有3個(gè)發(fā)送郵箱,發(fā)送調(diào)度器決定發(fā)送優(yōu)先級(jí)順序。 整個(gè)收發(fā)過(guò)程完全由硬件管理,無(wú)需占用CPU資源。
圖9 AT32 CAN整體功能介紹
CAN發(fā)送流程
CAN發(fā)送流程見(jiàn)下圖10和以下的步驟:
用戶(hù)使用時(shí)只需操作1)~3)。 4)~7)由硬件自動(dòng)完成,無(wú)需用戶(hù)代碼參與,不占用CPU資源。
1)程序選擇1個(gè)空置的郵箱(發(fā)送郵箱空標(biāo)志TMxEF=1)
2)將需要發(fā)送的報(bào)文寫(xiě)入對(duì)應(yīng)的空郵箱。 報(bào)文內(nèi)容包含:ID、幀類(lèi)型、數(shù)據(jù)長(zhǎng)度和發(fā)送數(shù)據(jù)等
3)請(qǐng)求發(fā)送:將CAN_TMIx的TMSR位置1
4)郵箱掛號(hào)(等待成為最高優(yōu)先級(jí))
5)預(yù)定發(fā)送(等待總線(xiàn)空閑)
6)發(fā)送
7)郵箱空置
注:以上步驟1)~7)只簡(jiǎn)單介紹正常發(fā)送流程,下圖10中還包含取消發(fā)送、發(fā)送失敗、自動(dòng)/不自動(dòng)重傳等情況,可參考RM文件報(bào)文發(fā)送一節(jié),這里不再詳述。
下圖10中標(biāo)志位和操作位說(shuō)明如下:
TMxTCF:請(qǐng)求完成標(biāo)志位(發(fā)送/中止請(qǐng)求)
TMxTSF:發(fā)送成功標(biāo)志位
TMxEF:發(fā)送郵箱空標(biāo)志位
TMSR:請(qǐng)求發(fā)送
TMxCT:中止發(fā)送
PRSFEN:禁止自動(dòng)重傳(PRSFEN=1時(shí),禁止自動(dòng)重傳; PRSFEN=0時(shí),自動(dòng)重傳直到發(fā)送成功)
圖10 CAN發(fā)送流程
CAN接收流程
CAN常用接收流程如下,即下圖11的“空”和“掛號(hào)_1”兩個(gè)狀態(tài)間循環(huán):
1)FIFO空
2)收到有效報(bào)文
3)進(jìn)入“掛號(hào)_1”狀態(tài)(FIFO內(nèi)有1條有效報(bào)文的狀態(tài))
4)讀取有效報(bào)文:讀取接收郵箱寄存器(CAN_RFIx,CAN_RFCx,CAN_RFDTLx,
CAN_RFDTHx)。
5)釋放郵箱:CAN_RFx寄存器RFxR位置1。
注:用戶(hù)使用時(shí)只需操作4)~5)。 1)~3)由硬件自動(dòng)完成,無(wú)需用戶(hù)代碼參與,不占用CPU資源。
有效報(bào)文:
當(dāng)報(bào)文被正確接收(直到EOF域的最后一位都沒(méi)有錯(cuò)誤),且通過(guò)了標(biāo)識(shí)符過(guò)濾,那么該報(bào)文被認(rèn)為是有效報(bào)文。 過(guò)濾器相關(guān)介紹見(jiàn)下一節(jié)。
而如果接收過(guò)程中用戶(hù)不參與操作(即不去讀取有效報(bào)文和釋放郵箱),硬件流程如下:
1)收到有效報(bào)文
2)進(jìn)入“掛號(hào)_1”狀態(tài)(FIFO內(nèi)有1條有效報(bào)文的狀態(tài))
3)收到有效報(bào)文
4)進(jìn)入“掛號(hào)_2”狀態(tài)(FIFO內(nèi)有2條有效報(bào)文的狀態(tài))
5)收到有效報(bào)文
6)進(jìn)入“掛號(hào)_3”狀態(tài)(FIFO內(nèi)有3條有效報(bào)文的狀態(tài))
7)收到有效報(bào)文
8)進(jìn)入“溢出”狀態(tài)(FIFO內(nèi)有3條有效報(bào)文,丟失了一條報(bào)文,溢出標(biāo)志置起)
下圖11中標(biāo)志位和操作位說(shuō)明如下:
RFxMN:FIFO內(nèi)有效報(bào)文數(shù)量(取值0~3)
RFxOF:溢出標(biāo)志位
RFxR:釋放郵箱
圖11 CAN接收流程
過(guò)濾器
在CAN協(xié)議里,報(bào)文的ID不代表節(jié)點(diǎn)的地址,而是跟報(bào)文的內(nèi)容相關(guān)的。 因此,發(fā)送者以廣播的形式把報(bào)文發(fā)送給所有的接收者。 節(jié)點(diǎn)在接收?qǐng)?bào)文時(shí),根據(jù)ID的值決定軟件是否需要該報(bào)文; 如果需要,就存到接收FIFO里,用戶(hù)可通過(guò)軟件讀取接收郵箱寄存器獲取該報(bào)文; 如果不需要,報(bào)文就被丟棄且無(wú)需軟件的干預(yù)。
為滿(mǎn)足這一需求,AT32 CAN控制器為應(yīng)用程序提供了28個(gè)硬件過(guò)濾器組(AT32F435系列有28個(gè)過(guò)濾器組,027;但AT32F403A等系列只有14個(gè)過(guò)濾器組,013。 具體請(qǐng)參考相應(yīng)型號(hào)的RM),以便只接收那些軟件需要的報(bào)文。 用戶(hù)配置好需要的ID后,整個(gè)過(guò)濾過(guò)程無(wú)需軟件參與,不占用CPU資源。
過(guò)濾器的位寬
每個(gè)過(guò)濾器組由2個(gè)32bit的寄存器,CAN_FiFB1和CAN_FiFB2組成。 通過(guò)配置CAN_FBWCFG寄存器的FBWSELx位,可以設(shè)置2個(gè)16位寬或者1個(gè)32位寬的過(guò)濾器。
32位寬的過(guò)濾器寄存器CAN_FiFBx包括:一組SID[10:0]、EID[17:0]、IDT和RTR位。
16位寬的過(guò)濾器寄存器CAN_FiFBx包括:兩組SID[10:0]、IDT、RTR和EID[17:15]位。
過(guò)濾器模式
通過(guò)設(shè)置CAN_FMCFG寄存器的FMSELx位可以設(shè)置過(guò)濾器寄存器工作在標(biāo)識(shí)符掩碼模式或者標(biāo)識(shí)符列表模式,掩碼模式用來(lái)指定ID的哪些位需要與預(yù)設(shè)ID相同,哪些位無(wú)需比較,列表模式表示ID的每個(gè)位都必須與預(yù)設(shè)ID一致。
兩種模式與過(guò)濾器位寬配合使用,可以有以下四種過(guò)濾方式:
圖12 32位寬標(biāo)識(shí)符掩碼模式
圖13 32位寬標(biāo)識(shí)符列表模式
圖14 16位寬標(biāo)識(shí)符掩碼模式
圖15 16位寬標(biāo)識(shí)符列表模式
更多CAN過(guò)濾器說(shuō)明,例如CAN過(guò)濾器匹配序號(hào),優(yōu)先級(jí)規(guī)則等可參考RM文件報(bào)文過(guò)濾一節(jié),這里不再詳述。 過(guò)濾器配置流程見(jiàn)后文案例介紹--CAN接收過(guò)濾器使用。
CAN波特率及采樣點(diǎn)計(jì)算
如前文CAN位格式一節(jié)所述,CAN的一個(gè)bit被分為幾段。 其中第一段同步段(SYNC_SEG)固定為1Tq,1Tq的長(zhǎng)度由CAN位時(shí)序寄存器(CAN_BTMG)的分頻系數(shù)BRDIV[11:0]位定義; 位段1(BSEG1)通過(guò)配置CAN位時(shí)序寄存器的BTS1[3:0]位,可設(shè)定為116Tq; 位段2(BSEG2)通過(guò)配置CAN位時(shí)序寄存器的BTS2[2:0]位,可設(shè)定為18Tq。 用戶(hù)通過(guò)配置CAN時(shí)序寄存器,可設(shè)置CAN波特率和采樣點(diǎn),整個(gè)CAN總線(xiàn)上各節(jié)點(diǎn)的波特率和采樣點(diǎn)一致最佳,不過(guò)由于各節(jié)點(diǎn)主頻可能不一樣,所以比較難保證波特率和采樣點(diǎn)均一致。 用戶(hù)使用時(shí)應(yīng)首先保證波特率一致,采樣點(diǎn)盡量保持在較小的偏差范圍內(nèi),這樣CAN總線(xiàn)可以支持更多的節(jié)點(diǎn)和更長(zhǎng)的線(xiàn)路。
波特率計(jì)算公式
其中
例如,bsp例程projectat_start_f437examplescancommunication_mode:
APB時(shí)鐘:APB1_CLK=144MHZ
CAN分頻系數(shù):BRDIV=12
此時(shí)1Tq=1/(144MHZ/12)=(1/12)us
同步段:SYNC_SEG=1Tq(固定不變,無(wú)需用戶(hù)配置)
位段1:BSEG1=8Tq(BTS1[3:0]=7)
位段2:BSEG2=3Tq(BTS2[2:0]=2)
此時(shí)Nomal Bit Timimg=1Tq*(SYNC本身+BSEG1+BSEG12)=1us
此時(shí)波特率=1/(Nomal Bit Timimg)=1/1us=1*M*bps
采樣點(diǎn)計(jì)算公式
采樣點(diǎn)=(SYNC_SEG+BSEG1)/(SYNC_SEG+BSEG1+BSEG12)
舉例同上:
此時(shí)sample point=(1+8)/(1+8+3)=75%
關(guān)于采樣點(diǎn)設(shè)置,CAN協(xié)議并沒(méi)有明確規(guī)定,但根據(jù)各廠(chǎng)商CAN設(shè)備使用習(xí)慣,采樣點(diǎn)設(shè)置建議如下
表3:
表3 采樣點(diǎn)設(shè)置建議
波特率計(jì)算工具
為方便用戶(hù)波特率設(shè)定,本文介紹一個(gè)AT專(zhuān)用波特率計(jì)算工具:
使用步驟如下:
1)波特率設(shè)定:高速CAN波特率最大為1M,各廠(chǎng)商CAN設(shè)備常用波特率為125K、250K、333K、500K、1M等。 用戶(hù)可根據(jù)需要設(shè)定波特率。 參考下圖16“波特率(Kbit/S)”。
2)CAN時(shí)鐘源頻率設(shè)定:參考下圖16“PCLK1(MHZ)”。
3)采樣位置設(shè)置:設(shè)置完波特率后,計(jì)算工具會(huì)自動(dòng)填入一個(gè)推薦的采樣位置值。 若實(shí)際項(xiàng)目中無(wú)具體限定,可保持默認(rèn)設(shè)定; 若項(xiàng)目中有具體限定,根據(jù)需求更改即可。 參考下圖16“采樣位置(%)”。
4)波特率偏差設(shè)定:建議在不勾選“允許波特率偏差”項(xiàng),僅在沒(méi)有符合要求的計(jì)算結(jié)果時(shí),再勾選此項(xiàng)。 由于同一CAN網(wǎng)絡(luò)的節(jié)點(diǎn)波特率有誤差會(huì)增大通信錯(cuò)誤幾率,建議“偏差”值設(shè)置盡量小。 參考下圖16“允許波特率偏差”和“偏差”。
5) **波特率配置結(jié)果選擇** :根據(jù)以上設(shè)定即可計(jì)算出多組結(jié)果。 在頁(yè)面左下角選擇一項(xiàng)計(jì)算結(jié)果,即會(huì)在頁(yè)面右下角顯示對(duì)應(yīng)軟件代碼配置,點(diǎn)擊“復(fù)制全部”即可獲得對(duì)應(yīng)代碼。
圖16 波特率配置工具
案例1 CAN正常通信-normal模式
注:所有project都是基于keil 5而建立,若用戶(hù)需要在其他編譯環(huán)境上使用,請(qǐng)參考**AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各種編譯環(huán)境(例如IAR6/7,keil 4/5)進(jìn)行簡(jiǎn)單修改即可。
功能簡(jiǎn)介
實(shí)現(xiàn)兩個(gè)CAN節(jié)點(diǎn)之間收發(fā)通信。
資源準(zhǔn)備
硬件環(huán)境:
兩套對(duì)應(yīng)產(chǎn)品型號(hào)的AT-START BOARD+CAN電平轉(zhuǎn)化器
程序設(shè)計(jì)以bsp demo為例:
CAN1_TX(PB9)連接電平轉(zhuǎn)換器的TXD;
CAN1_RX(PB8)連接電平轉(zhuǎn)換器的RXD;
兩個(gè)CAN節(jié)點(diǎn)的電平轉(zhuǎn)換器的CANH和CANL分別相連。
CAN電平轉(zhuǎn)換器硬件設(shè)計(jì)可參考下圖:
圖17 CAN電平轉(zhuǎn)換器硬件設(shè)計(jì)
軟件環(huán)境:
projectat_start_f435examplescancommunication_mode
軟件設(shè)計(jì)
配置流程
配置CAN1 TX和RX pin對(duì)應(yīng)的GPIO引腳
配置CAN基礎(chǔ)選項(xiàng)
配置CAN波特率
配置CAN過(guò)濾器
放置 CAN 中斷
代碼介紹
main函數(shù)代碼描述
CAN配置函數(shù)代碼描述
CAN發(fā)送函數(shù)代碼描述
CAN接收中斷函數(shù)代碼描述
GPIO配置函數(shù)代碼描述
實(shí)驗(yàn)效果
如若數(shù)據(jù)傳輸無(wú)誤,兩塊AT-START BOARD的LED2均會(huì)閃爍以指示收到ID=0x400的標(biāo)準(zhǔn)幀數(shù)據(jù); LED4會(huì)持續(xù)閃爍以指示程序正常運(yùn)行。
案例2 CAN接收過(guò)濾器使用
注:所有project都是基于keil 5而建立,若用戶(hù)需要在其他編譯環(huán)境上使用,請(qǐng)參考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各種編譯環(huán)境(例如IAR6/7,keil 4/5)進(jìn)行簡(jiǎn)單修改即可。
功能簡(jiǎn)介
實(shí)現(xiàn)報(bào)文過(guò)濾:接收需要的報(bào)文,丟棄不需要的報(bào)文。
資源準(zhǔn)備
硬件環(huán)境:
兩套對(duì)應(yīng)產(chǎn)品型號(hào)的AT-START BOARD+CAN電平轉(zhuǎn)化器
程序設(shè)計(jì)以bsp demo為例:
CAN1_TX(PB9)連接電平轉(zhuǎn)換器的TXD;
CAN1_RX(PB8)連接電平轉(zhuǎn)換器的RXD;
兩個(gè)CAN節(jié)點(diǎn)的電平轉(zhuǎn)換器的CANH和CANL分別相連。
CAN電平轉(zhuǎn)換器硬件設(shè)計(jì)可參考下圖:
圖18 CAN電平轉(zhuǎn)換器硬件設(shè)計(jì)
軟件環(huán)境:
projectat_start_f435examplescanfilter
軟件設(shè)計(jì)
配置流程
配置CAN1 TX和RX pin對(duì)應(yīng)的GPIO引腳
配置CAN基礎(chǔ)選項(xiàng)
配置CAN波特率
配置CAN過(guò)濾器
放置 CAN 中斷
代碼介紹
設(shè)定可通過(guò)過(guò)濾的ID
main函數(shù)代碼描述
CAN配置函數(shù)代碼描述
CAN發(fā)送函數(shù)代碼描述
CAN接收中斷函數(shù)代碼描述
GPIO配置函數(shù)代碼描述
實(shí)驗(yàn)效果
如若數(shù)據(jù)傳輸無(wú)誤,AT-START BOARD的LED2/3/4會(huì)翻轉(zhuǎn)一次,以指示收到ID=FILTER_EXT_ID1,F(xiàn)ILTER_EXT_ID2,F(xiàn)ILTER_STD_ID1,F(xiàn)ILTER_STD_ID2的4幀數(shù)據(jù)。
案例3 CAN調(diào)試-loopback模式
注:所有project都是基于keil 5而建立,若用戶(hù)需要在其他編譯環(huán)境上使用,請(qǐng)參考AT32xxx_Firmware_Library_V2.x.xprojectat_start_xxx emplates中各種編譯環(huán)境(例如IAR6/7,keil 4/5)進(jìn)行簡(jiǎn)單修改即可。
功能簡(jiǎn)介
實(shí)現(xiàn)單板的環(huán)回模式通信。
環(huán)回模式(loopback mode):
環(huán)回模式可用于自測(cè)試。 在環(huán)回模式下,CAN在內(nèi)部把TX輸出回饋到RX輸入上,而完全忽略CAN_RX引腳的實(shí)際狀態(tài)。 因此此模式下CAN對(duì)應(yīng)的GPIO引腳可以不配置,而如果對(duì)應(yīng)的GPIO引腳配置了,發(fā)送的報(bào)文可以在CAN_TX引腳上檢測(cè)到。 見(jiàn)下圖19。 另外,為了避免外部的影響,在環(huán)回模式下CAN內(nèi)核忽略確認(rèn)錯(cuò)誤(在數(shù)據(jù)/遠(yuǎn)程幀的確認(rèn)位時(shí)刻,不檢測(cè)是否有顯性位)。
平轉(zhuǎn)換器硬件設(shè)計(jì)可參考下圖:
圖19 CAN loopback模式
資源準(zhǔn)備
硬件環(huán)境:
一塊對(duì)應(yīng)產(chǎn)品型號(hào)的AT-START BOARD
軟件環(huán)境:
projectat_start_f435examplescanloopback_mode
軟件設(shè)計(jì)
配置流程
配置CAN1 TX和RX pin對(duì)應(yīng)GPIO(loopback模式下,此項(xiàng)可忽略不配置)
配置CAN基礎(chǔ)選項(xiàng)
配置CAN波特率
配置CAN過(guò)濾器
放置 CAN 中斷
代碼介紹
main函數(shù)代碼描述
CAN配置函數(shù)代碼描述
CAN發(fā)送函數(shù)代碼描述
CAN接收中斷函數(shù)代碼描述
GPIO配置函數(shù)代碼描述
實(shí)驗(yàn)效果
AT-START BOARD的LED2會(huì)閃爍以指示收到自己發(fā)送的ID=0x400的標(biāo)準(zhǔn)幀數(shù)據(jù); LED4會(huì)持續(xù)閃爍以指示程序正常運(yùn)行。
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17886瀏覽量
361626 -
CAN總線(xiàn)
+關(guān)注
關(guān)注
145文章
1977瀏覽量
132402 -
CAN
+關(guān)注
關(guān)注
57文章
2899瀏覽量
466986 -
總線(xiàn)
+關(guān)注
關(guān)注
10文章
2955瀏覽量
89447 -
AT32
+關(guān)注
關(guān)注
1文章
121瀏覽量
2616
原文標(biāo)題:AT32講堂044 | AT32 MCU CAN入門(mén)指南
文章出處:【微信號(hào):AT32 MCU 雅特力科技,微信公眾號(hào):AT32 MCU 雅特力科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
AT32 WDT WWDT入門(mén)指南
AT32 MCU Cortex M4內(nèi)核入門(mén)指南
AT32 MCU定時(shí)器入門(mén)指南
AT32 MCU SDIO入門(mén)指南
AT32 MCU XMC入門(mén)指南
AT32講堂044 | AT32 MCU CAN入門(mén)指南

AT32 MCU SDIO入門(mén)指南

AT32 WDT WWDT入門(mén)指南

AT32 MCU CAN入門(mén)指南下載

評(píng)論