工控網(wǎng)首頁
>

應用設(shè)計

>

三格電子CAN學習筆記

三格電子CAN學習筆記

2021/6/8 16:09:14

CAN理論概述

1..CAN的分層結(jié)構(gòu)(依照OSI標準):

圖片1.jpg 

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

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

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

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

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

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

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

2..CAN技術(shù)特點

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

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

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

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

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

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

隔離出去。

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

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

9)錯誤檢測/通知/恢復功能: 

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

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

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

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

3..標準協(xié)議:

ISO標準化的CAN協(xié)議

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

(1)  關(guān)于ISO11898

ISO11898 是通信速度為 125kbps-1MbpsCAN 高速通信標準。

目前,ISO11898 追加新規(guī)約后,成為 ISO11898-1 新標準。

(2)  關(guān)于 ISO11519

ISO11519 是通信速度為 125kbps以下 CAN 低速通信標準。

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

總結(jié)

>>兩種標準物理層不同,數(shù)據(jù)鏈路層相同。

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

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

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

>>課題所用到的PCA82C250、VP230以及TJA1050都支持ISO11898標準。

PCA82C252與TJA1053支持ISO11519-2標準。

4.. 錯誤

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

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

(1)  主動錯誤狀態(tài) 

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

處于主動錯誤狀態(tài)的單元檢測出錯誤時,輸出主動錯誤標志。 

(2)  被動錯誤狀態(tài)

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

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

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

處于被動錯誤狀態(tài)的單元檢測出錯誤時,輸出被動錯誤標志。 

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

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

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

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

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

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

圖片2.jpg 

CANOPEN協(xié)議

工作層

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

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

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

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

2  應用

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

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

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

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

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

基于STM32的CAN

輪詢=查詢

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

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

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

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

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

接收FIFO

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

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

4 bxCAN工作模式

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

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

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

5 bxCAN測試模式

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

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

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

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

當微控制器處于調(diào)試模式時,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:當內(nèi)核進入調(diào)試狀態(tài)時,CAN2停止運行。

0:CANx仍然正常運行;

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

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

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

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

7 發(fā)送處理

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

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

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

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

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

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

CAN主控制寄存器:

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

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

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

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

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

9 接收管理

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

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

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

>>CAN_RFR寄存器的FOVR位進行置’1’----------表明溢出

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

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

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

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

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

10 標識符過濾

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

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

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

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

0: 過濾器組x的2個32位寄存器工作在標識符屏蔽位模式;

1: 過濾器組x的2個32位寄存器工作在標識符列表模式。

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

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

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

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

0:過濾器位寬為2個16位;

1:過濾器位寬為單個32位

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

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

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

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

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

>>標識符模式

寄存器的每位對應于所期望的標識符的相應位的電平。

0: 期望相應位為顯性位;

1: 期望相應位為隱性位。

屏蔽位模式

寄存器的每位指示是否對應的標識符寄存器位一定要與期望的標識符的相應位一致。

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

1: 必須匹配,到來的標識符位必須與濾波器對應的標識符寄存器位相一致。

屏蔽位舉例:(標準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時存在一位的位差;即StdID的最高位為無效MaskID需要右移一位與StdID對齊。

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

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

圖片3.jpg 

波特率設(shè)置

波特率最高可達1Mb/S。

圖片4.jpg 

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

tPCLK = 1/PCLK1=1/36MHz 。

tBS1 0-15共16種可選值 。

tBS2 0-7共8種可選值 。

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

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

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

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

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

      CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時間觸發(fā)通信模式       CAN_InitStructure.CAN_ABOM=DISABLE;       CAN_InitStructure.CAN_AWUM=DISABLE;       CAN_InitStructure.CAN_NART=DISABLE;//CAN報文只被發(fā)送1次,不管發(fā)送的結(jié)果如何(成功、出錯或仲裁丟失)       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è)置為標識符屏蔽模式       CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//給出過濾器位寬為32位

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

1、對擴展數(shù)據(jù)幀進行過濾:(只接收擴展數(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; (注:標準幀數(shù)據(jù)幀、標準遠程幀和擴展遠程幀均被過濾) 2、對擴展遠程幀過濾:(只接收擴展遠程幀)       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、對標準遠程幀過濾:(只接收標準遠程幀)       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、對標準數(shù)據(jù)幀過濾:(只接收標準數(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、對擴展幀進行過濾:(擴展幀不會被過濾掉)       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、對標準幀進行過濾:(標準幀不會被過濾掉)       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獨立控制器-----------------------

圖片5.jpg 

1  簡介

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

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

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

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

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

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

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

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

4  CAN報文幀

1)標準數(shù)據(jù)幀

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

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

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

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

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

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

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

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

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

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

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

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

SRR和lDE位之后是標識符的其余18位(擴展lD 及一個遠程發(fā)送請求位。

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

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

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

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

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

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

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

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

當帶有相同標識符的數(shù)據(jù)幀和遠程幀同時發(fā)出時,數(shù)據(jù)幀將贏得仲裁,因為其標識符后面的 RTR 位為顯性。這樣,可使發(fā)送遠程幀的節(jié)點立即收到所需數(shù)據(jù)。

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

幀起始、仲裁場、控制場、CRC 場、應答場、幀末尾。

4)錯誤幀

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

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

5)過載幀:

過載幀包括兩個位場:過載標志和過載界定符。

有兩種過載條件都會導致過載標志的傳送:

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

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

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

>>過載標志由6個顯性位組成--------------所有形式和主動錯誤標志的一樣。

>>過載界定符包括8個隱性位----過載界定符的形式和錯誤界定符的形式一樣。

6)幀間間隔

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

5  位定時與波特率

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

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

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

波特率

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

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

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

位時間

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

標稱比特率NBR----圖片6.jpg

標稱位時間NBT----圖片7.jpg時間段之和

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

位時間各段如下:(與NBT四段對應)

圖片8.jpg 

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

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

6  電氣特性

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

圖片9.jpg 

CAN技術(shù)標準

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

7  工作模式

>>利用CANCTRL. REQOP位可進行工作模式的選擇。

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

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

1)配置模式:

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

2)休眠模式:

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

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

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

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

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

5)正常模式:

該模式為 MCP2515 的標準工作模式。器件處于此模式下,會主動監(jiān)視總線上的所有報文,并產(chǎn)生確認位和錯誤幀等。只有在正常模式下,MCP2515才能在 CAN總線上進行報文的傳輸。

8  SPI指令集

---------通過SPI接口直接寫指令即可,比如通過指令復位

圖片10.jpg 

9  過濾器

圖片11.jpg 

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

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

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

--------兩個組合:

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

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

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

10  中斷

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

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

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

----CANINTE使能CANINTF標志都是8位,并且各位是一一對應的。

11  寄存器簡介

圖片12.jpg 

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

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

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

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

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

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

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

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

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

12  MCP2515的SPI詳解

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

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

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

結(jié)論

  一、看中文翻譯的datasheet,以時序圖為準,因為時序圖是復制而來的。

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

(3) 指令詳解

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

>>讀指令

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

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

>> RX 緩沖器指令

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

---指令碼為10010nm0ànm對應兩個接收緩沖器---每個緩沖器對應一幀數(shù)據(jù)----一幀數(shù)據(jù)包含標準ID/擴展ID/DLC/數(shù)據(jù)(1-8Bytes)。

>>寫指令

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

>>裝載TX緩沖器指令

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

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

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

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

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

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

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

>>位修改指令

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

13  初始化詳解

(1) 復位:

MCP2515 有兩種復位方式

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

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

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

1)在上電或復位時,器件會自動進入配置模式, 或通過CANTRL.REQOP

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

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

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

? CNF1、 CNF2 和CNF3

? TXRTSCTRL

? 驗收過濾寄存器

? 驗收屏蔽寄存器

(3) 配置波特率

---具體看位定時和波特率的詳解。

(4) 配置發(fā)送

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

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

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

3)標準ID和擴展ID配置---4個寄存器。

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

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

(5) 配置接收

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

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

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

(6) 配置中斷

---CANINTF---中斷標志位初始化時清零。

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

(7) 配置模式

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

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

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

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

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

---若報文采用擴展標識符,對TXB-nEIDm寄存器進行裝載,并將TXBnSIDL.EXIDE 位置1。

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

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

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

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

---RXB0CTRL---在初始化時進行配置即可。

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

---使能外中斷。

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

---初始化時對中斷標志位清零

---ISR中讀中斷標志判斷中斷源,然后進行相應的操作。

圖片13.jpg圖片14.jpg

圖片15.jpg

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

提交

查看更多評論
其他資訊

查看更多

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

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

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

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

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