CAN 過濾器的技術(shù)原理:硬件級的 ID 匹配邏輯
CAN 過濾器的本質(zhì)是 “基于 CAN 幀 ID 的硬件匹配電路”,其核心功能是通過預(yù)設(shè)的 “過濾規(guī)則”,判斷接收幀的 ID 是否符合條件,僅允許符合條件的幀進(jìn)入接收緩沖區(qū)。不同廠商的 CAN 控制器(如 ST 的 bxCAN、NXP 的 SJA1000、Microchip 的 MCP2515)在過濾器的硬件實現(xiàn)上略有差異,但核心邏輯一致,主要包含 “過濾器組”“過濾模式”“ID 類型”“接收 FIFO” 四大組件,共同構(gòu)成 “幀接收 - ID 匹配 - FIFO 存儲” 的完整流程。
(一)過濾器的核心組件:從規(guī)則定義到數(shù)據(jù)存儲
1. 過濾器組(Filter Bank):過濾規(guī)則的載體
CAN 控制器通常包含多個 “過濾器組”(如 STM32 的 bxCAN 支持 28 個過濾器組,SJA1000 支持 2 個),每個過濾器組可獨立配置一套過濾規(guī)則,實現(xiàn)多維度的篩選需求。例如,某汽車 ECU 需要同時接收 “發(fā)動機(jī)轉(zhuǎn)速幀”(ID=0x123)與 “水溫幀”(ID=0x124),可配置兩個過濾器組,分別匹配這兩個 ID;也可通過一個過濾器組的 “列表模式” 同時匹配多個 ID,靈活度取決于應(yīng)用場景。
每個過濾器組包含 “過濾器寄存器”(用于存儲目標(biāo) ID 與匹配規(guī)則)與 “控制寄存器”(用于配置過濾模式、ID 類型、激活狀態(tài)):
過濾器寄存器:通常分為 “過濾器 ID 寄存器”(Filter ID Register)與 “過濾器掩碼寄存器”(Filter Mask Register),前者存儲目標(biāo) ID 的位 pattern,后者定義哪些位需要嚴(yán)格匹配、哪些位可忽略(僅掩碼模式需要);
控制寄存器:配置過濾器的工作模式(掩碼模式 / 列表模式)、ID 類型(標(biāo)準(zhǔn) ID / 擴(kuò)展 ID)、關(guān)聯(lián)的接收 FIFO(FIFO0/FIFO1)、激活狀態(tài)(激活 / 未激活)。
2. 過濾模式:精準(zhǔn)匹配與靈活篩選的選擇
CAN 過濾器支持兩種核心模式 ——掩碼模式(Mask Mode) 與列表模式(List Mode),分別對應(yīng) “靈活篩選一類 ID” 與 “精準(zhǔn)匹配多個固定 ID” 的需求,是過濾器配置的核心區(qū)別。
(1)掩碼模式:靈活的 “模糊匹配”
掩碼模式(也稱為 “掩碼位寬模式”)通過 “過濾器 ID” 與 “過濾器掩碼” 的配合,實現(xiàn)對某一類 ID 的靈活篩選。其核心邏輯是:掩碼的每一位定義了過濾器 ID 對應(yīng)位的 “匹配強(qiáng)度”—— 掩碼位為 1 時,接收幀的對應(yīng)位必須與過濾器 ID 的對應(yīng)位完全一致(“嚴(yán)格匹配位”);掩碼位為 0 時,接收幀的對應(yīng)位可任意(0 或 1,“忽略位”)。這種模式適合篩選 “ID 具有相同前綴或后綴” 的一類幀,無需為每個 ID 單獨配置過濾器。
以標(biāo)準(zhǔn) ID(11 位) 為例:若需篩選 ID 為 0x120~0x12F 的所有幀(共 16 個 ID),過濾器 ID 可設(shè)為 0x120(二進(jìn)制00010010000),過濾器掩碼設(shè)為 0x1F0(二進(jìn)制00011111000)。此時,掩碼的高 6 位(bit10~bit5)為 1,接收幀的這 6 位必須與過濾器 ID 的000100完全一致(即 ID 的高 6 位為 0x12);掩碼的低 4 位(bit4~bit0)為 0,接收幀的這 4 位可任意(0~F),因此所有 ID 在 0x120~0x12F 范圍內(nèi)的幀都會被匹配。
以擴(kuò)展 ID(29 位) 為例:若需篩選擴(kuò)展 ID 為 0x12345000~0x12345FFF 的幀(低 8 位任意),過濾器 ID 設(shè)為 0x12345000,過濾器掩碼設(shè)為 0xFFFFFF00。掩碼的高 21 位為 1,需嚴(yán)格匹配 0x12345;低 8 位為 0,可任意,實現(xiàn)對該范圍 ID 的篩選。
掩碼模式的優(yōu)勢是 “一規(guī)則覆蓋多 ID”,節(jié)省過濾器組資源;缺點是無法排除 “范圍內(nèi)不需要的 ID”—— 例如,若 0x120~0x12F 中包含不需要的 0x128 幀,掩碼模式無法單獨排除,需結(jié)合軟件二次篩選(但仍比無過濾器時節(jié)省資源)。
(2)列表模式:精準(zhǔn)的 “枚舉匹配”
列表模式(也稱為 “標(biāo)識符列表模式”)將過濾器 ID 寄存器直接作為 “目標(biāo) ID 列表”,接收幀的 ID 需與列表中的某一個 ID 完全一致才能通過篩選。其核心邏輯是:過濾器組的兩個寄存器(Filter ID1 與 Filter ID2)可存儲兩個目標(biāo) ID,接收幀的 ID 只需與其中一個完全匹配(標(biāo)準(zhǔn) ID 需 11 位全一致,擴(kuò)展 ID 需 29 位全一致),即可通過過濾。部分高端 CAN 控制器(如 STM32H7 的 bxCAN)支持 “擴(kuò)展列表模式”,可通過多個過濾器組級聯(lián),實現(xiàn)更多 ID 的精準(zhǔn)匹配。
例如,某工業(yè) PLC 需精準(zhǔn)接收 ID 為 0x001(緊急停止幀)、0x002(啟動幀)、0x003(暫停幀)的三個關(guān)鍵幀,可配置兩個過濾器組:
過濾器組 1:Filter ID1=0x001,Filter ID2=0x002(列表模式,標(biāo)準(zhǔn) ID);
過濾器組 2:Filter ID1=0x003,Filter ID2=0x003(列表模式,標(biāo)準(zhǔn) ID,重復(fù)配置以僅匹配 0x003)。
此時,只有 ID 為 0x001、0x002、0x003 的幀能通過過濾,其他 ID(如 0x004、0x123)會被直接丟棄。
列表模式的優(yōu)勢是 “精準(zhǔn)篩選,無冗余數(shù)據(jù)”,適合需要嚴(yán)格控制接收 ID 的場景(如安全相關(guān)幀);缺點是 “一 ID 需一規(guī)則”,過濾器組資源消耗大 —— 若需匹配 10 個 ID,至少需要 5 個過濾器組(每個組存 2 個 ID),不適用于多 ID 篩選場景。
3. ID 類型:標(biāo)準(zhǔn) ID 與擴(kuò)展 ID 的匹配適配
CAN 幀的 ID 分為 “標(biāo)準(zhǔn) ID(11 位)” 與 “擴(kuò)展 ID(29 位)”,過濾器需先配置 “ID 類型”,確保與接收幀的 ID 位寬一致,否則會導(dǎo)致匹配失效。
標(biāo)準(zhǔn) ID 過濾:過濾器僅匹配 11 位 ID 的 CAN 幀(CAN 2.0A 協(xié)議),過濾器 ID 寄存器的高 11 位存儲目標(biāo) ID,低 18 位(擴(kuò)展位寬)無效或設(shè)為 0;
擴(kuò)展 ID 過濾:過濾器僅匹配 29 位 ID 的 CAN 幀(CAN 2.0B 協(xié)議),過濾器 ID 寄存器的高 29 位存儲目標(biāo) ID,低 3 位無效或設(shè)為 0。
部分 CAN 控制器支持 “混合模式”(如 SJA1000 的 “雙緩沖器模式”),可同時接收標(biāo)準(zhǔn) ID 與擴(kuò)展 ID 幀,但過濾器需分別配置 —— 例如,用一個過濾器組匹配標(biāo)準(zhǔn) ID,另一個過濾器組匹配擴(kuò)展 ID,避免 ID 類型混淆導(dǎo)致的過濾錯誤。
4. 接收 FIFO:過濾后數(shù)據(jù)的暫存區(qū)
通過過濾的 CAN 幀會被存入 CAN 控制器的 “接收 FIFO”(通常包含 FIFO0 與 FIFO1 兩個獨立 FIFO),FIFO 的作用是 “暫存有效數(shù)據(jù),避免 MCU 讀取不及時導(dǎo)致的數(shù)據(jù)丟失”。每個 FIFO 有固定的深度(如 STM32 的 bxCAN FIFO 深度為 3 級,可存儲 3 幀數(shù)據(jù)),當(dāng) FIFO 未滿時,新過濾后的幀會依次存入;當(dāng) FIFO 滿時,新幀的處理策略由 “FIFO 溢出模式” 決定:
丟棄模式:新幀直接丟棄,僅保留 FIFO 中的舊數(shù)據(jù);
覆蓋模式:新幀覆蓋 FIFO 中最早存入的幀(FIFO 頭部數(shù)據(jù)),確保最新數(shù)據(jù)不丟失(適用于實時性要求高的場景)。
MCU 通過讀取 FIFO 中的數(shù)據(jù)(如讀取 CAN_RIR 寄存器獲取 ID,CAN_RDLR/CAN_RDHR 寄存器獲取數(shù)據(jù)),完成有效幀的處理;處理后需通過 “釋放 FIFO” 操作(如讀取 FIFO 后自動釋放,或通過寄存器手動釋放),為新幀騰出空間。
(二)過濾器的工作流程:從幀接收到數(shù)據(jù)存儲
CAN 過濾器的工作流程是 “硬件自動執(zhí)行” 的,無需 MCU 干預(yù),核心步驟可分為四步:
幀接收與 ID 提?。?span>CAN 控制器接收總線上的差分信號,解析出 CAN 幀的結(jié)構(gòu)(幀起始、ID 場、控制場、數(shù)據(jù)場、CRC 場、ACK 場),并提取 ID 場的二進(jìn)制數(shù)據(jù)(11 位標(biāo)準(zhǔn) ID 或 29 位擴(kuò)展 ID),暫存到 “臨時 ID 寄存器”。
過濾器激活判斷:控制器檢查當(dāng)前配置的過濾器組是否處于 “激活狀態(tài)”(通過控制寄存器的 “激活位” 判斷)—— 未激活的過濾器組不參與匹配,所有幀直接進(jìn)入 FIFO(或丟棄,取決于控制器配置);激活的過濾器組進(jìn)入下一步匹配。
ID 匹配與規(guī)則判斷:激活的過濾器組根據(jù)預(yù)設(shè)的 “過濾模式” 與 “ID 類型”,對臨時 ID 寄存器中的 ID 進(jìn)行匹配:
若為掩碼模式:將臨時 ID 與過濾器 ID 進(jìn)行 “按位與” 運算,再與 “過濾器 ID & 過濾器掩碼” 的結(jié)果比較 —— 若一致,說明 ID 符合規(guī)則;若不一致,判定為無效幀。
若為列表模式:將臨時 ID 與過濾器 ID1、過濾器 ID2 分別比較 —— 若與任意一個 ID 完全一致,判定為有效幀;若均不一致,判定為無效幀。
有效幀存儲與無效幀丟棄:
有效幀:控制器將完整的 CAN 幀(ID + 數(shù)據(jù) + 狀態(tài))存入關(guān)聯(lián)的接收 FIFO(FIFO0 或 FIFO1),若 FIFO 未滿,直接存入;若 FIFO 滿,按溢出模式處理(丟棄或覆蓋),同時置位 “FIFO 滿標(biāo)志”,提醒 MCU 及時讀取。
無效幀:控制器直接丟棄該幀,不占用 FIFO 資源,也不觸發(fā) MCU 中斷,僅更新 “無效幀計數(shù)寄存器”(部分控制器支持),用于后續(xù)故障排查。
整個流程的耗時均為 “硬件級速度”(通常為幾十納秒),遠(yuǎn)快于 MCU 的軟件解析速度(需數(shù)百納秒到微秒),確保了篩選的高效性。