<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32之CAN ---CAN ID過(guò)濾器分析

          STM32之CAN ---CAN ID過(guò)濾器分析

          作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏

          1 前言

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

          本文引用地址:http://www.ex-cimer.com/article/201611/317116.htm

          為了讓大家了解STM32的bxCAN的接收過(guò)濾機(jī)制,首先大家需要了解幾個(gè)概念。

          2 幾個(gè)重要的概念

          2.1 過(guò)濾器組

          STM32總共提供14個(gè)過(guò)濾器組來(lái)處理CAN接收過(guò)濾問(wèn)題,每個(gè)過(guò)濾器組包含兩個(gè)32位寄存器CAN_FxR0和CAN_FxR1組成,在設(shè)置為屏蔽位模式下,其中一個(gè)作為標(biāo)識(shí)符寄存器,另一個(gè)作為屏蔽碼寄存器。過(guò)濾器組中的每個(gè)過(guò)濾器,編號(hào)(叫做過(guò)濾器號(hào))從0開(kāi)始,到某個(gè)最大數(shù)值(這時(shí)最大值并非13,而是取決于14個(gè)過(guò)濾器組的模式和位寬的設(shè)置,當(dāng)全部配置為位寬為16,且為標(biāo)識(shí)符列表模式時(shí),最大編號(hào)為14*4-1=55)。

          2.2 過(guò)濾器的過(guò)濾模式

          STM32提供兩種過(guò)濾模式供用戶(hù)設(shè)置:屏蔽位模式和標(biāo)識(shí)符列表模式。

          2.2.1 屏蔽位模式

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

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

          2.2.2 標(biāo)識(shí)符列表模式

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

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

          2.3 過(guò)濾器的位寬

          每個(gè)過(guò)濾器組的位寬都可以獨(dú)立配置,以滿(mǎn)足應(yīng)用程序的不同需求。根據(jù)位寬的不同,每個(gè)過(guò)濾器組可提供:
          ●1個(gè)32位過(guò)濾器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位
          ●2個(gè)16位過(guò)濾器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

          2.3 過(guò)濾器組的過(guò)濾模式和位寬設(shè)置

          過(guò)濾器組可以通過(guò)相應(yīng)的CAN_FMR寄存器(CAN過(guò)濾器主控寄存器)配置。但是不是什么時(shí)候都可以直接配置,在配置一個(gè)過(guò)濾器組前,必須通過(guò)清除CAN_FAR寄存器(CAN過(guò)濾器激活寄存器)的FACT位,把它設(shè)置為禁用狀態(tài)。然后才能設(shè)置或設(shè)置過(guò)濾器組的配置。

          • 通過(guò)設(shè)置CAN_FS1R(CAN過(guò)濾器位寬寄存器)的相應(yīng)FSCx位,可以配置一個(gè)過(guò)濾器組的位寬。
          • 通過(guò)CAN_FM1R(CAN過(guò)濾器模式寄存器)的FBMx位,可以配置對(duì)應(yīng)的屏蔽/標(biāo)識(shí)符寄存器的標(biāo)識(shí)符列表模式或屏蔽位模式。(見(jiàn)后續(xù)3.2節(jié))

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

          關(guān)于過(guò)濾器配置,可參見(jiàn)下圖:

          圖1

          2.4 過(guò)濾器匹配序號(hào)

          一旦收到的報(bào)文被存入FIFO,就可被應(yīng)用程序訪問(wèn)。通常情況下,報(bào)文中的數(shù)據(jù)被拷貝到SRAM中;為了把數(shù)據(jù)拷貝到合適的位置,應(yīng)用程序需要根據(jù)報(bào)文的標(biāo)識(shí)符來(lái)辨別不同的數(shù)據(jù)。bxCAN提供了過(guò)濾器匹配序號(hào),以簡(jiǎn)化這一辨別過(guò)程。

          根據(jù)過(guò)濾器優(yōu)先級(jí)規(guī)則,過(guò)濾器匹配序號(hào)和報(bào)文一起,被存入郵箱中。因此每個(gè)收到的報(bào)文,都有與它相關(guān)聯(lián)的過(guò)濾器匹配序號(hào)。

          過(guò)濾器匹配序號(hào)可以通過(guò)下面兩種方式來(lái)使用:
          ● 把過(guò)濾器匹配序號(hào)跟一系列所期望的值進(jìn)行比較
          ● 把過(guò)濾器匹配序號(hào)當(dāng)作一個(gè)索引來(lái)訪問(wèn)目標(biāo)地址
          對(duì)于標(biāo)識(shí)符列表模式下的過(guò)濾器(非屏蔽方式的過(guò)濾器),軟件不需要直接跟標(biāo)識(shí)符進(jìn)行比較。
          對(duì)于屏蔽位模式下的過(guò)濾器,軟件只須對(duì)需要的那些屏蔽位(必須匹配的位)進(jìn)行比較即可。
          在給過(guò)濾器編號(hào)時(shí),并不考慮過(guò)濾器組是否為激活狀態(tài)。另外,每個(gè)FIFO各自對(duì)其關(guān)聯(lián)的過(guò)濾器進(jìn)行編號(hào),如下圖:

          圖2

          2.5 過(guò)濾器優(yōu)先級(jí)規(guī)則

          根據(jù)過(guò)濾器的不同配置,有可能一個(gè)報(bào)文標(biāo)識(shí)符能通過(guò)多個(gè)過(guò)濾器的過(guò)濾;在這種情況下,存放在接收郵箱中的過(guò)濾器匹配序號(hào),根據(jù)下列優(yōu)先級(jí)規(guī)則來(lái)確定:
          ● 位寬為32位的過(guò)濾器,優(yōu)先級(jí)高于位寬為16位的過(guò)濾器
          ● 對(duì)于位寬相同的過(guò)濾器,標(biāo)識(shí)符列表模式的優(yōu)先級(jí)高于屏蔽位模式
          ● 位寬和模式都相同的過(guò)濾器,優(yōu)先級(jí)由過(guò)濾器號(hào)決定,過(guò)濾器號(hào)小的優(yōu)先級(jí)高

          如下圖:

          圖3

          如上圖,在接收一個(gè)報(bào)文時(shí),其標(biāo)識(shí)符首先與配置在標(biāo)識(shí)符列表模式下的過(guò)濾器相比較;如果匹配上,報(bào)文就被存放到相關(guān)聯(lián)的FIFO中,并且所匹配的過(guò)濾器的序號(hào)(這時(shí)為4)被存入過(guò)濾器匹配序號(hào)中。如同例子中所顯示,報(bào)文標(biāo)識(shí)符跟#4標(biāo)識(shí)符匹配,因此報(bào)文內(nèi)容和FMI4被存入FIFO。

          如果沒(méi)有匹配,報(bào)文標(biāo)識(shí)符接著與配置在屏蔽位模式下的過(guò)濾器進(jìn)行比較。
          如果報(bào)文標(biāo)識(shí)符沒(méi)有跟過(guò)濾器中的任何標(biāo)識(shí)符相匹配,那么硬件就丟棄該報(bào)文,且不會(huì)對(duì)軟件有任何打擾。

          3 與過(guò)濾器相關(guān)的寄存器

          3.1 CAN 過(guò)濾器主控寄存器 (CAN_FMR)

          地址偏移量: 0x200

          復(fù)位值: 0x2A1C 0E01

          注: 該寄存器的非保留位完全由軟件控制。

          圖4

          位31:1保留位,強(qiáng)制為復(fù)位值。
          位0FINIT : 過(guò)濾器初始化模式
          針對(duì)所有過(guò)濾器組的初始化模式設(shè)置。
          0: 過(guò)濾器組工作在正常模式;
          1: 過(guò)濾器組工作在初始化模式。

          3.2 CAN 過(guò)濾器模式寄存器 (CAN_FM1R)

          地址偏移量: 0x204
          復(fù)位值: 0x0000 0000
          注: 只有在設(shè)置CAN_FMR(FINIT=1),使過(guò)濾器處于初始化模式下,才能對(duì)該寄存器寫(xiě)入。

          圖5

          位31:14保留位,硬件強(qiáng)制為0
          位13:0FBMx : 過(guò)濾器模式
          過(guò)濾器組x的工作模式。
          0: 過(guò)濾器組x的2個(gè)32位寄存器工作在標(biāo)識(shí)符屏蔽位模式;
          1: 過(guò)濾器組x的2個(gè)32位寄存器工作在標(biāo)識(shí)符列表模式。

          3.3 CAN 過(guò)濾器位寬寄存器 (CAN_FS1R)

          地址偏移量: 0x20C
          復(fù)位值: 0x0000 0000
          注: 只有在設(shè)置CAN_FMR(FINIT=1),使過(guò)濾器處于初始化模式下,才能對(duì)該寄存器寫(xiě)入。

          圖6

          位31:14保留位,硬件強(qiáng)制為0
          位13:0FSCx : 過(guò)濾器位寬設(shè)置
          過(guò)濾器組x(13~0)的位寬。
          0:過(guò)濾器位寬為2個(gè)16位;
          1:過(guò)濾器位寬為單個(gè)32位。

          3.4 CAN 過(guò)濾器FIFO關(guān)聯(lián)寄存器 (CAN_FFA1R)

          地址偏移量: 0x214
          復(fù)位值: 0x0000 0000
          注: 只有在設(shè)置CAN_FMR(FINIT=1),使過(guò)濾器處于初始化模式下,才能對(duì)該寄存器寫(xiě)入。

          圖7

          位31:14保留位,硬件強(qiáng)制為0。
          位13:0FFAx : 過(guò)濾器位寬設(shè)置
          報(bào)文在通過(guò)了某過(guò)濾器的過(guò)濾后,將被存放到其關(guān)聯(lián)的FIFO中。
          0:過(guò)濾器被關(guān)聯(lián)到FIFO0;
          1:過(guò)濾器被關(guān)聯(lián)到FIFO1。

          3.5 CAN 過(guò)濾器激活寄存器 (CAN_FA1R)

          地址偏移量: 0x21C
          復(fù)位值: 0x0000 0000

          圖7

          位31:14保留位,硬件強(qiáng)制為0。
          位13:0FACTx : 過(guò)濾器激活
          軟件對(duì)某位設(shè)置1來(lái)激活相應(yīng)的過(guò)濾器。只有對(duì)FACTx位清0,或?qū)AN_FMR寄存器的FINIT位設(shè)置1后,才能修改相應(yīng)的過(guò)濾器寄存器x(CAN_FxR[0:1])。
          0:過(guò)濾器被禁用;
          1:過(guò)濾器被激活。

          3.6 CAN 過(guò)濾器組x寄存器 (CAN_FiRx) (i=0..13,x=1..2)

          地址偏移量:0x240h..0x2AC
          復(fù)位值:未定義位
          注: 共有14組過(guò)濾器:i=0..13。每組過(guò)濾器由2個(gè)32位的寄存器,CAN_FiR[2:1]組成。只有在CAN_FaxR寄存器(CAN過(guò)濾器激活寄存器)相應(yīng)的FACTx位清’0’,或CAN_FMR寄存器(CAN過(guò)濾器主控寄存器)的FINIT位為’1’時(shí),才能修改相應(yīng)的過(guò)濾器寄存器。

          圖8

          位31:0FB[31:0] : 過(guò)濾器位
          • 當(dāng)為標(biāo)識(shí)符模式時(shí):
          寄存器的每位對(duì)應(yīng)于所期望的標(biāo)識(shí)符的相應(yīng)位的電平。
          0: 期望相應(yīng)位為顯性位;
          1: 期望相應(yīng)位為隱性位。
          • 當(dāng)為屏蔽位模式時(shí):
          寄存器的每位指示是否對(duì)應(yīng)的標(biāo)識(shí)符寄存器位一定要與期望的標(biāo)識(shí)符的相應(yīng)位一致。
          0: 不關(guān)心,該位不用于比較;
          1: 必須匹配,到來(lái)的標(biāo)識(shí)符位必須與濾波器對(duì)應(yīng)的標(biāo)識(shí)符寄存器位相一致。
          注: 根據(jù)過(guò)濾器位寬和模式的不同設(shè)置,過(guò)濾器組中的兩個(gè)寄存器的功能也不盡相同。。關(guān)于過(guò)濾器的映射,功能描述和屏蔽寄存器的關(guān)聯(lián),請(qǐng)參見(jiàn)2節(jié)標(biāo)識(shí)符過(guò)濾。

          屏蔽位模式下的屏蔽/標(biāo)識(shí)符寄存器,跟標(biāo)識(shí)符列表模式下的寄存器位定義相同。

          4 代碼實(shí)例

          4.1 CAN ID值的結(jié)構(gòu)分析

          在講到代碼實(shí)例之前,首先大家都弄懂一件事,當(dāng)給定一個(gè)CAN ID,如0x1800f001,當(dāng)然這個(gè)是擴(kuò)展ID,這里要問(wèn)的是,這個(gè)CAN ID的值本身包含兩部分,即基本ID與擴(kuò)展ID,即么你知道這個(gè)擴(kuò)展ID0x1800f001的哪些位是基本ID,哪些位又是擴(kuò)展ID?(在基本CANID格式下不存在這個(gè)問(wèn)題)

          在回答這個(gè)問(wèn)題之前我們來(lái)看看ISO11898的定義,如下圖:

          圖9

          如上圖,基本格式不存在擴(kuò)展ID,而擴(kuò)展格式中ID0~ID17為Extension ID,而ID18~ID28為Base ID.

          因此CAN ID值0x1800f001用二進(jìn)制表示為:0b 0001 1000 0000 0000 1111 0000 0000 0001,用括號(hào)分別區(qū)別為:0b 000[1 1000 0000 00][00 1111 0000 0000 0001],紅色部分為擴(kuò)展ID,藍(lán)色部分為基本ID。那么知道這些有什么用呢?接下來(lái)的代碼示例中你就會(huì)有什么用了。

          4.2 位寬為32位的屏蔽模式

          在此種模式下中過(guò)濾多個(gè)CAN ID,此時(shí),過(guò)濾器包含兩個(gè)寄存器,屏蔽碼寄存器和標(biāo)識(shí)符寄存器。此模式下最多只存在一個(gè)屏蔽過(guò)濾器。

          如下圖所示:

          圖10

          如上圖,上面的ID為標(biāo)識(shí)符寄存器,中間部分的MASK為屏蔽碼寄存器。每個(gè)寄存器都是32位的。最下邊顯示的是與CAN ID各位定位的映射關(guān)系。由4.1的知識(shí)很快可以發(fā)現(xiàn),上圖最下邊的映射關(guān)系恰好等于擴(kuò)展CAN值左移3位再補(bǔ)上IDE(擴(kuò)展幀標(biāo)識(shí)),RTR(遠(yuǎn)程幀標(biāo)志)。

          因此,我們初步得出這樣的推論:對(duì)于一個(gè)擴(kuò)展CAN ID,不能單純地將它看到的一個(gè)數(shù),而應(yīng)該將它看成兩部分,基本ID和擴(kuò)展ID(當(dāng)然標(biāo)準(zhǔn)CAN ID只包含基本ID部分),過(guò)濾器屏蔽碼寄存器和標(biāo)識(shí)符寄存器也應(yīng)該看成多個(gè)部分,然后問(wèn)題就變成了如何將CAN ID所表示的各部分如何針對(duì)過(guò)濾器寄存器各部分對(duì)號(hào)入座的問(wèn)題了。

          對(duì)號(hào)入座的方法多種多樣,但萬(wàn)變不離其心,主要是掌握其核心思想即可:1:在各種過(guò)濾器模式下,CAN ID與寄存器相應(yīng)位置一定要匹配;2:在屏蔽方式下,屏蔽碼寄存器某位為1表示接收到的CAN ID對(duì)應(yīng)的位必須對(duì)驗(yàn)證碼寄存器對(duì)應(yīng)的位相同。

          下面給出一個(gè)代碼例子,假設(shè)我們要接收多個(gè)ID:0x7e9,0x1800f001,前面為標(biāo)準(zhǔn)ID,后面為擴(kuò)展ID,要同時(shí)能接收這兩個(gè)ID,那么該如何設(shè)置這個(gè)過(guò)濾器呢?

          1. CAN_FilterInitTypeDefCAN_FilterInitStructure;
          2. U16std_id=0x7e9;
          3. U32ext_id=0x1800f001;
          4. U32mask=0;
          5. CAN_FilterInit(&CAN_FilterInitStructure);//初始化CAN_FilterInitStructrue結(jié)構(gòu)體變量
          6. CAN_FilterInitStructure.CAN_FilterNumber=0;//設(shè)置過(guò)濾器組0,范圍為0~13
          7. CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//設(shè)置過(guò)濾器組0為屏蔽模式
          8. CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//設(shè)置過(guò)濾器組0位寬為32位
          9. //標(biāo)識(shí)位寄存器的設(shè)置
          10. //ext_id<<3對(duì)齊,見(jiàn)上圖9,再>>16取高16位
          11. CAN_FilterInitStructure.CAN_FilterIdHigh=((ext_id<<3)>>16)&0xffff;//設(shè)置標(biāo)識(shí)符寄存器高字節(jié)。
          12. CAN_FilterInitStructure.CAN_FilterIdLow=(U16)(ext_id<<3)|CAN_ID_EXT;//設(shè)置標(biāo)識(shí)符寄存器低字節(jié)
          13. //這里也可以這樣設(shè)置
          14. //CAN_FilterInitStructure.CAN_FilterIdHigh=std_id<<5;//設(shè)置標(biāo)識(shí)符寄存器高字節(jié).這里為什么是左移5位呢?從上圖可以看出,CAN_FilterIdHigh包含的是STD[0~10]和EXID[13~17],標(biāo)準(zhǔn)CANID本身是不包含擴(kuò)展ID數(shù)據(jù),因此為了要將標(biāo)準(zhǔn)CANID放入此寄存器,標(biāo)準(zhǔn)CANID首先應(yīng)左移5位后才能對(duì)齊.
          15. //CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_EXT;//設(shè)置標(biāo)識(shí)符寄存器低字節(jié),這里也可以設(shè)置為CAN_ID_STD
          16. //屏蔽寄存器的設(shè)置
          17. //這里的思路是先將標(biāo)準(zhǔn)CANID和擴(kuò)展CANID對(duì)應(yīng)的ID值先異或后取反,為什么?異或是為了找出兩個(gè)CANID有哪些位是相同的,是相同的位則說(shuō)明需要關(guān)心,需要關(guān)心的位對(duì)應(yīng)的屏蔽碼位應(yīng)該設(shè)置為1,因此需要取反一下。最后再整體左移3位。
          18. mask=(std_id<<18);//這里為什么左移18位?因?yàn)閺腎SO11898中可以看出,標(biāo)準(zhǔn)CANID占ID18~ID28,為了與CAN_FilterIdHigh對(duì)齊,應(yīng)左移2位,接著為了與擴(kuò)展CAN對(duì)應(yīng),還應(yīng)該再左移16位,因此,總共應(yīng)左移2+16=18位。也可以用另一個(gè)方式來(lái)理解:直接看Mapping的內(nèi)容,發(fā)現(xiàn)STDID相對(duì)EXID[0]偏移了18位,因此左移18位.
          19. mask^=ext_id;//將對(duì)齊后的標(biāo)準(zhǔn)CAN與擴(kuò)展CAN異或后取反
          20. mask=~mask;
          21. mask<<=3;//再整體左移3位
          22. mask|=0x02;//只接收數(shù)據(jù)幀,不接收遠(yuǎn)程幀
          23. CAN_FilterInitStructure.CAN_FilterMaskIdHigh=(mask>>16)&0xffff;//設(shè)置屏蔽寄存器高字節(jié)
          24. CAN_FilterInitStructure.CAN_FilterMaskIdLow=mask&0xffff;//設(shè)置屏蔽寄存器低字節(jié)
          25. CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//此過(guò)濾器組關(guān)聯(lián)到接收FIFO0
          26. CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活此過(guò)濾器組
          27. CAN_FilterInit(&CAN_FilterInitStructure);//設(shè)置過(guò)濾器

          總結(jié)可知,當(dāng)過(guò)濾器為屏蔽模式時(shí),標(biāo)識(shí)符寄存器對(duì)應(yīng)的ID內(nèi)容可為任意一需求接收的ID值,當(dāng)同時(shí)要接收標(biāo)準(zhǔn)幀和擴(kuò)展幀時(shí),標(biāo)識(shí)符寄存器對(duì)應(yīng)IDE位也隨意設(shè)置,屏蔽寄存器的IDE位設(shè)置為0,表示不關(guān)心標(biāo)準(zhǔn)幀還是擴(kuò)展幀。而屏蔽寄存器對(duì)應(yīng)的ID內(nèi)容為各需求接收的ID值依次異或的結(jié)果再取反。

          4.3 位寬為32位的標(biāo)識(shí)符列表模式

          在此種模式下,過(guò)濾器組包含的兩個(gè)寄存器含義一樣,此模式下只多存在兩個(gè)標(biāo)識(shí)符列表過(guò)濾器如下圖:

          圖11


          1. CAN_FilterInitTypeDefCAN_FilterInitStructure;
          2. U16std_id=0x7e9;
          3. U32ext_id=0x1800f001;
          4. CAN_FilterInit(&CAN_FilterInitStructure);//初始化CAN_FilterInitStructrue結(jié)構(gòu)體變量
          5. CAN_FilterInitStructure.CAN_FilterNumber=0;//設(shè)置過(guò)濾器組0,范圍為0~13
          6. CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;//設(shè)置過(guò)濾器組0為標(biāo)識(shí)符列表模式
          7. CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//設(shè)置過(guò)濾器組0位寬為32位
          8. //設(shè)置屏蔽寄存器,這里當(dāng)標(biāo)識(shí)符寄存器用
          9. CAN_FilterInitStructure.CAN_FilterIdHigh=std_id<<5);//為什么左移5位?與上面相同道理,這里不再重復(fù)解釋
          10. CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;//設(shè)置標(biāo)識(shí)符寄存器低字節(jié),CAN_FilterIdLow的ID位可以隨意設(shè)置,在此模式下不會(huì)有效。
          11. //設(shè)置標(biāo)識(shí)符寄存器
          12. CAN_FilterInitStructure.CAN_FilterMaskIdHigh=((ext_id<<3)>>16)&0xffff;//設(shè)置屏蔽寄存器高字節(jié)
          13. CAN_FilterInitStructure.CAN_FilterMaskIdLow=((ext_id<<3)&0xffff)|CAN_ID_EXT;//設(shè)置屏蔽寄存器低字節(jié)
          14. CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//此過(guò)濾器組關(guān)聯(lián)到接收FIFO0
          15. CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活此過(guò)濾器組
          16. CAN_FilterInit(&CAN_FilterInitStructure);//設(shè)置過(guò)濾器

          4.4 位寬為16位的屏蔽碼模式

          在此模式下,最多存在兩個(gè)屏蔽碼過(guò)濾器,如下圖:

          圖12

          由上圖映射可知,最下面的映射只包含STDID0~ID10,因此,此模式下的兩個(gè)屏蔽過(guò)濾器只能實(shí)現(xiàn)對(duì)標(biāo)準(zhǔn)ID的過(guò)濾。具體代碼就不介紹了,參見(jiàn)上圖的映射即可。

          4.5 位寬為16位的標(biāo)識(shí)符列表模式

          圖13

          在此模式下,由于標(biāo)識(shí)符寄存器的高16位和低16位,屏蔽寄存器的高16位和低16位都用來(lái)做標(biāo)識(shí)符寄存器,因此,最多可存在4個(gè)標(biāo)識(shí)符過(guò)濾器。同樣,只能實(shí)現(xiàn)對(duì)標(biāo)準(zhǔn)幀的過(guò)濾。具體代碼就不介紹了,參見(jiàn)上圖的映射即可。



          關(guān)鍵詞: STM32CANID過(guò)濾

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();