三格電子CAN學(xué)習(xí)筆記
CAN理論概述
1..CAN的分層結(jié)構(gòu)(依照OSI標(biāo)準(zhǔn)):
--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-1Mbps的CAN 高速通信標(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)系:
CANOPEN協(xié)議
1 工作層:
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é)議:
CAL(CAN 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 STM32—bxCAN:是基本擴(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.0A—11位ID),而擴(kuò)展標(biāo)準(zhǔn)(CAN2.0B—29位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í)器、看門狗、bxCAN和I2C的調(diào)試
當(dāng)微控制器處于調(diào)試模式時(shí),Cortex-M3核心處于暫停狀態(tài),依據(jù)下述配置位的狀態(tài),bxCAN可以繼續(xù)正常工作或停止工作:
● 調(diào)試(DBG)模塊中的調(diào)試MCU配置寄存器DBGMCU_CR的CAN1的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寄存器的RQCP和TXOK位置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)的FIFO0或FIFO1中。
(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è)置圖表如下:
波特率設(shè)置:
波特率最高可達(dá)1Mb/S。
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ú)立控制器-----------------------
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----
標(biāo)稱位時(shí)間:NBT----(時(shí)間段之和)
TQ時(shí)間份額:TQ = 2 x (BRP + 1)/FOSC
位時(shí)間各段如下:(與NBT四段對應(yīng))
其中同步段固定為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Ω的終端電阻,來做阻抗匹配,以減少回波反射。
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ù)位。
9 過濾器:
--------只有一種模式(即相當(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 寄存器簡介:
(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) CS:CS 引腳被設(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é)----(0—8個(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)的操作。
提交
三格電子智慧農(nóng)業(yè)-溫室大棚智能控制系統(tǒng)
LORA+4G無線組網(wǎng)方案
天津三格電子基于HART協(xié)議的應(yīng)用
三格電子基于物聯(lián)網(wǎng)云網(wǎng)關(guān)+云平臺方案
485通信問題、解決方法及基本原理講解