diff --git a/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.cpp b/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.cpp index 9f8111780..652512321 100644 --- a/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.cpp +++ b/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.cpp @@ -273,6 +273,14 @@ esp_err_t mcp2515::Start(CAN_mode_t mode, CAN_speed_t speed) // And record that we are powered on pcp::SetPowerMode(On); + // Re-apply acceptance filter if one was configured — Start() resets RXMODE to 3 + // (receive all), which would bypass the hardware filter on every power cycle. + if (m_filter_set) + { + if (SetAcceptanceFilter(m_filter_cfg) != ESP_OK) + ESP_LOGE(TAG, "%s: failed to restore acceptance filter after start", this->GetName()); + } + return ESP_OK; } @@ -381,12 +389,23 @@ esp_err_t mcp2515::SetAcceptanceFilter(const mcp2515_filter_config_t& cfg) cfg.mask[0].u8[3], cfg.mask[0].u8[2], cfg.mask[0].u8[1],cfg.mask[0].u8[0], cfg.mask[1].u8[3], cfg.mask[1].u8[2], cfg.mask[1].u8[1],cfg.mask[1].u8[0]); + // Set RXMODE=0 (filter-matched receive) on both RX buffers. + // Start() hardcodes RXB0CTRL RXMODE=3 (receive all) for backwards compatibility, + // which silently bypasses the acceptance filters. Switch to filtered mode now that + // filters are configured. BUKT (rollover) bit in RXB0CTRL is preserved via mask. + // With mask=0 (all bits don't-care) every frame still matches, so callers that pass + // all-zero masks get the same promiscuous behaviour as before. + m_spibus->spi_cmd(m_spi, buf, 0, 4, CMD_BITMODIFY, REG_RXB0CTRL, 0b01100000, 0b00000000); + m_spibus->spi_cmd(m_spi, buf, 0, 4, CMD_BITMODIFY, REG_RXB1CTRL, 0b01100000, 0b00000000); + // Exit config mode if (prev_mode != CANCTRL_MODE_CONFIG && ChangeMode(prev_mode) != ESP_OK) { return ESP_FAIL; } + m_filter_cfg = cfg; + m_filter_set = true; return ESP_OK; } diff --git a/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.h b/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.h index 7c0b41dda..67cae21b3 100644 --- a/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.h +++ b/vehicle/OVMS.V3/components/mcp2515/src/mcp2515.h @@ -110,6 +110,8 @@ class mcp2515 : public canbus int m_intpin; uint8_t m_last_errflag = 0; uint8_t m_canctrl_mode; + bool m_filter_set = false; + mcp2515_filter_config_t m_filter_cfg = {}; OvmsMutex m_write_mutex; OvmsCommand* m_cmd_canx; }; diff --git a/vehicle/OVMS.V3/components/mcp2515/src/mcp2515_regdef.h b/vehicle/OVMS.V3/components/mcp2515/src/mcp2515_regdef.h index 3876f762c..fe4f8668b 100644 --- a/vehicle/OVMS.V3/components/mcp2515/src/mcp2515_regdef.h +++ b/vehicle/OVMS.V3/components/mcp2515/src/mcp2515_regdef.h @@ -115,6 +115,7 @@ #define REG_TXB1CTRL 0x40 #define REG_TXB2CTRL 0x50 #define REG_RXB0CTRL 0x60 +#define REG_RXB1CTRL 0x70 #define MCP2515_TIMEOUT 100 // Timeout for register verification, in milliseconds