三格電子CAN學習筆記
CAN理論概述
1..CAN的分層結構(依照OSI標準):
--CAN與以太網類似---包含最底的兩層(物理層和數據鏈路層)。
--另外還包含傳輸層---用于發送控制(單次觸發或發送失敗時永久重發)。
--應用層即為發送接收相關的發送/接收函數、中斷及數據的處理。
--因此雖然標準CAN不包含OSI中的七層,但也可以構成簡易的網絡,
-- CANopen是一種架構在控制局域網路(Control Area Network, CAN)上的高層通訊協定,包括通訊子協定及設備子協定常在嵌入式系統中使用,也是工業控制常用到的一種現場總線。
CANopen實作了OSI模型中的網絡層以上(包括網絡層)的協定。CANopen標準包括尋址方案、數個小的通訊子協定及由設備子協定所定義的應用層。 CANopen 支援網絡管理、設備監控及節點間的通訊,其中包括一個簡易的傳輸層,可處理資料的分段傳送及其組合。一般而言資料鏈結層及實體層會用CAN來實作。除了CANopen外,也有其他的通訊協定(如EtherCAT)實作CANopen的設備子協定。
--CAN與CANOPEN是兩種協議,沒有CANOPEN也可以組成CAN網絡及應用。
--CAN+CANOPEN組成較完整的OSI;這類似于TCP/IP+以太網組成互聯網。
--從OSI網絡模型的角度來看同,現場總線網絡一般只實現了第1層(物理層)、第2層(數據鏈路層)、第7層(應用層)。因為現場總線通常只包括一個網段,因此不需要第3層(傳輸層)和第4層(網絡層),也不需要第5層(會話層)第6層(描述層)的作用。
2..CAN技術特點:
(1)工作方式:CAN為多主方式工作,網絡上任一節點均可在任意時刻主動地向網絡上其他節點發送信息,而不分主從,通信方式靈活,且無需站地址等節點信息。
(2)消息的發送:CAN網絡上的節點信息分成不同的優先級,可滿足不同的實時要求,高優先級的數據最多可在134us內得到傳輸。
(3)仲裁:CAN采用非破壞性總線仲裁技術,大大節省了總線沖突仲裁時間。尤其是在網絡負載很重的情況下也不會出現網絡癱瘓情況(以太網則可能)。
(4)系統的柔軟性:與總線相連的單元沒有類似于“地址”的信息。因此在總線上增加單元時,連接在總線上的其它單元的軟硬件及應用層都不需要改變。
(5)連接:CAN 總線是可同時連接多個單元的總線。可連接的單元總數理論上是沒有限制的。但實際上可連接的單元數受總線上的時間延遲及電氣負載的限制。降低通信速度,可連接的單元數增加;提高通信速度,則可連接的單元數減少。
(6)故障封閉: CAN 可以判斷出錯誤的類型是總線上暫時的數據錯誤(如外部噪聲等)還是持續的數據錯誤(如單元內部故障、驅動器故障、斷線等)。由此功能,當總線上發生持續數據錯誤時,可將引起此故障的單元從總線上
隔離出去。
(7)通信速度:根據整個網絡的規模,可設定適合的通信速度。在同一網絡中,所有單元必須設定成統一的通信速度。即使有一個單元的通信速度與其它的不一樣,此單元也會輸出錯誤信號,妨礙整個網絡的通信。不同網絡間則可以有不同的通信速度。
(8)遠程數據請求:可通過發送“遙控幀/遠程幀”請求其他單元發送數據。
(9)錯誤檢測/通知/恢復功能:
所有的單元都可以檢測錯誤(錯誤檢測功能)。
檢測出錯誤的單元會立即同時通知其他所有單元(錯誤通知功能)。
正在發送消息的單元一旦檢測出錯誤,會強制結束當前的發送。強制結束發送的單元會不斷反復地重新發送,此消息直到成功發送為止(錯誤恢復功能)。
(10)CRC校驗:CAN的每幀信息都有CRC校驗及其他檢錯措施,保證了數據出錯率極低。
3..標準協議:
ISO標準化的CAN協議
CAN協議經ISO標準化后有ISO11898標準和ISO11519-2標準兩種。ISO11898和ISO11519-2標準對于數據鏈路層的定義相同,但物理層不同。
(1) 關于ISO11898
ISO11898 是通信速度為 125kbps-1Mbps的CAN 高速通信標準。
目前,ISO11898 追加新規約后,成為 ISO11898-1 新標準。
(2) 關于 ISO11519
ISO11519 是通信速度為 125kbps以下的 CAN 低速通信標準。
ISO11519-2 是 ISO11519-1 追加新規約后的版本。
總結:
>>兩種標準物理層不同,數據鏈路層相同。
>>數據鏈路層對應控制器;物理層對應收發器。
>>CAN2.0A/B的區別是ID位數不同---數據鏈路層(控制器)不同。
>>ISO11898與ISO11519-2的區別是物理層(收發器)的不同。
>>課題所用到的PCA82C250、VP230以及TJA1050都支持ISO11898標準。
PCA82C252與TJA1053支持ISO11519-2標準。
4.. 錯誤:
--------錯誤狀態的種類
單元始終處于 3 種狀態之一。
(1) 主動錯誤狀態:
主動錯誤狀態是可以正常參加總線通信的狀態。
處于主動錯誤狀態的單元檢測出錯誤時,輸出主動錯誤標志。
(2) 被動錯誤狀態:
被動錯誤狀態是易引起錯誤的狀態。
處于被動錯誤狀態的單元雖能參加總線通信,但為不妨礙其它單元通信,接收時不能積極地發送錯誤通知。
處于被動錯誤狀態的單元即使檢測出錯誤,而其它處于主動錯誤狀態的單元如果沒發現錯誤,整個總線也被認為是沒有錯誤的。
處于被動錯誤狀態的單元檢測出錯誤時,輸出被動錯誤標志。
另外,處于被動錯誤狀態的單元在發送結束后不能馬上再次開始發送。在開始下次發送前,在間隔幀期間內必須插入“延遲傳送”(8 個位的隱性位)。
(3) 總線關閉狀態:
總線關閉態是不能參加總線上通信的狀態。
信息的接收和發送均被禁止。
這些狀態依靠發送錯誤計數和接收錯誤計數來管理,根據計數值決定進入何種狀態。
--------錯誤狀態和計數值關系:
CANOPEN協議
1 工作層:
CAN只定義物理層和數據鏈路層,沒有規定應用層,本身并不完整,需要一個高層協議來定義CAN報文中的11/29位標識符、8字節數據的使用。而且,基于CAN總線的工業自動化應用中,越來越需要一個開放的、標準化的高層協議:這個協議支持各種CAN廠商設備的互用性、互換性,能夠實現在CAN網絡中提供標準的、統一的系統通訊模式,提供設備功能描述方式,執行網絡管理功能。
a)應用層(Application layer):為網絡中每一個有效設備都能夠提供一組有用的服務與協議。
b)通訊描述(Communication profile):提供配置設備、通訊數據的含義,定義數據通訊方式。
c)設備描述(Device proflile):為設備(類)增加符合規范的行為。
2 應用:
CANopen協議。CANopen協議是CAN-in-Automation(CiA)定義的標準之一,并且在發布后不久就獲得了廣泛的承認。尤其是在歐洲,CANopen協議被認為是在基于CAN的工業系統中占領導地位的標準。大多數重要的設備類型,例如數字和模擬的輸入輸出模塊、驅動設備、操作設備、控制器、可編程控制器或編碼器,都在稱為“設備描述”的協議中進行描述;“設備描述”定義了不同類型的標準設備及其相應的功能。依靠CANopen協議的支持,可以對不同廠商的設備通過總線進行配置。
3 CAL協議 與CANOPEN協議:
CAL(CAN Application Layer)協議是目前基于CAN的高層通訊協議中的一種,最早由Philips醫療設備部門制定。
CANopen是在 CAL基礎上開發的,使用了CAL通訊和服務協議子集,提供了分布式控制系統的一種實現方案。CANopen在保證網絡節點互用性的同時允許節點的功能隨意擴展:或簡單或復雜。
CANopen的核心概念是設備對象字典(OD:Object Dictionary),在其它現場總線(Profibus,Interbus-S)系統中也使用這種設備描述形式。注意:對象字典不是CAL的一部分,而是在CANopen中實現的。
基于STM32的CAN
輪詢=查詢
1 STM32—bxCAN:是基本擴展CAN(Basic Extended CAN)的縮寫,它支持CAN協議2.0A和2.0B。它的設計目標是,以最小的CPU負荷來高效處理大量收到的報文。它也支持報文發送的優先級要求(優先級特性可軟件配置)。對于安全緊要的應用,bxCAN提供所有支持時間觸發通信模式所需的硬件功能。
2 CAN--2.0A和2.0B: CAN2.0A為標準格式,CAN2.0B為擴展格式,報文標識符可達2032種(CAN2.0A—11位ID),而擴展標準(CAN2.0B—29位ID)的報文標識符幾乎不受限制;CAN2.0規范兼容CAN 1.2 規范。
3 發送郵箱和接收過濾器:
>>共有3個發送郵箱供軟件來發送報文。發送調度器根據優先級決定哪個郵箱的報文先被發送。
>>在互聯型產品中,bxCAN提供28個位寬可變/可配置的標識符過濾器組,軟件通過對它們編程,從而在引腳收到的報文中選擇它需要的報文,而把其它報文丟棄掉。在其它STM32F103xx系列產品中有14個位寬可變/可配置的標識符過濾器組。
接收FIFO:
共有2個接收FIFO,每個FIFO都可以存放3個完整的報文---共六個報文。它們完全由硬件來管理。
注:互聯型產品是指STM32F105xx和STM32F107xx微控制器。
4 bxCAN工作模式:
(1) 初始化模式:bxCAN處于初始化模式時,禁止報文的接收和發送,并且CANTX引腳輸出隱性位(高電平)。 初始化模式的進入,不會改變配置寄存器。
(2) 正常模式:可以正常的接收和發送報文。
(3) 睡眠模式:低功耗模式,bxCAN的時鐘停止了,但軟件仍然可以訪問郵箱寄存器。
5 bxCAN測試模式:
(1) 靜默模式:在靜默模式下,bxCAN可以正常地接收數據幀和遠程幀,但只能發出隱性位,而不能真正發送報文----靜默模式通常用于分析CAN總線的活動,而不會對總線造成影響-顯性位(確認位、錯誤幀)不會真正發送到總線上。
(2) 環回模式:在環回模式下,bxCAN把發送的報文當作接收的報文并保存(如果可以通過接收過濾)在接收郵箱里---用于自測試,但是發送的報文可以在CANTX引腳上檢測到。
(3) 靜默環回:用于“熱自測試”,即可以像環回模式那樣測試bxCAN,但卻不會影響CANTX和CANRX所連接的整個CAN系統。在環回靜默模式下,CANRX引腳與CAN總線斷開,同時CANTX引腳被驅動到隱性位狀態。
6 調試DBG:支持定時器、看門狗、bxCAN和I2C的調試
當微控制器處于調試模式時,Cortex-M3核心處于暫停狀態,依據下述配置位的狀態,bxCAN可以繼續正常工作或停止工作:
● 調試(DBG)模塊中的調試MCU配置寄存器DBGMCU_CR的CAN1的DBG_CAN1_STOP位或CAN2的DBG_CAN2_STOP位。DBG_CANx_STOP:當內核進入調試狀態時,CAN2停止運行。
0:CANx仍然正常運行;
1:CANx的接收寄存器不繼續接收數據。
● CAN_MCR(CAN主控制寄存器)中的DBF位(位16):
0:在調試時,CAN照常工作
1:在調試時,凍結CAN的接收/發送。仍然可以正常地讀寫和控制接收FIFO。
7 發送處理:
CAN發送郵箱標識符寄存器:
>>CAN_TIxR寄存器的TXRQ位置’1-----------請求發送。
CAN發送狀態寄存器:
>>CAN_TSR寄存器的RQCP和TXOK位置1----來表明一次成功發送。
>>CAN_TSR寄存器的ALST位置’1’---------仲裁引起,TERR位置’1’-----發送錯誤。
>>CAN_TSR寄存器的ABRQ位置’1’-------中止發送請求:
CAN主控制寄存器:
>>CAN_MCR寄存器的TXFP位置’1’-------把發送郵箱配置為發送FIFO。
>>CAN_MCR寄存器的NART位置’1’-------禁止自動重傳模式。
8 時間觸發通信模式:
在該模式下,CAN硬件的內部定時器被激活,并且被用于產生(發送與接收郵箱的)時間戳(時間標記),分別存儲在CAN_RDTxR/CAN_TDTxR寄存器(接收/發送該報文SOF的時刻,16位定時器的值)中。內部定時器在每個CAN位時間累加。
內部定時器在接收和發送的幀起始位的采樣點位置被采樣,并生成時間戳。
9 接收管理:
接收到的報文,被存儲在3級郵箱深度的FIFO中。FIFO完全由硬件來管理,從而節省了CPU的處理負荷,簡化了軟件并保證了數據的一致性。應用程序只能通過讀取FIFO輸出郵箱,來讀取FIFO中最先收到的報文。
>>CAN_RFR(CAN接收FIFO寄存器)的FMP[1:0]------- 報文數目。
>>CAN_RFR寄存器的RFOM位設置’1’-------------釋放郵箱
>>CAN_RFR寄存器的FOVR位進行置’1’----------表明溢出
>>CAN_RFR寄存器的FULL位就被置’1’-----------FIFO已滿
接收中斷:CAN_IER-----中斷使能寄存器
>>CAN_IER寄存器的FMPIE位為’1’-------產生接收中斷請求(有報文)。
>>CAN_IER寄存器的FFIE位為’1’-----------產生滿中斷請求
>>CAN_IER寄存器的FOVIE位為’1’---------產生溢出中斷請求。
10 標識符過濾:
CAN協議里,報文的標識符不代表節點的地址,而是跟報文的內容相關的。因此,發送者以廣播的形式把報文發送給所有的接收者。節點在接收報文時根據標識符的值決定軟件是否需要該報文;如果需要,就拷貝到SRAM里;如果不需要,報文就被丟棄且無需軟件的干預。為滿足這一需求,在互聯型產品中,bxCAN控制器為應用程序提供了28個位寬可變的、可配置的過濾器組(27~0);在其它產品中,bxCAN控制器為應用程序提供了14個位寬可變的、可配置的過濾器組(13~0),以便只接收那些軟件需要的報文。硬件過濾的做法節省了CPU開銷,否則就必須由軟件過濾從而占用一定的CPU開銷。
(1) CAN過濾器模式寄存器(CAN_FM1R):與CAN_FiRx配合使用
標識符屏蔽位模式:在屏蔽位模式下,標識符寄存器和屏蔽寄存器一起,指定報文標識符的任何一位,應該按照“必須匹配”或“不用關心”處理。
標識符列表模式:在標識符列表模式下,屏蔽寄存器也被當作標識符寄存器用。因此,不是采用一個標識符加一個屏蔽位的方式,而是使用2個標識符寄存器。接收報文標識符的每一位都必須跟過濾器標識符相同。
0: 過濾器組x的2個32位寄存器工作在標識符屏蔽位模式;
1: 過濾器組x的2個32位寄存器工作在標識符列表模式。
>>為了過濾出一組標識符,應該設置過濾器組工作在屏蔽位模式。
>>為了過濾出一個標識符,應該設置過濾器組工作在標識符列表模式。
>>應用程序不用的過濾器組,應該保持在禁用狀態。
(2) 過濾器位寬(CAN_FS1R):配置各個過濾器組的位寬-------實際上只有兩種位寬:
0:過濾器位寬為2個16位;
1:過濾器位寬為單個32位。
>>2個16位:即高16位與低16位為兩個不同的過濾器。
(3)CAN 過濾器FIFO關聯寄存器(CAN_FFA1R):報文在通過了某過濾器的過濾后,將被存放到其關聯的FIFO0或FIFO1中。
(4) CAN 過濾器激活寄存器 (CAN_FA1R):在配置一個過濾器組前,必須通過清除CAN_FAR寄存器的FACT位,把它設置為禁用狀態-----先禁用后配置。
(5) CAN 過濾器組i的寄存器x(CAN_FiRx---包含32個過濾器位):互聯產品中i=0..27,其它產品中i=0..13;x=1..2。
>>只有在CAN_FAxR寄存器相應的FACTx位清0,或CAN_FMR寄存器的FINIT位為1時,才能修改相應的過濾器寄存器。
>>標識符模式
寄存器的每位對應于所期望的標識符的相應位的電平。
0: 期望相應位為顯性位;
1: 期望相應位為隱性位。
屏蔽位模式
寄存器的每位指示是否對應的標識符寄存器位一定要與期望的標識符的相應位一致。
0: 不關心,該位不用于比較;
1: 必須匹配,到來的標識符位必須與濾波器對應的標識符寄存器位相一致。
屏蔽位舉例:(標準ID)
有效位數
STDID 0xE0F x110 0000 1111 11
FilterID 0xF0F x111 0000 1111 11
MaskID 0xDFFF 110 1111 1111 1 12
----關鍵是Std/FilterID都只有11位有效位,都需要移位;而MaskID不存在移位,因此在根據發送的ID確定MaskID時存在一位的位差;即StdID的最高位為無效位—MaskID需要右移一位與StdID對齊。
>>CAN_FiR1始終為標示符寄存器,而CAN_FiR2與模式對應----可以為為標示符寄存器,也可以為屏蔽寄存器,因此標識符模式下有2個或4個(分別對應位寬為32和16)標示符寄存器。
----------過濾器組位寬設置圖表如下:
波特率設置:
波特率最高可達1Mb/S。
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總線的過濾器總結----------------------
關鍵:必須對標識符進行相應的移位---過濾器中的16/32位數不僅包含ID還包含IDE和IDR。
CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時間觸發通信模式 CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE;//CAN報文只被發送1次,不管發送的結果如何(成功、出錯或仲裁丟失) 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;//指定過濾器被設置為標識符屏蔽模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//給出過濾器位寬為32位
下面根據設置的參數不同來決定can總線can總線的配置情況:
1、對擴展數據幀進行過濾:(只接收擴展數據幀) 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; (注:標準幀數據幀、標準遠程幀和擴展遠程幀均被過濾) 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、對標準數據幀過濾:(只接收標準數據幀) 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獨立控制器-----------------------
1 簡介:
MCP2515 是一款獨立控制器局域網絡(Controller Area Network, CAN)協議控制器,完全支持 CAN V2.0B 技術規范。該器件能發送和接收標準和擴展數據幀以及遠程幀。MCP2515 自帶的兩個驗收屏蔽寄存器和六個驗收濾波寄存器可以過濾掉不想要的報文,因此減少了主單片機(MCU)的開銷。MCP2515與MCU 的連接是通過業界標準串行外設接口(SearialPeripheral Interface,SPI)來實現的。
2 數據發送:
>>器件有三個引腳----TX0RTS/TX1RTS/TX2RTS用來啟動將裝載在三個發送緩沖器之一中的報文立即發送出去。是否使用這些引腳由用戶決定;若不使用,也可利用控制寄存器(通過SPI接口訪問)來啟動報文發送---------三個RTS引腳可以不用。
>>報文發送時,首先將報文裝載到正確的報文緩沖器和控制寄存器中。通過SPI接口設置控制寄存器中的相應位或使用發送使能引腳均可啟動發送操作------常用SPI啟動發送。
---正常情況下,如果 CAN 報文仲裁失敗或被錯誤幀損壞,報文會嘗試再次發送。
3 數據接收:
>>器件上有一個多用途中斷引腳及各接收緩沖器的專用中斷引腳,用于指示有效報文是否被接收并載入接收緩沖器。可選擇使用專用中斷引腳。通用中斷引腳和狀態寄存器(通過SPI接口訪問)也可用來確定何時接收了有效報文------為了減少引腳的使用,先使用通用中斷引腳檢測中斷的發生,再通過讀狀態寄存器判斷是何種類型的中斷。
>>通過讀取相應的寄存器可以檢查通訊狀態和錯誤。會對在CAN總線上檢測到的任何報文進行錯誤檢查,然后與用戶定義的濾波器進行匹配,以確定是否將報文移到兩個接收緩沖器中的一個。
4 CAN報文幀:
(1)標準數據幀
CAN標準數據幀與其他所有幀一樣,幀以起始幀 (SOF)位開始,SOF 為顯性狀態,允許所有節點的硬同步。
SOF之后是仲裁字段, 由12個位組成, 分別為11個標識位和一個遠程發送請求(Remote TransmissionRequest, RTR)位。RTR 位用于區分報文是數據幀
(RTR 位為顯性狀態)還是遠程幀 (RTR 位為隱性狀態)。
仲裁字段之后是控制字段,由6個位組成。控制字段的第一位為標識擴展(Identifier Extension,IDE)位,該位應是顯性狀態來指定標準幀。標識擴展位的下一位為零保留位(RB0) ,CAN 協議將其定義為顯性位。控制字段的其余 4位為數據長度碼(Data Length Code,DLC),用來指定報文中包含的數據字節數 (0 到 8 字節) 。
控制字段之后為數據字段,包含要發送的任何數據字節。數據字段長度由上述 DLC 定義 (0到 8 字節)。
數據字段之后為循環冗余校驗(CRC)字段,用來檢測報文傳輸錯誤。CRC字段包含一個15位的CRC序列,之后是隱性的 CRC定界位。
最后一個字段是確認字段(ACK),由2 個位組成。在確認時隙(ACK Slot)位執行期間,發送節點發出一個隱性位。任何收到無錯誤幀的節點會發回一個顯性位(無論該節點是否配置為接受該報文與否)來確認幀收到無誤。確認字段以隱性確認定界符結束,該定界符可能不允許被改寫為顯性位。
最后是幀結尾-------每一個數據幀和遠程幀均由一標志序列界定。這個標志序列由 7 個“隱性”位組成。
>>數據幀由 7 個不同的位場組成。
(2)擴展數據幀
在擴展 CAN數據幀中(如圖 2-2 所示),緊隨SOF位的是 32 位的仲裁字段。仲裁字段的前 11 位為 29 位標識符的最高有效位(Most Significant bit,MSb) (基本lD)。緊隨這 11 位的是替代遠程請求(SubstituteRemote Request,SRR)位,定義為隱性狀態。SRR位之后是 IDE 位,該位為隱性狀態時表示這是擴展的CAN幀。
應該注意的是, 如果發送完擴展幀標識符的前11位后,總線仲裁無果,而此時其中一個等待仲裁的節點發出標準CAN數據幀(11 位標識符),那么,由于節點發出了顯性 lDE 位而使標準 CAN 幀贏得總線仲裁。另外,擴展 CAN 幀的SRR位應為隱性,以允許正在發送標準CAN 遠程幀的節點發出顯性 RTR 位。
SRR和lDE位之后是標識符的其余18位(擴展lD) 及一個遠程發送請求位。
為使標準幀和擴展幀都能在共享網絡上發送,應將29位擴展報文標識符拆成高11 位和低 18 位兩部分。拆分后可確保lDE位在標準數據幀和擴展數據幀中的位置保持一致。
仲裁字段之后是6位控制字段。控制字段前兩位為保留位,必須定義為顯性位---與標準數據幀相同。其余4 位為DLC,用來指定報文中包含的數據字節數。
擴展數據幀的其他部分 (數據字段、CRC 字段、確認字段、幀結尾和間斷)與標準數據幀的結構相同。
(3)遠程幀----請求數據幀
通常,數據傳輸是由數據源節點(例如,傳感器發出數據幀)自主完成的。但也可能存在目標節點向源節點請求發送數據的情況。要做到這一點,目標節點需發送一個遠程幀,其中的標識符應與所需數據幀的標識符相匹配。隨后,相應的數據源節點會發送一個數據幀以響應遠程幀請求。
遠程幀與數據幀存在兩點不同:
1)遠程幀的 RTR 位為隱性狀態;
2)遠程幀沒有數據字段。
當帶有相同標識符的數據幀和遠程幀同時發出時,數據幀將贏得仲裁,因為其標識符后面的 RTR 位為顯性。這樣,可使發送遠程幀的節點立即收到所需數據。
>>遠程幀由6個不同的位場組成---沒有數據幀:
幀起始、仲裁場、控制場、CRC 場、應答場、幀末尾。
(4)錯誤幀
>>由兩個位場組成。第一個場用作為不同站提供的錯誤標志(ERROR FLAG)的疊加。第二個場是錯誤界定符(含 8 個隱性位)。
>>有兩種形式的錯誤標志,主動錯誤標志(Active error flag)和被動錯誤標志(Passive error flag)。主動錯誤標志由 6個連續的“顯性”位組成。被動錯誤標志由6個連續的“隱性”的位組成,除非被其他節點的“顯性”位重寫。
(5)過載幀:
過載幀包括兩個位場:過載標志和過載界定符。
有兩種過載條件都會導致過載標志的傳送:
1. 接收器的內部條件(此接收器對于下一數據幀或遠程幀需要有一延時)。
2. 間歇場期間檢測到一“顯性”位。
由過載條件 1 而引發的過載幀只允許起始于所期望的間歇場的第一個位時間開始。而由過載條件 2 引發的過載幀應起始于所檢測到“顯性”位之后的位。通常為了延時下一個數據幀或遠程幀,兩個過載幀都會產生。
>>過載標志由6個顯性位組成--------------所有形式和主動錯誤標志的一樣。
>>過載界定符包括8個隱性位----過載界定符的形式和錯誤界定符的形式一樣。
(6)幀間間隔:
幀間間隔將前一條幀(無論何種類型)與其后的數據幀或遠程幀間隔開。幀間間隔至少由 3 個隱性位構成,又稱為間斷。間斷使節點在發送下一條報文之前有時間進行內部處理。在間斷之后,CAN 總線將保持隱性狀態--總線空閑,直至下一條報文開始發送。
5 位定時與波特率:
CAN總線上的所有節點都必須具有相同的標稱比特率。
CAN協議采用不歸零(Non Return to Zero,NRZ)編碼方式,在數據流中不對時鐘信號進行編碼。因此,接收時鐘信號必須由接收節點恢復并與發送器的時鐘同步。
由于不同節點的振蕩器頻率和傳輸時間不同,接收器應具有某種能與數據傳輸邊沿同步的鎖相環(Phase LockLoop,PLL)來同步時鐘并保持這種同步。鑒于數據采用 NRZ 編碼,有必要進行位填充以確保至少每 6 位時間發生一次邊沿,使數字鎖相環(Digital Phase LockLoop,DPLL)同步。
波特率:
CAN 總線上的所有器件都必須使用相同的比特率。然而,并非所有器件都要求具有相同的主振蕩器時鐘頻率。對于采用不同時鐘頻率的器件,應通過適當設置波
特率預分頻比以及每一時間段中的時間份額的數量來對比特率進行調整。
求波特率過程:配置CNF1得到TQà配置CNF2/3得到tbità求倒數得到波特率。
位時間:
CAN位時間由互不重疊的時間段組成。 每個時間段又由時間份額(TQ)組成,在 CAN 規范中,標稱比特率 (NominalBit Rate,NBR)定義為在不需要再同步的情況下,理想發送器每秒發送的位數。
標稱比特率:NBR----
標稱位時間:NBT----(時間段之和)
TQ時間份額:TQ = 2 x (BRP + 1)/FOSC
位時間各段如下:(與NBT四段對應)
其中同步段固定為1TQ,其他三段為可編程的。
------------------------
6 電氣特性:
顯性電平對應邏輯 0,CAN_H 和 CAN_L 之差為 2.5V 左右。而隱性電平對應邏輯 1,CAN_H 和 CAN_L 之差為 0V。在總線上顯性電平具有優先權,只要有一個單元輸出顯性電平,總線上即為顯性電平。而隱形電平則具有包容的意味,只有所有的單元都輸出隱性電平,總線上才為隱性電平(顯性電平比隱性電平更強)。另外,在CAN 總線的起止端都有一個120Ω的終端電阻,來做阻抗匹配,以減少回波反射。
CAN技術標準:
CAN協議經過ISO標準化后有兩個標準: ISO11898標準和ISO11519-2標準。其中ISO11898是針對通信速率為125Kbps~1Mbps的高速通信標準,而ISO11519-2是針對通信速率為125Kbps以下的低速通信標準。
7 工作模式:
>>利用CANCTRL. REQOP位可進行工作模式的選擇。
>>改變工作模式時,新的工作模式須等到所有當前報文發送完畢之后才生效。
>>必須通過讀取CANSTAT.OPMODE位來驗證新的工作模式。
(1)配置模式:
MCP2515 在正常運行之前必須進行初始化。只有在配置模式下,才能對器件進行初始化。在上電或復位時,器件會自動進入配置模式, CANTRL.REQOP<2:0>位設置成“100”也可使器件從任何模式進入配置模式。
(2)休眠模式:
MCP2515 具有內部休眠模式,使器件功耗最少。即使MCP2515處于休眠模式,SPI接口仍然保持正常的讀操作,以允許訪問器件內的所有寄存器。
(3)僅監聽模式:
僅監聽模式使MCP2515 可以接收包括錯誤報文在內的所有報文。這種模式可用于總線監視應用或熱插拔狀況下的波特率檢測。
(4)環回模式:
環回模式允許器件內部的發送緩沖器和接收緩沖器之間進行報文的自發自收,而無需通過 CAN 總線。此模式可用于系統開發和測試。
(5)正常模式:
該模式為 MCP2515 的標準工作模式。器件處于此模式下,會主動監視總線上的所有報文,并產生確認位和錯誤幀等。只有在正常模式下,MCP2515才能在 CAN總線上進行報文的傳輸。
8 SPI指令集:
---------通過SPI接口直接寫指令即可,比如通過指令復位。
9 過濾器:
--------只有一種模式(即相當于STM32中的屏蔽位模式)。
--------過濾器與屏蔽器是配合使用的,不是單獨使用的。
--------緩沖器+過濾器+屏蔽器à報文ID必須至少與一個過濾器匹配,即與過濾器中一些位(對應屏蔽器中為1的位)完全相同。
--------兩個組合:
組合一:緩沖器1+屏蔽器1+過濾器1/2。
組合二:緩沖器2+屏蔽器2+過濾器3/4/5/6。
--------過濾器與緩沖器都是4Bytes,分別是SIDH/SIDL/EID8/EID0。
10 中斷:
MCP2515有八個中斷源。CANINTE寄存器包含了使能各中斷源的中斷使能位。 CANINTF 寄存器包含了各中斷源的中斷標志位。當發生中斷時, INT 引腳將被
MCP2515拉為低電平, 并保持低電平狀態直至MCU清除中斷。中斷只有在引起相應中斷的條件消失后,才會被清除。
建議在對 CANINTF 寄存器中的標志位進行復位操作時,采用位修改命令而不要使用一般的寫操作。這是為了避免在寫命令執行過程中無意間修改了標志位,進而導致中斷丟失。應該注意的是,CANINTF中的中斷標志位是可讀寫位,因此在相關 CANINTE 中斷使能位置 1 的前提下,對上述任一位置 1均可使 MCU產生中斷請求。
----CANINTE使能與CANINTF標志都是8位,并且各位是一一對應的。
11 寄存器簡介:
(1) BFPCTRL---RXnBF引腳控制寄存器和狀態寄存器---對應接收中斷引腳;
TXRTSCTRL---TXnRTS引腳控制和狀態寄存器---對應發送請求引腳。
(2)CANSTAT/CTRL----CAN狀態和控制寄存器。
(3)CANINTF/INTE----CAN中斷標志和使能寄存器。
(4)REC---接收錯誤計數器;TEC---發送錯誤計數器;EFLG---錯誤標志寄存器。
REC---receive error counter;EFLG---error flag。
(5)CNF1/2/3----配置寄存器----用于位定時/波特率配置。
(6)TXBnCTRL----發送緩沖器n控制寄存器。
(7)RXBnCTRL----接收緩沖器n控制寄存器。
12 MCP2515的SPI詳解:
(1) 模式:MCP2515 設計可與許多單片機的串行外設接口(SPI)直接相連,支持 0,0 和 1,1 運行模式。外部數據和命令通過 SI引腳傳送到器件中,且數據在 SCK時鐘信號的上升沿傳送進去。MCP2515 在SCK的下降沿通過 SO引腳傳送出去。在進行任何操作時, CS 引腳都必須保持為低電平。
(2) CS:CS 引腳被設置為低電平后,MCP2515希望收到的第一個字節是指令/命令字節。這意味著CS引腳必須先拉升為高電平然后再降為低電平以調用另外一個命令----有待驗證(時序圖與此不一致)。
注意:此處經過驗證發現時序圖是正確的,文字描述不正確(可能是翻譯的緣故),
結論:
一、看中文翻譯的datasheet,以時序圖為準,因為時序圖是復制而來的。
二、查看P65的時序圖可知---各個指令大多包含多個指令數據的讀寫,在整個讀寫過程中CS一直保持為低,直到完成整個指令CS才能變為1。
(3) 指令詳解:
>>復位指令:復位指令為單字節指令。應先將CS引腳置0選中器件,隨后發送命令字節,發送完畢之后再將CS引腳置1。強烈建議將發送復位指令(或將RESET 引腳置為低電平)作為器件上電初始化過程中的一部分。
>>讀指令:
將CS引腳置為低電平來啟動讀指令。隨后向MCP2515依次發送讀指令和 8 位地址碼 (A7 至 A0)。在接收到讀指令和地址碼之后, MCP2515 會將指定地址寄存器中的數據通過 SO引腳移出。
每一數據字節移出后,器件內部的地址指針將自動加一以指向下一個地址。因此,通過持續提供時鐘脈沖,可以對下一個連續地址寄存器進行讀操作。通過該方法可以順序讀取任意個連續地址寄存器中的數據。通過拉高CS引腳電平可以結束讀操作。
>>讀 RX 緩沖器指令:
相比于讀指令----讀 RX緩沖器指令可以快速尋址要讀取的接收緩沖器。該指令使 SPI開銷減少了一個字節(地址字節)。
---指令碼為10010nm0ànm對應兩個接收緩沖器---每個緩沖器對應一幀數據----一幀數據包含標準ID/擴展ID/DLC/數據(1-8Bytes)。
>>寫指令:
將CS引腳置為低電平來啟動寫操作。隨后向MCP2515依次發送寫指令、地址碼和至少一個字節的數據(如果是多個數據,其地址是連續的)。
>>裝載TX緩沖器指令:
該指令取消了一般寫命令所需要的8 位地址。該8位指令將地址指針設置為6個地址之一,以便快速地將數據寫入發送緩沖器,該地址指向3個發送緩沖器之一的“ID”或 “數據”地址---每個緩沖器對應一幀數據----一幀數據包含標準ID/擴展ID/DLC/數據(1-8Bytes)。。
>>請求發送(RTS)指令:
使用RTS命令可以啟動一個或多個發送緩沖器的報文發送。將CS引腳置為低電平來選中MCP2515。 之后向其發送RTS命令字節。該命令的后3位顯示了哪些發送緩沖器被使能發送。該命令將緩沖器對應的TxBnCTRL.TXREQ 位置1。用一條RTS命令即可對這三位中的一位或全部三位置1。如果發送的RTS命令中nnn =000,將忽略該命令----三個n對應三個發送發送緩沖器。
>>讀狀態指令:
讀狀態指令允許單條指令訪問常用的報文接收和發送狀態位。
>>RX狀態指令:
RX 狀態指令用于快速確定與報文和報文類型(標準幀、擴展幀或遠程幀)相匹配的濾波器。命令字節發送后,控制器會返回包含狀態信息的 8 位數據。
>>位修改指令:
位修改指令可對特定狀態和控制寄存器中單獨的位進行置1或清零。該命令并非對所有寄存器有效。向 MCP2515發送位修改命令字節。命令字節發送后,依次發送寄存器地址、屏蔽字節以及數據字節。屏蔽字節確定允許修改寄存器中的哪一位。屏蔽字節中的“1”表示允許對寄存器中的相應位進行修改;而“0”則禁止修改。
13 初始化詳解:
(1) 復位:
MCP2515 有兩種復位方式:
1)硬件復位——RESET引腳為低電平。
2)SPI復位——通過 SPI命令復位---畢業設計采用指令復位。
(2) 進入配置模式---初始化配置:
1)在上電或復位時,器件會自動進入配置模式, 或通過CANTRL.REQOP位
設置成“100”也可使器件從任何模式進入配置模式。
2) 改變工作模式時,新的工作模式須等到所有當前報文發送完畢之后才生效。 必須通過讀取CANSTAT.OPMODE位來驗證新的工作模式。
3) 進入配置模式時,所有錯誤計數器都被清零。只有在配置模式下,才能對以下寄存器進行修改:
? CNF1、 CNF2 和CNF3
? TXRTSCTRL
? 驗收過濾寄存器
? 驗收屏蔽寄存器
(3) 配置波特率:
---具體看位定時和波特率的詳解。
(4) 配置發送:
1) TXnRTS引腳配置----配置用來禁用三個發送請求引腳。
其余的配置不需要在初始化時配置---發送時再配置也行。
2) TXBnCTRL---配置報文發送請求和優先級。
3)標準ID和擴展ID配置---4個寄存器。
4)TXBnDLC----報文類型(數據幀或請求幀)和數據長度(DLC)配置。
5)發送緩沖器數據字節----(0—8個字節)。
(5) 配置接收:
---配置RXB0CTRL——接收緩沖器 0/1控制寄存器;
---配置BFPCTRL——RXnBF引腳控制寄存器和狀態寄存器;
---配置報文驗收濾波器(RXFn)及屏蔽寄存器(RXMn)---見上面詳解。
(6) 配置中斷:
---CANINTF---中斷標志位初始化時清零。
---CANINTE---使能位(最常用的為使能接收中斷)。
(7) 配置模式:
---正常模式-------收發用;
---回環模式-------測試用;
14 MCP2515發送函數詳解:
---至少須將 TXBnSIDH、TXBnSIDL和 TXBnDLC 寄存器裝載數據---包含ID、數據長度(字節數)和幀類型。
---如果報文包含數據字節,還需要對 TXBnDm寄存器進行裝載。
---若報文采用擴展標識符,對TXB-nEIDm寄存器進行裝載,并將TXBnSIDL.EXIDE 位置1。
---在報文發送之前,MCU應對 CANINTE.TXInE位進行初始化,以便在報文發送時使能或禁止中斷的產生。
15 MCP2515接收函數詳解:
---RXBnDLC---判斷接收到的數據的字節數和幀類型。
---接收信息包含ID/擴展ID、幀類型、長度DLC和數據。
---RXB0CTRL---在初始化時進行配置即可。
16 MCP2515中斷函數詳解:
---使能外中斷。
---使能CAN中斷(MCP2515有八個中斷源)。
---初始化時對中斷標志位清零。
---ISR中讀中斷標志判斷中斷源,然后進行相應的操作。

提交
三格電子智慧農業-溫室大棚智能控制系統
LORA+4G無線組網方案
天津三格電子基于HART協議的應用
三格電子基于物聯網云網關+云平臺方案
485通信問題、解決方法及基本原理講解