工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

三格電子CAN學(xué)習(xí)筆記

三格電子CAN學(xué)習(xí)筆記

2021/6/8 16:09:14

CAN理論概述

1..CAN的分層結(jié)構(gòu)(依照OSI標(biāo)準(zhǔn)):

圖片1.jpg 

--CAN與以太網(wǎng)類似---包含最底的兩層(物理層和數(shù)據(jù)鏈路層)。

--另外還包含傳輸層---用于發(fā)送控制(單次觸發(fā)或發(fā)送失敗時(shí)永久重發(fā))。

--應(yīng)用層即為發(fā)送接收相關(guān)的發(fā)送/接收函數(shù)、中斷及數(shù)據(jù)的處理。

--因此雖然標(biāo)準(zhǔn)CAN不包含OSI中的七層,但也可以構(gòu)成簡易的網(wǎng)絡(luò),

-- CANopen是一種架構(gòu)在控制局域網(wǎng)路(Control Area Network, CAN)上的高層通訊協(xié)定,包括通訊子協(xié)定及設(shè)備子協(xié)定常在嵌入式系統(tǒng)中使用,也是工業(yè)控制常用到的一種現(xiàn)場總線

CANopen實(shí)作了OSI模型中的網(wǎng)絡(luò)層以上(包括網(wǎng)絡(luò)層)的協(xié)定。CANopen標(biāo)準(zhǔn)包括尋址方案、數(shù)個(gè)小的通訊子協(xié)定及由設(shè)備子協(xié)定所定義的應(yīng)用層。 CANopen 支援網(wǎng)絡(luò)管理、設(shè)備監(jiān)控及節(jié)點(diǎn)間的通訊,其中包括一個(gè)簡易的傳輸層,可處理資料的分段傳送及其組合。一般而言資料鏈結(jié)層及實(shí)體層會(huì)用CAN來實(shí)作。除了CANopen外,也有其他的通訊協(xié)定(如EtherCAT)實(shí)作CANopen的設(shè)備子協(xié)定。

--CAN與CANOPEN是兩種協(xié)議,沒有CANOPEN也可以組成CAN網(wǎng)絡(luò)及應(yīng)用。

--CAN+CANOPEN組成較完整的OSI;這類似于TCP/IP+以太網(wǎng)組成互聯(lián)網(wǎng)。

--從OSI網(wǎng)絡(luò)模型的角度來看同,現(xiàn)場總線網(wǎng)絡(luò)一般只實(shí)現(xiàn)了第1層(物理層)、第2層(數(shù)據(jù)鏈路層)、第7層(應(yīng)用層)。因?yàn)楝F(xiàn)場總線通常只包括一個(gè)網(wǎng)段,因此不需要第3層(傳輸層)和第4層(網(wǎng)絡(luò)層),也不需要第5層(會(huì)話層)第6層(描述層)的作用。

2..CAN技術(shù)特點(diǎn)

1)工作方式CAN多主方式工作,網(wǎng)絡(luò)上任一節(jié)點(diǎn)均可在任意時(shí)刻主動(dòng)地向網(wǎng)絡(luò)上其他節(jié)點(diǎn)發(fā)送信息,而不分主從,通信方式靈活,且無需站地址等節(jié)點(diǎn)信息。

2)消息的發(fā)送CAN網(wǎng)絡(luò)上的節(jié)點(diǎn)信息分成不同的優(yōu)先級,可滿足不同的實(shí)時(shí)要求,高優(yōu)先級的數(shù)據(jù)最多可在134us內(nèi)得到傳輸。

3)仲裁CAN采用非破壞性總線仲裁技術(shù),大大節(jié)省了總線沖突仲裁時(shí)間。尤其是在網(wǎng)絡(luò)負(fù)載很重的情況下也不會(huì)出現(xiàn)網(wǎng)絡(luò)癱瘓情況(以太網(wǎng)則可能)。

4)系統(tǒng)的柔軟性:與總線相連的單元沒有類似于“地址”的信息。因此在總線上增加單元時(shí),連接在總線上的其它單元的軟硬件及應(yīng)用層都不需要改變。

5)連接CAN 總線是可同時(shí)連接多個(gè)單元的總線??蛇B接的單元總數(shù)理論上是沒有限制的。但實(shí)際上可連接的單元數(shù)受總線上的時(shí)間延遲及電氣負(fù)載的限制。降低通信速度,可連接的單元數(shù)增加;提高通信速度,則可連接的單元數(shù)減少。

6)故障封閉 CAN 可以判斷出錯(cuò)誤的類型是總線上暫時(shí)的數(shù)據(jù)錯(cuò)誤(如外部噪聲等)還是持續(xù)的數(shù)據(jù)錯(cuò)誤(如單元內(nèi)部故障、驅(qū)動(dòng)器故障、斷線等)。由此功能,當(dāng)總線上發(fā)生持續(xù)數(shù)據(jù)錯(cuò)誤時(shí),可將引起此故障的單元從總線上

隔離出去。

7)通信速度:根據(jù)整個(gè)網(wǎng)絡(luò)的規(guī)模,可設(shè)定適合的通信速度。在同一網(wǎng)絡(luò)中,所有單元必須設(shè)定成統(tǒng)一的通信速度。即使有一個(gè)單元的通信速度與其它的不一樣,此單元也會(huì)輸出錯(cuò)誤信號,妨礙整個(gè)網(wǎng)絡(luò)的通信。不同網(wǎng)絡(luò)間則可以有不同的通信速度。

8)遠(yuǎn)程數(shù)據(jù)請求:可通過發(fā)送遙控幀/遠(yuǎn)程幀請求其他單元發(fā)送數(shù)據(jù)。

9)錯(cuò)誤檢測/通知/恢復(fù)功能: 

所有的單元都可以檢測錯(cuò)誤(錯(cuò)誤檢測功能)。 

檢測出錯(cuò)誤的單元會(huì)立即同時(shí)通知其他所有單元(錯(cuò)誤通知功能)。 

正在發(fā)送消息的單元一旦檢測出錯(cuò)誤,會(huì)強(qiáng)制結(jié)束當(dāng)前的發(fā)送。強(qiáng)制結(jié)束發(fā)送的單元會(huì)不斷反復(fù)地重新發(fā)送,此消息直到成功發(fā)送為止(錯(cuò)誤恢復(fù)功能)。

10)CRC校驗(yàn)CAN的每幀信息都有CRC校驗(yàn)及其他檢錯(cuò)措施,保證了數(shù)據(jù)出錯(cuò)率極低。

3..標(biāo)準(zhǔn)協(xié)議:

ISO標(biāo)準(zhǔn)化的CAN協(xié)議

CAN協(xié)議經(jīng)ISO標(biāo)準(zhǔn)化后有ISO11898標(biāo)準(zhǔn)和ISO11519-2標(biāo)準(zhǔn)兩種。ISO11898和ISO11519-2標(biāo)準(zhǔn)對于數(shù)據(jù)鏈路層的定義相同,但物理層不同。

(1)  關(guān)于ISO11898

ISO11898 是通信速度為 125kbps-1MbpsCAN 高速通信標(biāo)準(zhǔn)。

目前,ISO11898 追加新規(guī)約后,成為 ISO11898-1 新標(biāo)準(zhǔn)。

(2)  關(guān)于 ISO11519

ISO11519 是通信速度為 125kbps以下 CAN 低速通信標(biāo)準(zhǔn)。

ISO11519-2 是 ISO11519-1 追加新規(guī)約后的版本。

總結(jié)

>>兩種標(biāo)準(zhǔn)物理層不同,數(shù)據(jù)鏈路層相同。

>>數(shù)據(jù)鏈路層對應(yīng)控制器;物理層對應(yīng)收發(fā)器。

>>CAN2.0A/B的區(qū)別是ID位數(shù)不同---數(shù)據(jù)鏈路層(控制器)不同。

>>ISO11898與ISO11519-2的區(qū)別是物理層(收發(fā)器)的不同。

>>課題所用到的PCA82C250、VP230以及TJA1050都支持ISO11898標(biāo)準(zhǔn)。

PCA82C252與TJA1053支持ISO11519-2標(biāo)準(zhǔn)。

4.. 錯(cuò)誤

--------錯(cuò)誤狀態(tài)的種類 

單元始終處于 3 種狀態(tài)之一。

(1)  主動(dòng)錯(cuò)誤狀態(tài) 

主動(dòng)錯(cuò)誤狀態(tài)是可以正常參加總線通信的狀態(tài)。 

處于主動(dòng)錯(cuò)誤狀態(tài)的單元檢測出錯(cuò)誤時(shí),輸出主動(dòng)錯(cuò)誤標(biāo)志。 

(2)  被動(dòng)錯(cuò)誤狀態(tài)

被動(dòng)錯(cuò)誤狀態(tài)是易引起錯(cuò)誤的狀態(tài)。 

處于被動(dòng)錯(cuò)誤狀態(tài)的單元雖能參加總線通信,但為不妨礙其它單元通信,接收時(shí)不能積極地發(fā)送錯(cuò)誤通知。

處于被動(dòng)錯(cuò)誤狀態(tài)的單元即使檢測出錯(cuò)誤,而其它處于主動(dòng)錯(cuò)誤狀態(tài)的單元如果沒發(fā)現(xiàn)錯(cuò)誤,整個(gè)總線也被認(rèn)為是沒有錯(cuò)誤的。 

處于被動(dòng)錯(cuò)誤狀態(tài)的單元檢測出錯(cuò)誤時(shí),輸出被動(dòng)錯(cuò)誤標(biāo)志。 

另外,處于被動(dòng)錯(cuò)誤狀態(tài)的單元在發(fā)送結(jié)束后不能馬上再次開始發(fā)送。在開始下次發(fā)送前,在間隔幀期間內(nèi)必須插入“延遲傳送”(8 個(gè)位的隱性位)。

(3)  總線關(guān)閉態(tài) 

總線關(guān)閉態(tài)是不能參加總線上通信的狀態(tài)。

信息的接收和發(fā)送均被禁止。

這些狀態(tài)依靠發(fā)送錯(cuò)誤計(jì)數(shù)和接收錯(cuò)誤計(jì)數(shù)來管理,根據(jù)計(jì)數(shù)值決定進(jìn)入何種狀態(tài)。

--------錯(cuò)誤狀態(tài)和計(jì)數(shù)值關(guān)系

圖片2.jpg 

CANOPEN協(xié)議

工作層

CAN只定義物理層和數(shù)據(jù)鏈路層,沒有規(guī)定應(yīng)用層,本身并不完整,需要一個(gè)高層協(xié)來定義CAN報(bào)文中的11/29位標(biāo)識符、8字節(jié)數(shù)據(jù)的使用。而且,基于CAN總線的工業(yè)自動(dòng)化應(yīng)用中,越來越需要一個(gè)開放的、標(biāo)準(zhǔn)化的高層協(xié)議:這個(gè)協(xié)議支持各種CAN廠商設(shè)備的互用性、互換性,能夠?qū)崿F(xiàn)在CAN網(wǎng)絡(luò)中提供標(biāo)準(zhǔn)的、統(tǒng)一的系統(tǒng)通訊模式,提供設(shè)備功能描述方式,執(zhí)行網(wǎng)絡(luò)管理功能。  

a)應(yīng)用層(Application  layer):為網(wǎng)絡(luò)中每一個(gè)有效設(shè)備都能夠提供一組有用的服務(wù)與協(xié)議。  

b)通訊描述(Communication  profile):提供配置設(shè)備、通訊數(shù)據(jù)的含義,定義數(shù)據(jù)通訊方式。  

c)設(shè)備描述(Device proflile):為設(shè)備(類)增加符合規(guī)范的行為。

2  應(yīng)用

CANopen協(xié)議。CANopen協(xié)議是CAN-in-Automation(CiA)定義的標(biāo)準(zhǔn)之一,并且在發(fā)布后不久就獲得了廣泛的承認(rèn)。尤其是在歐洲,CANopen協(xié)議被認(rèn)為是在基于CAN的工業(yè)系統(tǒng)中占領(lǐng)導(dǎo)地位的標(biāo)準(zhǔn)。大多數(shù)重要的設(shè)備類型,例如數(shù)字和模擬的輸入輸出模塊、驅(qū)動(dòng)設(shè)備、操作設(shè)備、控制器、可編程控制器或編碼器,都在稱為“設(shè)備描述”的協(xié)議中進(jìn)行描述;“設(shè)備描述”定義了不同類型的標(biāo)準(zhǔn)設(shè)備及其相應(yīng)的功能。依靠CANopen協(xié)議的支持,可以對不同廠商的設(shè)備通過總線進(jìn)行配置。

3  CAL協(xié)議 CANOPEN協(xié)議:

CALCAN Application Layer)協(xié)議是目前基于CAN的高層通訊協(xié)議中的一種,最早由Philips醫(yī)療設(shè)備部門制定。

CANopen是在 CAL基礎(chǔ)上開發(fā)的,使用了CAL通訊和服務(wù)協(xié)議子集,提供了分布式控制系統(tǒng)的一種實(shí)現(xiàn)方案。CANopen在保證網(wǎng)絡(luò)節(jié)點(diǎn)互用性的同時(shí)允許節(jié)點(diǎn)的功能隨意擴(kuò)展:或簡單或復(fù)雜。

CANopen的核心概念是設(shè)備對象字典OD:Object Dictionary),在其它現(xiàn)場總線(Profibus,Interbus-S)系統(tǒng)中也使用這種設(shè)備描述形式。注意:對象字典不是CAL的一部分,而是在CANopen中實(shí)現(xiàn)的。

基于STM32的CAN

輪詢=查詢

1 STM32bxCAN:是基本擴(kuò)展CAN(Basic Extended CAN)的縮寫,它支持CAN協(xié)議2.0A和2.0B。它的設(shè)計(jì)目標(biāo)是,以最小的CPU負(fù)荷來高效處理大量收到的報(bào)文。它也支持報(bào)文發(fā)送的優(yōu)先級要求(優(yōu)先級特性可軟件配置)。對于安全緊要的應(yīng)用,bxCAN提供所有支持時(shí)間觸發(fā)通信模式所需的硬件功能。

2 CAN--2.0A和2.0B CAN2.0A為標(biāo)準(zhǔn)格式,CAN2.0B為擴(kuò)展格式,報(bào)文標(biāo)識符可達(dá)2032種(CAN2.0A11位ID),而擴(kuò)展標(biāo)準(zhǔn)(CAN2.0B29位ID)的報(bào)文標(biāo)識符幾乎不受限制;CAN2.0規(guī)范兼容CAN 1.2 規(guī)范。

3 發(fā)送郵箱和接收過濾器:

>>共有3個(gè)發(fā)送郵箱供軟件來發(fā)送報(bào)文。發(fā)送調(diào)度器根據(jù)優(yōu)先級決定哪個(gè)郵箱的報(bào)文先被發(fā)送。

>>在互聯(lián)型產(chǎn)品中,bxCAN提供28個(gè)位寬可變/可配置的標(biāo)識符過濾器組,軟件通過對它們編程,從而在引腳收到的報(bào)文中選擇它需要的報(bào)文,而把其它報(bào)文丟棄掉。在其它STM32F103xx系列產(chǎn)品中有14個(gè)位寬可變/可配置的標(biāo)識符過濾器組。

接收FIFO

共有2個(gè)接收FIFO,每個(gè)FIFO都可以存放3個(gè)完整的報(bào)文---共六個(gè)報(bào)文。它們完全由硬件來管理。

注:互聯(lián)型產(chǎn)品是指STM32F105xx和STM32F107xx微控制器。

4 bxCAN工作模式

(1) 初始化模式bxCAN處于初始化模式時(shí),禁止報(bào)文的接收和發(fā)送,并且CANTX引腳輸出隱性位(高電平)。 初始化模式的進(jìn)入,不會(huì)改變配置寄存器。

(2) 正常模式:可以正常的接收和發(fā)送報(bào)文。

(3) 睡眠模式低功耗模式,bxCAN的時(shí)鐘停止了,但軟件仍然可以訪問郵箱寄存器。

5 bxCAN測試模式

(1) 靜默模式:在靜默模式下,bxCAN可以正常地接收數(shù)據(jù)幀和遠(yuǎn)程幀,但只能發(fā)出隱性位,而不能真正發(fā)送報(bào)文----靜默模式通常用于分析CAN總線的活動(dòng),而不會(huì)對總線造成影響-顯性位(確認(rèn)位、錯(cuò)誤幀)不會(huì)真正發(fā)送到總線上。

(2) 環(huán)回模式:在環(huán)回模式下,bxCAN把發(fā)送的報(bào)文當(dāng)作接收的報(bào)文并保存(如果可以通過接收過濾)在接收郵箱里---用于自測試,但是發(fā)送的報(bào)文可以在CANTX引腳上檢測到

(3) 靜默環(huán)回:用于“熱自測試”,即可以像環(huán)回模式那樣測試bxCAN,但卻不會(huì)影響CANTX和CANRX所連接的整個(gè)CAN系統(tǒng)。在環(huán)回靜默模式下,CANRX引腳與CAN總線斷開,同時(shí)CANTX引腳被驅(qū)動(dòng)到隱性位狀態(tài)。

6 調(diào)試DBG支持定時(shí)器、看門狗、bxCANI2C的調(diào)試

當(dāng)微控制器處于調(diào)試模式時(shí),Cortex-M3核心處于暫停狀態(tài),依據(jù)下述配置位的狀態(tài),bxCAN可以繼續(xù)正常工作或停止工作:

調(diào)試(DBG)模塊中的調(diào)試MCU配置寄存器DBGMCU_CRCAN1的DBG_CAN1_STOP位或CAN2的DBG_CAN2_STOP位。DBG_CANx_STOP:當(dāng)內(nèi)核進(jìn)入調(diào)試狀態(tài)時(shí),CAN2停止運(yùn)行。

0:CANx仍然正常運(yùn)行;

1:CANx的接收寄存器不繼續(xù)接收數(shù)據(jù)。 

●  CAN_MCR(CAN主控制寄存器)中的DBF位(位16):

0:在調(diào)試時(shí),CAN照常工作

1:在調(diào)試時(shí),凍結(jié)CAN的接收/發(fā)送。仍然可以正常地讀寫和控制接收FIFO。

7 發(fā)送處理

CAN發(fā)送郵箱標(biāo)識符寄存器:

>>CAN_TIxR寄存器的TXRQ位置’1-----------請求發(fā)送。

CAN發(fā)送狀態(tài)寄存器:

>>CAN_TSR寄存器的RQCPTXOK位置1----來表明一次成功發(fā)送。

>>CAN_TSR寄存器的ALST位置’1’---------仲裁引起,TERR位置’1’-----發(fā)送錯(cuò)誤。

>>CAN_TSR寄存器的ABRQ位置’1’-------中止發(fā)送請求:

CAN主控制寄存器:

>>CAN_MCR寄存器的TXFP位置’1’-------把發(fā)送郵箱配置為發(fā)送FIFO。

>>CAN_MCR寄存器的NART位置’1’-------禁止自動(dòng)重傳模式。

8 時(shí)間觸發(fā)通信模式:

在該模式下,CAN硬件的內(nèi)部定時(shí)器被激活,并且被用于產(chǎn)生(發(fā)送與接收郵箱的)時(shí)間戳(時(shí)間標(biāo)記),分別存儲(chǔ)在CAN_RDTxR/CAN_TDTxR寄存器(接收/發(fā)送該報(bào)文SOF的時(shí)刻,16位定時(shí)器的值)中。內(nèi)部定時(shí)器在每個(gè)CAN位時(shí)間累加。

內(nèi)部定時(shí)器在接收和發(fā)送的幀起始位的采樣點(diǎn)位置被采樣,并生成時(shí)間戳。

9 接收管理

接收到的報(bào)文,被存儲(chǔ)在3級郵箱深度的FIFO中。FIFO完全由硬件來管理,從而節(jié)省了CPU的處理負(fù)荷,簡化了軟件并保證了數(shù)據(jù)的一致性。應(yīng)用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報(bào)文

>>CAN_RFR(CAN接收FIFO寄存器)的FMP[1:0]------- 報(bào)文數(shù)目。

>>CAN_RFR寄存器的RFOM位設(shè)置’1’-------------釋放郵箱

>>CAN_RFR寄存器的FOVR位進(jìn)行置’1’----------表明溢出

>>CAN_RFR寄存器的FULL位就被置’1’-----------FIFO已滿

接收中斷CAN_IER-----中斷使能寄存器

>>CAN_IER寄存器的FMPIE位為’1’-------產(chǎn)生接收中斷請求(有報(bào)文)。

>>CAN_IER寄存器的FFIE位為’1’-----------產(chǎn)生滿中斷請求

>>CAN_IER寄存器的FOVIE位為’1’---------產(chǎn)生溢出中斷請求。

10 標(biāo)識符過濾

CAN協(xié)議里,報(bào)文的標(biāo)識符不代表節(jié)點(diǎn)的地址,而是跟報(bào)文的內(nèi)容相關(guān)的。因此,發(fā)送者以廣播的形式把報(bào)文發(fā)送給所有的接收者。節(jié)點(diǎn)在接收報(bào)文時(shí)根據(jù)標(biāo)識符的值決定軟件是否需要該報(bào)文;如果需要,就拷貝到SRAM里;如果不需要,報(bào)文就被丟棄且無需軟件的干預(yù)。為滿足這一需求,在互聯(lián)型產(chǎn)品中,bxCAN控制器為應(yīng)用程序提供了28個(gè)位寬可變的、可配置過濾器組(27~0);在其它產(chǎn)品中,bxCAN控制器為應(yīng)用程序提供了14個(gè)位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟件需要的報(bào)文。硬件過濾的做法節(jié)省了CPU開銷,否則就必須由軟件過濾從而占用一定的CPU開銷。

(1) CAN過濾器模式寄存器(CAN_FM1R)CAN_FiRx配合使用

標(biāo)識符屏蔽位模式:在屏蔽位模式下,標(biāo)識符寄存器和屏蔽寄存器一起,指定報(bào)文標(biāo)識符的任何一位,應(yīng)該按照“必須匹配”或“不用關(guān)心”處理。

標(biāo)識符列表模式:在標(biāo)識符列表模式下,屏蔽寄存器也被當(dāng)作標(biāo)識符寄存器用。因此,不是采用一個(gè)標(biāo)識符加一個(gè)屏蔽位的方式,而是使用2個(gè)標(biāo)識符寄存器。接收報(bào)文標(biāo)識符的每一位都必須跟過濾器標(biāo)識符相同。

0: 過濾器組x的2個(gè)32位寄存器工作在標(biāo)識符屏蔽位模式;

1: 過濾器組x的2個(gè)32位寄存器工作在標(biāo)識符列表模式。

>>為了過濾出一組標(biāo)識符,應(yīng)該設(shè)置過濾器組工作在模式。

>>為了過濾出一個(gè)標(biāo)識符,應(yīng)該設(shè)置過濾器組工作在標(biāo)識符列模式。

>>應(yīng)用程序不用的過濾器組,應(yīng)該保持在禁用狀態(tài)。

(2) 過濾器位寬(CAN_FS1R):配置各個(gè)過濾器組的位寬-------實(shí)際上只有兩種位寬:

0:過濾器位寬為2個(gè)16位;

1:過濾器位寬為單個(gè)32位

>>2個(gè)16位:即16位與低16位為兩個(gè)不同的過濾器。

(3)CAN 過濾器FIFO關(guān)聯(lián)寄存器(CAN_FFA1R):報(bào)文在通過了某過濾器的過濾后,將被存放到其關(guān)聯(lián)的FIFO0FIFO1中。

(4) CAN 過濾器激活寄存器 (CAN_FA1R):在配置一個(gè)過濾器組前,必須通過清除CAN_FAR寄存器的FACT位,把它設(shè)置為禁用狀態(tài)-----先禁用后配置。

(5) CAN 過濾器組i的寄存器x(CAN_FiRx---包含32個(gè)過濾器位):互聯(lián)產(chǎn)品中i=0..27,其它產(chǎn)品中i=0..13;x=1..2

>>只有在CAN_FAxR寄存器相應(yīng)的FACTx位0,或CAN_FMR寄存器的FINIT位為1時(shí),才能修改相應(yīng)的過濾器寄存器。

>>標(biāo)識符模式

寄存器的每位對應(yīng)于所期望的標(biāo)識符的相應(yīng)位的電平。

0: 期望相應(yīng)位為顯性位;

1: 期望相應(yīng)位為隱性位。

屏蔽位模式

寄存器的每位指示是否對應(yīng)的標(biāo)識符寄存器位一定要與期望的標(biāo)識符的相應(yīng)位一致。

0: 不關(guān)心,該位不用于比較;

1: 必須匹配,到來的標(biāo)識符位必須與濾波器對應(yīng)的標(biāo)識符寄存器位相一致。

屏蔽位舉例:(標(biāo)準(zhǔn)ID)                               

有效位數(shù)

STDID        0xE0F    x110 0000 1111          11

FilterID     0xF0F    x111 0000 1111          11

MaskID       0xDFFF    110 1111 1111 1        12

----關(guān)鍵是Std/FilterID都只有11位有效位,都需要移位;而MaskID不存在移位,因此在根據(jù)發(fā)送的ID確定MaskID時(shí)存在一位的位差;即StdID的最高位為無效MaskID需要右移一位與StdID對齊。

>>CAN_FiR1始終為標(biāo)示符寄存器,而CAN_FiR2與模式對應(yīng)----可以為為標(biāo)示符寄存器,也可以為屏蔽寄存器,因此標(biāo)識符模式下有2個(gè)或4個(gè)(分別對應(yīng)位寬為32和16)標(biāo)示符寄存器。

----------過濾器組位寬設(shè)置圖表如下:

圖片3.jpg 

波特率設(shè)置

波特率最高可達(dá)1Mb/S。

圖片4.jpg 

PCLK:低速APB1時(shí)鐘(PCLK1)時(shí)鐘頻率36MHz不超過36MHz。

tPCLK = 1/PCLK1=1/36MHz 。

tBS1 0-15共16種可選值 。

tBS2 0-7共8種可選值 。

CAN_Prescaler- Prescaler分頻)與BRP[9:0]對應(yīng)-有1024種可選值 。

      1Mb/s的波特率:CAN_Prescaler = 4;tBS1 =3* tq; tBS2=5* tq

tq=4* tPCLK =1/(9M);位時(shí)間=(1+3+5)tq =1/(1M); 波特率 = 1Mbs。

--------------------stm32的can總線的過濾器總結(jié)----------------------

關(guān)鍵:必須對標(biāo)識符進(jìn)行相應(yīng)的移位---過濾器中的16/32位數(shù)不僅包含ID還包含IDE和IDR

      CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時(shí)間觸發(fā)通信模式       CAN_InitStructure.CAN_ABOM=DISABLE;       CAN_InitStructure.CAN_AWUM=DISABLE;       CAN_InitStructure.CAN_NART=DISABLE;//CAN報(bào)文只被發(fā)送1次,不管發(fā)送的結(jié)果如何(成功、出錯(cuò)或仲裁丟失)       CAN_InitStructure.CAN_RFLM=DISABLE;       CAN_InitStructure.CAN_TXFP=DISABLE;       CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;       //CAN_Mode_LoopBack       //CAN_Mode_Normal       CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;       CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//1--16       CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//1--8       CAN_InitStructure.CAN_Prescaler=2;

      CAN_Init(&CAN_InitStructure);

       /* CAN filter init */       CAN_FilterInitStructure.CAN_FilterNumber=0;//選擇過濾器0       CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定過濾器被設(shè)置為標(biāo)識符屏蔽模式       CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//給出過濾器位寬為32位

下面根據(jù)設(shè)置的參數(shù)不同來決定can總線can總線的配置情況:

1、對擴(kuò)展數(shù)據(jù)幀進(jìn)行過濾:(只接收擴(kuò)展數(shù)據(jù)幀)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF; (注:標(biāo)準(zhǔn)幀數(shù)據(jù)幀、標(biāo)準(zhǔn)遠(yuǎn)程幀和擴(kuò)展遠(yuǎn)程幀均被過濾) 2、對擴(kuò)展遠(yuǎn)程幀過濾:(只接收擴(kuò)展遠(yuǎn)程幀)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

3、對標(biāo)準(zhǔn)遠(yuǎn)程幀過濾:(只接收標(biāo)準(zhǔn)遠(yuǎn)程幀)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF; 4、對標(biāo)準(zhǔn)數(shù)據(jù)幀過濾:(只接收標(biāo)準(zhǔn)數(shù)據(jù)幀)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

5、對擴(kuò)展幀進(jìn)行過濾:(擴(kuò)展幀不會(huì)被過濾掉)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC; 6、對標(biāo)準(zhǔn)幀進(jìn)行過濾:(標(biāo)準(zhǔn)幀不會(huì)被過濾掉)       CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<21)&0xffff0000)>>16;       CAN_FilterInitStructure.CAN_FilterIdLow   = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;       CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;       CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC; 注:slave_id為要過濾的id號。

 

---------------------MCP2515獨(dú)立控制器-----------------------

圖片5.jpg 

1  簡介

MCP2515 是一款獨(dú)立控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)協(xié)議控制器,完全支持 CAN V2.0B 技術(shù)規(guī)范。該器件能發(fā)送和接收標(biāo)準(zhǔn)和擴(kuò)展數(shù)據(jù)幀以及遠(yuǎn)程幀。MCP2515 自帶的兩個(gè)驗(yàn)收屏蔽寄存器和六個(gè)驗(yàn)收濾波寄存器可以過濾掉不想要的報(bào)文,因此減少了主單片機(jī)(MCU)的開銷。MCP2515與MCU 的連接是通過業(yè)界標(biāo)準(zhǔn)串行外設(shè)接口(SearialPeripheral Interface,SPI)來實(shí)現(xiàn)的。

2 數(shù)據(jù)發(fā)送:

>>器件有三個(gè)引腳----TX0RTS/TX1RTS/TX2RTS用來啟動(dòng)將裝載在三個(gè)發(fā)送緩沖器之一中的報(bào)文立即發(fā)送出去。是否使用這些引腳由用戶決定;若不使用,也可利用控制寄存器(通過SPI接口訪問)來啟動(dòng)報(bào)文發(fā)送---------三個(gè)RTS引腳可以不用。

>>報(bào)文發(fā)送時(shí),首先將報(bào)文裝載到正確的報(bào)文緩沖器和控制寄存器中。通過SPI接口設(shè)置控制寄存器中的相應(yīng)位或使用發(fā)送使能引腳均可啟動(dòng)發(fā)送操作------常用SPI啟動(dòng)發(fā)送。

---正常情況下,如果 CAN 報(bào)文仲裁失敗或被錯(cuò)誤幀損壞,報(bào)文會(huì)嘗試次發(fā)送

3 數(shù)據(jù)接收:

>>器件上有一個(gè)多用途中斷引腳及各接收緩沖器專用中斷引腳,用于指示有效報(bào)文是否被接收并載入接收緩沖器??蛇x擇使用專用中斷引腳。通用中斷引腳和狀態(tài)寄存器(通過SPI接口訪問)也可用來確定何時(shí)接收了有效報(bào)文------為了減少引腳的使用,先使用通用中斷引腳檢測中斷的發(fā)生,再通過讀狀態(tài)寄存器判斷是何種類型的中斷。

>>通過讀取相應(yīng)的寄存器可以檢查通訊狀態(tài)和錯(cuò)誤。會(huì)對在CAN總線上檢測到的任何報(bào)文進(jìn)行錯(cuò)誤檢查,然后與用戶定義的濾波器進(jìn)行匹配,以確定是否將報(bào)文移到兩個(gè)接收緩沖器中的一個(gè)。

4  CAN報(bào)文幀

1)標(biāo)準(zhǔn)數(shù)據(jù)幀

CAN標(biāo)準(zhǔn)數(shù)據(jù)幀與其他所有幀一樣,幀以起始幀 (SOF)位開始,SOF 為顯性狀態(tài),允許所有節(jié)點(diǎn)的硬同步。

SOF之后是仲裁字段, 12個(gè)位組成, 分別為11個(gè)標(biāo)識位和一個(gè)遠(yuǎn)程發(fā)送請求(Remote TransmissionRequest, RTR)位。RTR 位用于區(qū)分報(bào)文是數(shù)據(jù)幀

RTR 位為顯性狀態(tài))還是遠(yuǎn)程幀 RTR 位為隱性狀態(tài))。

仲裁字段之后是控制字段,由6個(gè)位組成??刂谱侄蔚牡谝晃粸闃?biāo)識擴(kuò)展(Identifier Extension,IDE)位,該位應(yīng)是顯性狀態(tài)來指定標(biāo)準(zhǔn)幀。標(biāo)識擴(kuò)展位的下一位為零保留位(RB0 CAN 協(xié)議將其定義為顯性位??刂谱侄蔚钠溆?/span> 4位為數(shù)據(jù)長度Data Length Code,DLC),用來指定報(bào)文中包含的數(shù)據(jù)字節(jié)數(shù) (0 到 8 字節(jié)) 。

控制字段之后為數(shù)據(jù)字段,包含要發(fā)送的任何數(shù)據(jù)字節(jié)。數(shù)據(jù)字段長度由上述 DLC 定義 (0到 8 字節(jié))。

數(shù)據(jù)字段之后為循環(huán)冗余校驗(yàn)(CRC)字段,用來檢測報(bào)文傳輸錯(cuò)誤。CRC字段包含一個(gè)15位的CRC序列,之后是隱性的 CRC定界位。

最后一個(gè)字段是確認(rèn)字段(ACK),由2 個(gè)位組成。在確認(rèn)時(shí)隙(ACK Slot)位執(zhí)行期間,發(fā)送節(jié)點(diǎn)發(fā)出一個(gè)隱性位。任何收到無錯(cuò)誤幀的節(jié)點(diǎn)會(huì)發(fā)回一個(gè)顯性位(無論該節(jié)點(diǎn)是否配置為接受該報(bào)文與否)來確認(rèn)幀收到無誤。確認(rèn)字段以隱性確認(rèn)定界符結(jié)束,該定界符可能不允許被改寫為顯性位。

最后是幀結(jié)尾-------每一個(gè)數(shù)據(jù)幀和遠(yuǎn)程幀均由一標(biāo)志序列界定。這個(gè)標(biāo)志序列由 7 個(gè)“隱性”位組成。

>>數(shù)據(jù)幀由 7 個(gè)不同的位場組成。

2)擴(kuò)展數(shù)據(jù)幀

在擴(kuò)展 CAN數(shù)據(jù)幀中(如圖 2-2 所示),緊隨SOF位的是 32 位的仲裁字段。仲裁字段的前 11 位為 29 位標(biāo)識符的最高有效位(Most Significant bit,MSb (基本lD)。緊隨這 11 位的是替代遠(yuǎn)程請求(SubstituteRemote Request,SRR)位,定義為隱性狀態(tài)。SRR位之后是 IDE 位,該位為隱性狀態(tài)時(shí)表示這是擴(kuò)展CAN幀。

應(yīng)該注意的是, 如果發(fā)送完擴(kuò)展幀標(biāo)識符的前11位后,總線仲裁無果,而此時(shí)其中一個(gè)等待仲裁的節(jié)點(diǎn)發(fā)出標(biāo)準(zhǔn)CAN數(shù)據(jù)幀(11 位標(biāo)識符),那么,由于節(jié)點(diǎn)發(fā)出了顯性 lDE 位而使標(biāo)準(zhǔn) CAN 幀贏得總線仲裁。另外,擴(kuò)展 CAN 幀的SRR位應(yīng)為隱性,以允許正在發(fā)送標(biāo)準(zhǔn)CAN 遠(yuǎn)程幀的節(jié)點(diǎn)發(fā)出顯性 RTR 位。

SRR和lDE位之后是標(biāo)識符的其余18位(擴(kuò)展lD 及一個(gè)遠(yuǎn)程發(fā)送請求位。

為使標(biāo)準(zhǔn)幀和擴(kuò)展幀都能在共享網(wǎng)絡(luò)上發(fā)送,應(yīng)將29位擴(kuò)展報(bào)文標(biāo)識符拆成高11 位和低 18 位兩部分。拆分后可確保lDE位在標(biāo)準(zhǔn)數(shù)據(jù)幀和擴(kuò)展數(shù)據(jù)幀中的位置保持一致。

仲裁字段之后是6位控制字段??刂谱侄吻皟晌粸?/span>保留位,必須定義為顯性位---與標(biāo)準(zhǔn)數(shù)據(jù)幀相同。其余4 位為DLC,用來指定報(bào)文中包含的數(shù)據(jù)字節(jié)數(shù)。

擴(kuò)展數(shù)據(jù)幀的其他部分 (數(shù)據(jù)字段、CRC 字段、確認(rèn)字段、幀結(jié)尾和間斷)與標(biāo)準(zhǔn)數(shù)據(jù)幀的結(jié)構(gòu)相同。

3)遠(yuǎn)程幀----請求數(shù)據(jù)

通常,數(shù)據(jù)傳輸是由數(shù)據(jù)源節(jié)點(diǎn)(例如,傳感器發(fā)出數(shù)據(jù)幀)自主完成的。但也可能存在目標(biāo)節(jié)點(diǎn)向源節(jié)點(diǎn)請求發(fā)送數(shù)據(jù)的情況。要做到這一點(diǎn),目標(biāo)節(jié)點(diǎn)需發(fā)送一個(gè)遠(yuǎn)程幀,其中的標(biāo)識符應(yīng)與所需數(shù)據(jù)幀的標(biāo)識符相匹配。隨后,相應(yīng)的數(shù)據(jù)源節(jié)點(diǎn)會(huì)發(fā)送一個(gè)數(shù)據(jù)幀以響應(yīng)遠(yuǎn)程幀請求。

遠(yuǎn)程幀與數(shù)據(jù)幀存在兩點(diǎn)不同

1)遠(yuǎn)程幀的 RTR 位為隱性狀態(tài);

2)遠(yuǎn)程幀沒有數(shù)據(jù)字段。

當(dāng)帶有相同標(biāo)識符的數(shù)據(jù)幀和遠(yuǎn)程幀同時(shí)發(fā)出時(shí),數(shù)據(jù)幀將贏得仲裁,因?yàn)槠錁?biāo)識符后面的 RTR 位為顯性。這樣,可使發(fā)送遠(yuǎn)程幀的節(jié)點(diǎn)立即收到所需數(shù)據(jù)。

>>遠(yuǎn)程幀由6個(gè)不同的位場組成---沒有數(shù)據(jù)幀

幀起始、仲裁場、控制場、CRC 場、應(yīng)答場、幀末尾。

4)錯(cuò)誤幀

>>由兩個(gè)位場組成。第一個(gè)場用作為不同站提供的錯(cuò)誤標(biāo)志(ERROR FLAG)的疊加。第二個(gè)場是錯(cuò)誤界定符(含 8 個(gè)隱性位)。

>>有兩種形式的錯(cuò)誤標(biāo)志,主動(dòng)錯(cuò)誤標(biāo)志(Active error flag)和被動(dòng)錯(cuò)誤標(biāo)志(Passive error flag)。主動(dòng)錯(cuò)誤標(biāo)志由 6個(gè)連續(xù)的“顯性”位組成。被動(dòng)錯(cuò)誤標(biāo)志由6個(gè)連續(xù)的“隱性”的位組成,除非被其他節(jié)點(diǎn)的“顯性”位重寫。

5)過載幀:

過載幀包括兩個(gè)位場:過載標(biāo)志和過載界定符。

有兩種過載條件都會(huì)導(dǎo)致過載標(biāo)志的傳送:

1.  接收器的內(nèi)部條件(此接收器對于下一數(shù)據(jù)幀或遠(yuǎn)程幀需要有一延時(shí))。

2.  間歇場期間檢測到一“顯性”位。

由過載條件 1 而引發(fā)的過載幀只允許起始于所期望的間歇場的第一個(gè)位時(shí)間開始。而由過載條件 2 引發(fā)的過載幀應(yīng)起始于所檢測到“顯性”位之后的位。通常為了延時(shí)下一個(gè)數(shù)據(jù)幀或遠(yuǎn)程幀,兩個(gè)過載幀都會(huì)產(chǎn)生。

>>過載標(biāo)志由6個(gè)顯性位組成--------------所有形式和主動(dòng)錯(cuò)誤標(biāo)志的一樣。

>>過載界定符包括8個(gè)隱性位----過載界定符的形式和錯(cuò)誤界定符的形式一樣。

6)幀間間隔

幀間間隔將前一條幀(無論何種類型)與其后的數(shù)據(jù)幀或遠(yuǎn)程幀間隔開。幀間間隔至少 3 個(gè)隱性位構(gòu)成,又稱為間斷。間斷使節(jié)點(diǎn)在發(fā)送下一條報(bào)文之前有時(shí)間進(jìn)行內(nèi)部處理。在間斷之后,CAN 總線將保持隱性狀態(tài)--總線空閑,直至下一條報(bào)文開始發(fā)送。

5  位定時(shí)與波特率

CAN總線上的所有節(jié)點(diǎn)都必須具有相同的標(biāo)稱比特率。

CAN協(xié)議采用不歸零Non Return to Zero,NRZ)編碼方式,在數(shù)據(jù)流中不對時(shí)鐘信號進(jìn)行編碼。因此,接收時(shí)鐘信號必須由接收節(jié)點(diǎn)恢復(fù)并與發(fā)送器的時(shí)鐘同步

由于不同節(jié)點(diǎn)的振蕩器頻率和傳輸時(shí)間不同,接收器應(yīng)具有某種能與數(shù)據(jù)傳輸邊沿同步的鎖相環(huán)Phase LockLoop,PLL)來同步時(shí)鐘并保持這種同步。鑒于數(shù)據(jù)采用 NRZ 編碼,有必要進(jìn)行位填充以確保至少每 6 位時(shí)間發(fā)生一次邊沿,使數(shù)字鎖相環(huán)(Digital Phase LockLoop,DPLL)同步。

波特率

CAN 總線上的所有器件都必須使用相同的比特率。然而,并非所有器件都要求具有相同的主振蕩器時(shí)鐘頻率。對于采用不同時(shí)鐘頻率的器件,應(yīng)通過適當(dāng)設(shè)置波

特率預(yù)分頻比以及每一時(shí)間段中的時(shí)間份額的數(shù)量來對比特率進(jìn)行調(diào)整。

求波特率過程:配置CNF1得到TQà配置CNF2/3得到tbità求倒數(shù)得到波特率。

位時(shí)間

CAN位時(shí)間由互不重疊的時(shí)間段組成。 每個(gè)時(shí)間段又由時(shí)間份額(TQ)組成, CAN 規(guī)范中,標(biāo)稱比特率 NominalBit Rate,NBR)定義為在不需要再同步的情況下,理想發(fā)送器每秒發(fā)送的位數(shù)。

標(biāo)稱比特率NBR----圖片6.jpg

標(biāo)稱位時(shí)間NBT----圖片7.jpg時(shí)間段之和

TQ時(shí)間份額TQ = 2 x (BRP + 1)/FOSC

位時(shí)間各段如下:(與NBT四段對應(yīng))

圖片8.jpg 

其中同步段固定1TQ,其他三段為可編程的。

------------------------

6  電氣特性

顯性電平對應(yīng)邏輯 0,CAN_H 和 CAN_L 之差為 2.5V 左右。而隱性電平對應(yīng)邏輯 1,CAN_H 和 CAN_L 之差為 0V。在總線上顯性電平具有優(yōu)先權(quán),只要有一個(gè)單元輸出顯性電平,總線上即為顯性電平。而隱形電平則具有包容的意味,只有所有的單元都輸出隱性電平,總線上才為隱性電平(顯性電平比隱性電平更強(qiáng))。另外,在CAN 總線的起止端都有一個(gè)120Ω的終端電阻,來做阻抗匹配,以減少回波反射。

圖片9.jpg 

CAN技術(shù)標(biāo)準(zhǔn)

CAN協(xié)議經(jīng)過ISO標(biāo)準(zhǔn)化后有兩個(gè)標(biāo)準(zhǔn): ISO11898標(biāo)準(zhǔn)和ISO11519-2標(biāo)準(zhǔn)。其中ISO11898是針對通信速率為125Kbps~1Mbps的高速通信標(biāo)準(zhǔn),而ISO11519-2是針對通信速率為125Kbps以下的低速通信標(biāo)準(zhǔn)。

7  工作模式

>>利用CANCTRL. REQOP位可進(jìn)行工作模式的選擇

>>改變工作模式時(shí),新的工作模式須等到所有當(dāng)前報(bào)文發(fā)送完畢之后才生效。 

>>必須通過讀取CANSTAT.OPMODE位來驗(yàn)證新的工作模式。

1)配置模式:

MCP2515 在正常運(yùn)行之前必須進(jìn)行初始化。只有在配置模式下,才能對器件進(jìn)行初始化。在上電或復(fù)位時(shí),器件會(huì)自動(dòng)進(jìn)入配置模式, CANTRL.REQOP<2:0>設(shè)置成100”也可使器件從任何模式進(jìn)入配置模式。

2)休眠模式:

MCP2515 具有內(nèi)部休眠模式,使器件功耗最少。即使MCP2515處于休眠模式,SPI接口仍然保持正常的讀操作,以允許訪問器件內(nèi)的所有寄存器。

3)僅監(jiān)聽模式:

僅監(jiān)聽模式使MCP2515 可以接收包括錯(cuò)誤報(bào)文在內(nèi)的所有報(bào)文。這種模式可用于總線監(jiān)視應(yīng)用或熱插拔狀況下的波特率檢測。

4)環(huán)回模式:

環(huán)回模式允許器件內(nèi)部的發(fā)送緩沖器和接收緩沖器之間進(jìn)行報(bào)文的自發(fā)自收,而無需通過 CAN 總線。此模式可用于系統(tǒng)開發(fā)和測試。

5)正常模式:

該模式為 MCP2515 的標(biāo)準(zhǔn)工作模式。器件處于此模式下,會(huì)主動(dòng)監(jiān)視總線上的所有報(bào)文,并產(chǎn)生確認(rèn)位和錯(cuò)誤幀等。只有在正常模式下,MCP2515才能在 CAN總線上進(jìn)行報(bào)文的傳輸。

8  SPI指令集

---------通過SPI接口直接寫指令即可,比如通過指令復(fù)位。

圖片10.jpg 

9  過濾器

圖片11.jpg 

--------只有一種模式(即相當(dāng)于STM32中的屏蔽位模式)。

--------過濾器與屏蔽器是配合使用的,不是單獨(dú)使用的。

--------緩沖器+過濾器+屏蔽器à報(bào)文ID必須至少與一個(gè)過濾器匹配,即與過濾器中一些位(對應(yīng)屏蔽器中為1的位)完全相同。

--------兩個(gè)組合:

組合一:緩沖器1+屏蔽器1+過濾器1/2。

組合二:緩沖器2+屏蔽器2+過濾器3/4/5/6。

--------過濾器與緩沖器都是4Bytes,分別是SIDH/SIDL/EID8/EID0。

10  中斷

MCP2515有八個(gè)中斷源。CANINTE寄存器包含了使能各中斷源的中斷使能位。 CANINTF 寄存器包含了各中斷源的中斷標(biāo)志位。當(dāng)發(fā)生中斷時(shí), INT 引腳將被

MCP2515拉為低電平, 并保持低電平狀態(tài)直至MCU清除中斷。中斷只有在引起相應(yīng)中斷的條件消失后,才會(huì)被清除。

建議在對 CANINTF 寄存器中的標(biāo)志位進(jìn)行復(fù)位操作時(shí),采用位修改命令而不要使用一般的寫操作。這是為了避免在寫命令執(zhí)行過程中無意間修改了標(biāo)志位,進(jìn)而導(dǎo)致中斷丟失。應(yīng)該注意的是,CANINTF中的中斷標(biāo)志位是可讀寫位因此在相關(guān) CANINTE 中斷使能位置 1 的前提下,對上述任一位置 1均可使 MCU產(chǎn)生中斷請求。

----CANINTE使能CANINTF標(biāo)志都是8位,并且各位是一一對應(yīng)的。

11  寄存器簡介

圖片12.jpg 

(1) BFPCTRL---RXnBF引腳控制寄存器和狀態(tài)寄存器---對應(yīng)接收中斷引腳;

TXRTSCTRL---TXnRTS引腳控制狀態(tài)寄存器---對應(yīng)發(fā)送請求引腳。

2)CANSTAT/CTRL----CAN狀態(tài)和控制寄存器。

3)CANINTF/INTE----CAN中斷標(biāo)志和使能寄存器。

4)REC---接收錯(cuò)誤計(jì)數(shù)器;TEC---發(fā)送錯(cuò)誤計(jì)數(shù)器;EFLG---錯(cuò)誤標(biāo)志寄存器。

REC---receive error counter;EFLG---error flag。

5)CNF1/2/3----配置寄存器----用于位定時(shí)/波特率配置。

6)TXBnCTRL----發(fā)送緩沖器n控制寄存器。

7)RXBnCTRL----接收緩沖器n控制寄存器。

12  MCP2515的SPI詳解

(1) 模式MCP2515 設(shè)計(jì)可與許多單片機(jī)的串行外設(shè)接口(SPI)直接相連,支持 0,0 和 1,1 運(yùn)行模式。外部數(shù)據(jù)和命令通過 SI引腳傳送到器件中,且數(shù)據(jù)在 SCK時(shí)鐘信號的上升沿傳送進(jìn)去。MCP2515 在SCK的下降沿通過 SO引腳傳送出去。在進(jìn)行任何操作時(shí), CS 引腳都必須保持為低電平。

(2) CSCS 引腳被設(shè)置為低電平后,MCP2515希望收到的第一個(gè)字節(jié)是指令/命令字節(jié)。這意味著CS引腳必須先拉升為高電平然后再降為低電平以調(diào)用另外一個(gè)命令----有待驗(yàn)證(時(shí)序圖與此不一致)。

注意:此處經(jīng)過驗(yàn)證發(fā)現(xiàn)時(shí)序圖是正確的文字描述不正確(可能是翻譯的緣故),

結(jié)論

  一、看中文翻譯的datasheet,以時(shí)序圖為準(zhǔn),因?yàn)闀r(shí)序圖是復(fù)制而來的。

二、查看P65的時(shí)序圖可知---各個(gè)指令大多包含多個(gè)指令數(shù)據(jù)的讀寫,在整個(gè)讀寫過程中CS一直保持為低,直到完成整個(gè)指令CS才能變?yōu)?。

(3) 指令詳解

>>復(fù)位指令:復(fù)位指令為單字節(jié)指令。應(yīng)先將CS引腳0選中器件,隨后發(fā)送命令字節(jié),發(fā)送完畢之后再將CS引腳1。強(qiáng)烈建議將發(fā)送復(fù)位指令(或?qū)?/span>RESET 引腳置為低電平)作為器件上電初始化過程中的一部分。

>>讀指令

CS引腳置為低電平來啟動(dòng)讀指令。隨后向MCP2515依次發(fā)送讀指令 8 位地址碼 A7 至 A0)。在接收到讀指令和地址碼之后, MCP2515 會(huì)將指定地址寄存器中的數(shù)據(jù)通過 SO引腳移出。

每一數(shù)據(jù)字節(jié)移出后,器件內(nèi)部的地址指針將自動(dòng)加一以指向下一個(gè)地址。因此,通過持續(xù)提供時(shí)鐘脈沖,可以對下一個(gè)連續(xù)地址寄存器進(jìn)行讀操作。通過該方法可以順序讀取任意個(gè)連續(xù)地址寄存器中的數(shù)據(jù)。通過拉高CS引腳電平可以結(jié)束讀操作。

>> RX 緩沖器指令

相比于讀指令----讀 RX緩沖器指令可以快速尋址要讀取的接收緩沖器。該指令使 SPI開銷減少了一個(gè)字節(jié)(地址字節(jié))

---指令碼為10010nm0ànm對應(yīng)兩個(gè)接收緩沖器---每個(gè)緩沖器對應(yīng)一幀數(shù)據(jù)----一幀數(shù)據(jù)包含標(biāo)準(zhǔn)ID/擴(kuò)展ID/DLC/數(shù)據(jù)(1-8Bytes)。

>>寫指令

CS引腳置為低電平來啟動(dòng)寫操作。隨后向MCP2515依次發(fā)送寫指令、地址碼和至少一個(gè)字節(jié)的數(shù)據(jù)(如果是多個(gè)數(shù)據(jù),其地址是連續(xù)的)。

>>裝載TX緩沖器指令

該指令取消了一般寫命令所需要的8 位地址。該8位指令將地址指針設(shè)置為6個(gè)地址之一,以便快速地將數(shù)據(jù)寫入發(fā)送緩沖器,該地址指向3個(gè)發(fā)送緩沖器之一的“ID”或 “數(shù)據(jù)”地址---每個(gè)緩沖器對應(yīng)一幀數(shù)據(jù)----一幀數(shù)據(jù)包含標(biāo)準(zhǔn)ID/擴(kuò)展ID/DLC/數(shù)據(jù)(1-8Bytes)。。

>>請求發(fā)送RTS)指令

使用RTS命令可以啟動(dòng)一個(gè)或多個(gè)發(fā)送緩沖器的報(bào)文發(fā)送。將CS引腳置為低電平來選中MCP2515。 之后向其發(fā)送RTS命令字節(jié)。該命令的3位顯示了哪些發(fā)送緩沖器被使能發(fā)送。該命令將緩沖器對應(yīng)的TxBnCTRL.TXREQ 位置1。用一條RTS命令即可對這三位中的一位或全部三位1。如果發(fā)送的RTS命令中nnn =000,將忽略該命令----三個(gè)n對應(yīng)三個(gè)發(fā)送發(fā)送緩沖器。

>>讀狀態(tài)指令

讀狀態(tài)指令允許單條指令訪問常用的報(bào)文接收和發(fā)送狀態(tài)位。

>>RX狀態(tài)指令

RX 狀態(tài)指令用于快速確定與報(bào)文和報(bào)文類型(標(biāo)準(zhǔn)幀、擴(kuò)展幀或遠(yuǎn)程幀)相匹配的濾波器。命令字節(jié)發(fā)送后,控制器會(huì)返回包含狀態(tài)信息的 8 位數(shù)據(jù)。

>>位修改指令

位修改指令可對特定狀態(tài)和控制寄存器中單獨(dú)的位進(jìn)行置1或清零。該命令并非所有寄存器有效。 MCP2515發(fā)送位修改命令字節(jié)。命令字節(jié)發(fā)送后,依次發(fā)送寄存器地址、屏蔽字節(jié)以及數(shù)據(jù)字節(jié)。屏蔽字節(jié)確定允許修改寄存器中的哪一位。屏蔽字節(jié)中的1”表示允許對寄存器中的相應(yīng)位進(jìn)行修改;而0”禁止修改。

13  初始化詳解

(1) 復(fù)位:

MCP2515 有兩種復(fù)位方式

1)硬件復(fù)位——RESET引腳為低電平。

2)SPI復(fù)位——通過 SPI命令復(fù)位---畢業(yè)設(shè)計(jì)采用指令復(fù)位。

(2) 進(jìn)入配置模式---初始化配置

1)在上電或復(fù)位時(shí),器件會(huì)自動(dòng)進(jìn)入配置模式, 或通過CANTRL.REQOP

設(shè)置成100”也可使器件從任何模式進(jìn)入配置模式。

2) 改變工作模式時(shí),新的工作模式須等到所有當(dāng)前報(bào)文發(fā)送完畢之后才生效。 必須通過讀取CANSTAT.OPMODE位來驗(yàn)證新的工作模式。

3) 進(jìn)入配置模式時(shí),所有錯(cuò)誤計(jì)數(shù)器都被清零只有在配置模式下,才能對以下寄存器進(jìn)行修改:

? CNF1、 CNF2 和CNF3

? TXRTSCTRL

? 驗(yàn)收過濾寄存器

? 驗(yàn)收屏蔽寄存器

(3) 配置波特率

---具體看位定時(shí)和波特率的詳解。

(4) 配置發(fā)送

1) TXnRTS引腳配置----配置用來禁用三個(gè)發(fā)送請求引腳。

其余的配置不需要在初始化時(shí)配置---發(fā)送時(shí)再配置也行

2) TXBnCTRL---配置報(bào)文發(fā)送請求優(yōu)先級。

3)標(biāo)準(zhǔn)ID和擴(kuò)展ID配置---4個(gè)寄存器。

4)TXBnDLC----報(bào)文類型(數(shù)據(jù)幀或請求幀)和數(shù)據(jù)長度(DLC)配置。

5)發(fā)送緩沖器數(shù)據(jù)字節(jié)----(08個(gè)字節(jié))。

(5) 配置接收

---配置RXB0CTRL——接收緩沖器 0/1控制寄存器

---配置BFPCTRL——RXnBF引腳控制寄存器和狀態(tài)寄存器;

---配置報(bào)文驗(yàn)收濾波器(RXFn)及屏蔽寄存器(RXMn---見上面詳解。

(6) 配置中斷

---CANINTF---中斷標(biāo)志位初始化時(shí)清零。

---CANINTE---使能位(最常用的為使能接收中斷)。

(7) 配置模式

---正常模式-------收發(fā)用;

---回環(huán)模式-------測試用;

14  MCP2515發(fā)送函數(shù)詳解

---至少須將 TXBnSIDH、TXBnSIDL和 TXBnDLC 寄存器裝載數(shù)據(jù)---包含ID、數(shù)據(jù)長度(字節(jié)數(shù))和幀類型。

---如果報(bào)文包含數(shù)據(jù)字節(jié),還需要對 TXBnDm寄存器進(jìn)行裝載。

---若報(bào)文采用擴(kuò)展標(biāo)識符,對TXB-nEIDm寄存器進(jìn)行裝載,并將TXBnSIDL.EXIDE 位置1。

---在報(bào)文發(fā)送之前,MCU應(yīng)對 CANINTE.TXInE位進(jìn)行初始化,以便在報(bào)文發(fā)送時(shí)使能或禁止中斷的產(chǎn)生。

15  MCP2515接收函數(shù)詳解

---RXBnDLC---判斷接收到的數(shù)據(jù)的字節(jié)數(shù)幀類型。

---接收信息包含ID/擴(kuò)展ID、幀類型、長度DLC和數(shù)據(jù)。

---RXB0CTRL---在初始化時(shí)進(jìn)行配置即可。

16  MCP2515中斷函數(shù)詳解

---使能外中斷。

---使能CAN中斷MCP2515有八個(gè)中斷源)。

---初始化時(shí)對中斷標(biāo)志位清零。

---ISR中讀中斷標(biāo)志判斷中斷源,然后進(jìn)行相應(yīng)的操作。

圖片13.jpg圖片14.jpg

圖片15.jpg

審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

三格電子智慧農(nóng)業(yè)-溫室大棚智能控制系統(tǒng)

LORA+4G無線組網(wǎng)方案

天津三格電子基于HART協(xié)議的應(yīng)用

三格電子基于物聯(lián)網(wǎng)云網(wǎng)關(guān)+云平臺方案

485通信問題、解決方法及基本原理講解