1.?CAN協(xié)議
1.1?CAN協(xié)議簡介
CAN是控制器局域網(wǎng)絡(luò) (Controller Area Network) 的簡稱,它是由研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國BOSCH公司開發(fā)的,并最終成為國際標(biāo)準(zhǔn)(ISO11519以及ISO11898), 是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。差異點(diǎn)如下:
1.2 CAN物理層
CAN通訊不是以時鐘信號來進(jìn)行同步的,它是一種異步通訊,只具有CAN_High和?CAN_Low兩條信號線,共同構(gòu)成一組差分信號線,以差分信號的形式進(jìn)行通訊。CAN 物理層的形式主要有兩種:
遵循ISO11898標(biāo)準(zhǔn)的高速、短距離閉環(huán)網(wǎng)絡(luò),總線最大長度為40m,通信速度最高為 1Mbps,總線的兩端各要求有一個120歐的電阻
是遵循ISO11519-2標(biāo)準(zhǔn)的低速、遠(yuǎn)距離開環(huán)網(wǎng)絡(luò),最大傳輸距離為1km,最高通訊速率為125kbps,兩根總線是獨(dú)立的、不形成閉環(huán),要求每根總線上各串聯(lián)有一個2.2千歐的電阻
以TJA1050芯片作為CAN收發(fā)器的電路原理圖如下圖示
差分信號又稱差模信號,差分信號傳輸時,需要兩根信號線,這兩個信號線的振幅相等,相位相反,通過兩根信號線的電壓差值來表示邏輯0和邏輯1,CAN中顯性電平(差值為正)對應(yīng)邏輯0,隱性電平(差值小于或等于0)對應(yīng)邏輯1,顯性電平比隱性電平更強(qiáng)
1.3 CAN協(xié)議層
CAN屬于異步通訊,沒有時鐘信號線,連接在同一個總線網(wǎng)絡(luò)中的各個節(jié)點(diǎn)會像串口異步通訊那樣,節(jié)點(diǎn)間使用約定好的波特率進(jìn)行通訊,CAN使用位同步的方式來抗干擾、吸收誤差,實(shí)現(xiàn)對總線電平信號進(jìn)行正確的采樣,確保通訊正常
位時序分解:為了實(shí)現(xiàn)位同步,CAN協(xié)議把每一個數(shù)據(jù)位的時序分解成SS段、PTS段、PBS1段、PBS2段,這四段的長度加起來即為一個CAN數(shù)據(jù)位的長度。分解后最小的時間單位是Tq,一個完整的位由8~25個Tq組成
波特率:總線上的各個通訊節(jié)點(diǎn)只要約定好1個Tq的時間長度以及每一個數(shù)據(jù)位占據(jù)多少個Tq,就可以確定CAN通訊的波特率
例如,假設(shè)上圖中的 1Tq=1us,而每個數(shù)據(jù)位由 19 個 Tq 組成,則傳輸一位數(shù)據(jù)需要時間 T1bit=19us,從而每秒可以傳輸?shù)臄?shù)據(jù)位個數(shù)為:1x10次方/19 = 52631.6 (bps)。這個每秒可傳輸?shù)臄?shù)據(jù)位的個數(shù)即為通訊中的波特率。
同步過程:波特率只是約定了每個數(shù)據(jù)位的長度,數(shù)據(jù)同步還涉及到相位的細(xì)節(jié),此時就要用到數(shù)據(jù)位內(nèi)的SS、PTS、PBS1及PBS2段了。根據(jù)對段的應(yīng)用方式差異, CAN的數(shù)據(jù)同步分為硬同步和重新同步。其中硬同步只是當(dāng)存在幀起始信號時起作用,無法確保后續(xù)一連串的位時序都是同步的,而重新同步方式可解決該問題
硬同步:CAN節(jié)點(diǎn)通過總線發(fā)送數(shù)據(jù)時,會發(fā)送一個幀起始信號。而掛載到CAN總線上的節(jié)點(diǎn)在不發(fā)送數(shù)據(jù)時,會時刻檢測總線上的信號。如下圖,當(dāng)總線出現(xiàn)幀起始信號時,節(jié)點(diǎn)檢測到總線的幀起始信號不在節(jié)點(diǎn)內(nèi)部時序的 SS 段范圍,所以判斷它自己的內(nèi)部時序與總線不同步,因而這個狀態(tài)的采樣點(diǎn)采集得的數(shù)據(jù)是不正確的。所以節(jié)點(diǎn)以硬同步的方式調(diào)整,把自己的位時序中的 SS 段平移至總線出現(xiàn)下降沿的部分,獲得同步,同步后采樣點(diǎn)就可以采集得正確數(shù)據(jù)了
重新同步:前面的硬同步只是當(dāng)存在幀起始信號時才起作用,如果在一幀很長的數(shù)據(jù)內(nèi),節(jié)點(diǎn)信號與總線信號相位有偏移時,這種同步方式就無能為力了。因而引入重新同步方式,它利用普通數(shù)據(jù)位的高至低電平的跳變沿來同步。與硬同步方式相似的是它們都使用 SS 段來進(jìn)行檢測,同步的目的都是使節(jié)點(diǎn)內(nèi)的 SS 段把跳變沿包含起來。重新同步分為超前和滯后兩種情況,以總線跳變沿與 SS 段的相對位置進(jìn)行區(qū)分。
-- 相位超前:節(jié)點(diǎn)從總線的邊沿跳變中,檢測到它內(nèi)部的時序比總線的時序相對超前 2Tq,這時控制器在下一個位時序中的 PBS1 段增加 2Tq 的時間長度,使得節(jié)點(diǎn)與總線時序重新同步
-- 相位滯后:節(jié)點(diǎn)從總線的邊沿跳變中,檢測到它的時序比總線的時序相對滯后 2Tq,這時控制器在前一個位時序中的 PBS2 段減少 2Tq 的時間長度,獲得同步
報文種類及結(jié)構(gòu):對數(shù)據(jù)、操作命令 (如讀/寫) 以及同步信號進(jìn)行打包,打包后的這些內(nèi)容稱為報文。CAN一共規(guī)定了5種類型的幀
數(shù)據(jù)幀的結(jié)構(gòu):數(shù)據(jù)幀是在CAN通訊中最主要、最復(fù)雜的報文,它的結(jié)構(gòu)如下圖
其他報文結(jié)構(gòu)
2. CAN控制器
STM32 的芯片中具有bxCAN控制器,支持CAN協(xié)議2.0A和2.0B標(biāo)準(zhǔn)。該CAN控制器支持最高的通訊速率為1Mb/s;可以自動地接收和發(fā)送CAN報文,支持使用標(biāo)準(zhǔn)ID和擴(kuò)展ID的報文;外設(shè)中有3個發(fā)送郵箱,發(fā)送報文的優(yōu)先級可以使用軟件控制,還可記錄發(fā)送的時間;有2個3級深度的接收FIFO,可使用過濾功能只接收或不接收某些ID號的報文;可配置成自動重發(fā);不支持使用DMA進(jìn)行數(shù)據(jù)收發(fā)??蚣苁疽鈭D如下:
STM32有兩組CAN控制器,其中CAN1是主設(shè)備,框圖中的存儲訪問控制器是由CAN1控制的,CAN2無法直接訪問存儲區(qū)域,所以使用CAN2的時候必須使能CAN1外設(shè)的時鐘??驁D中主要包含CAN控制內(nèi)核、發(fā)送郵箱、接收FIFO以及驗收篩選器,下面對框圖中的各個部分進(jìn)行介紹
2.1 CAN控制內(nèi)核
主控寄存器CAN_MCR:負(fù)責(zé)管理CAN的工作模式
INRQ位:用來控制初始化請求,在CAN初始化時,先設(shè)置該位為1,進(jìn)行初始化,之后再設(shè)置該位為0,讓CAN進(jìn)入正常工作模式
位時序寄存器CAN_BTR:用于配置測試模式、波特率以及各種位內(nèi)的段參數(shù)
CAN波特率的計算公式:只需要知道BS1和BS2的設(shè)置,以及APB1的時鐘頻率,就可以方便的計算出波特率。比如設(shè)置TS1=9、TS2=5和BRP=6,在APB1頻率為45Mhz的條件下,即可得到CAN通信的波特率=45000/6/(5+9+1)=500Kbps
2.2 CAN發(fā)送郵箱
CAN 共有3個發(fā)送郵箱,即最多可以緩存3個待發(fā)送的報文。每個發(fā)送郵箱中包含有標(biāo)識符寄存器CAN_TIxR、數(shù)據(jù)長度控制寄存器CAN_TDTxR及2個數(shù)據(jù)寄存器CAN_TDLxR、CAN_TDHxR,如下圖
當(dāng)使用CAN外設(shè)發(fā)送報文時,需要把報文的各個段分解,按位置寫入到這些寄存器中,并對標(biāo)識符寄存器CAN_TIxR中的發(fā)送請求寄存器位TMIDxR_TXRQ置1,即可把數(shù)據(jù)發(fā)送出去。其中標(biāo)識符寄存器CAN_TIxR中的STDID寄存器位比較特別。我們知道CAN的標(biāo)準(zhǔn)標(biāo)識符的總位數(shù)為11位,而擴(kuò)展標(biāo)識符的總位數(shù)為29位的。當(dāng)報文使用擴(kuò)展標(biāo)識符的時候,標(biāo)識符寄存器CAN_TIxR中的STDID[10:0]等效于EXTID[18:28]位,它與EXTID[17:0]共同組成完整的29位擴(kuò)展標(biāo)識符
發(fā)送郵箱標(biāo)識符寄存器CAN_TIxR
發(fā)送郵箱數(shù)據(jù)長度和時間戳寄存器CAN_TDTxR
發(fā)送郵箱低字節(jié)數(shù)據(jù)寄存器CAN_TDLxR
發(fā)送郵箱高字節(jié)數(shù)據(jù)寄存器CAN_TDHxR
2.3 CAN接收FIFO
CAN 共有2個接收FIFO,每個FIFO中有3個郵箱,即最多可以緩存6個接收到的報文。當(dāng)接收到報文時,F(xiàn)IFO的報文計數(shù)器會自增,而STM32內(nèi)部讀取FIFO數(shù)據(jù)之后,報文計數(shù)器會自減,通過狀態(tài)寄存器可獲知報文計數(shù)器的值,而通過前面主控制寄存器的RFLM位,可設(shè)置鎖定模式,鎖定模式下FIFO溢出時會丟棄新報文,非鎖定模式下FIFO溢出時新報文會覆蓋舊報文。跟發(fā)送郵箱類似,每個接收FIFO中包含有標(biāo)識符寄存器CAN_RIxR、數(shù)據(jù)長度控制寄存器CAN_RDTxR及2個數(shù)據(jù)寄存器CAN_RDLxR、CAN_RDHxR,它們的功能見下表
通過中斷或狀態(tài)寄存器知道接收FIFO有數(shù)據(jù)后,我們再讀取這些寄存器的值即可把接收到的報文加載到STM32的內(nèi)存中 ?接收FIFO郵箱標(biāo)識符寄存器CAN_RIxR
接收FIFO郵箱數(shù)據(jù)長度和時間戳寄存器CAN_RDTxR
接收FIFO郵箱低字節(jié)數(shù)據(jù)寄存器CAN_RDLxR
接收FIFO郵箱高字節(jié)數(shù)據(jù)寄存器CAN_RDHxR
2.4 CAN驗收篩選器
AN 驗收篩選器,共有28個篩選器組,每個篩選器組有2個寄存器,CAN1和CAN2 共用篩選器。CAN協(xié)議中,消息的標(biāo)識符與節(jié)點(diǎn)地址無關(guān),但與消息內(nèi)容有關(guān)。因此,發(fā)送節(jié)點(diǎn)將報文廣播給所有接收器時,接收節(jié)點(diǎn)會根據(jù)報文標(biāo)識符的值來確定軟件是否需要該消息,為了簡化軟件的工作,STM32的CAN外設(shè)接收報文前會先使用驗收篩選器檢查,只接收需要的報文到FIFO中。篩選器工作的時候,可以調(diào)整篩選ID的長度及過濾模式。
根據(jù)篩選ID長度來分類有有以下兩種:
檢查 STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位,共 31 位
檢查 STDID[10:0]、RTR、IDE 和 EXTID[17:15],共 16 位
根據(jù)過濾的方法分為以下兩種模式:
標(biāo)識符列表模式,它把要接收報文的 ID 列成一個表,要求報文 ID 與列表中的某一個標(biāo)識符完全相同才可以接收,可以理解為白名單管理。
掩碼模式,它把可接收報文 ID 的某幾位作為列表,這幾位被稱為掩碼,可以把它理解成關(guān)鍵字搜索,只要掩碼 (關(guān)鍵字) 相同,就符合要求,報文就會被保存到接收 FIFO
通過配置篩選模式寄存器CAN_FM1R的FBMx位可以設(shè)置篩選器工作在哪個模式。通過配置篩選尺度寄存器CAN_FS1R的FSCx位可以設(shè)置篩選器工作在哪個尺度。不同的尺度和不同的過濾方法可使篩選器工作在圖 的 4 種狀態(tài)
每組篩選器包含2個32位的寄存器,分別為CAN_FxR1和CAN_FxR2,它們用來存儲要篩選的ID或掩碼,各個寄存器位代表的意義與圖中兩個寄存器下面“映射”的一欄一致,各個模式的說明見表
例如下面的表格所示,在掩碼模式時,第一個寄存器存儲要篩選的ID,第二個寄存器存儲掩碼,掩碼為1的部分表示該位必須與ID中的內(nèi)容一致,篩選的結(jié)果為表中第三行的ID值,它是一組包含多個的ID值,其中x表示該位可以為1可以為0
而工作在標(biāo)識符模式時,2個寄存器存儲的都是要篩選的ID,它只包含2個要篩選的ID值 (32位模式時)。如果使能了篩選器,且報文的ID與所有篩選器的配置都不匹配,CAN外設(shè)會丟棄該報文,不存入接收FIFO ?過濾器模式寄存器CAN_FM1R
過濾器尺度寄存器CAN_FS1R
過濾器FIFO分配寄存器CAN_FFA1R
過濾器激活寄存器CAN_FA1R
過濾器組i的寄存器x CAN_FiRx
?
?
審核編輯:湯梓紅
評論
查看更多