Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions vehicle/OVMS.V3/components/mcp2515/src/mcp2515.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 2 additions & 0 deletions vehicle/OVMS.V3/components/mcp2515/src/mcp2515.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
1 change: 1 addition & 0 deletions vehicle/OVMS.V3/components/mcp2515/src/mcp2515_regdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down