ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
mcp2515.h
Go to the documentation of this file.
1#pragma once
2
6#include "mcp2515_defs.h"
7
8namespace esphome::mcp2515 {
9static const uint32_t SPI_CLOCK = 10000000; // 10MHz
10
11static const int N_TXBUFFERS = 3;
12static const int N_RXBUFFERS = 2;
14enum MASK { MASK0, MASK1 };
15enum RXF { RXF0 = 0, RXF1 = 1, RXF2 = 2, RXF3 = 3, RXF4 = 4, RXF5 = 5 };
16enum RXBn { RXB0 = 0, RXB1 = 1 };
17enum TXBn { TXB0 = 0, TXB1 = 1, TXB2 = 2 };
18
26
27enum CANINTF : uint8_t {
35 CANINTF_MERRF = 0x80
36};
37
38enum EFLG : uint8_t {
39 EFLG_RX1OVR = (1 << 7),
40 EFLG_RX0OVR = (1 << 6),
41 EFLG_TXBO = (1 << 5),
42 EFLG_TXEP = (1 << 4),
43 EFLG_RXEP = (1 << 3),
44 EFLG_TXWAR = (1 << 2),
45 EFLG_RXWAR = (1 << 1),
46 EFLG_EWARN = (1 << 0)
47};
48
49enum STAT : uint8_t { STAT_RX0IF = (1 << 0), STAT_RX1IF = (1 << 1) };
50
51static const uint8_t STAT_RXIF_MASK = STAT_RX0IF | STAT_RX1IF;
52static const uint8_t EFLG_ERRORMASK = EFLG_RX1OVR | EFLG_RX0OVR | EFLG_TXBO | EFLG_TXEP | EFLG_RXEP;
53
54class MCP2515 : public canbus::Canbus,
55 public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
56 spi::DATA_RATE_8MHZ> {
57 public:
59 void set_mcp_clock(CanClock clock) { this->mcp_clock_ = clock; };
61 static const struct TxBnRegs {
62 REGISTER CTRL;
63 REGISTER SIDH;
64 REGISTER DATA;
65 } TXB[N_TXBUFFERS];
66
67 static const struct RxBnRegs {
68 REGISTER CTRL;
69 REGISTER SIDH;
70 REGISTER DATA;
71 CANINTF CANINTF_RXnIF;
72 } RXB[N_RXBUFFERS];
73
74 protected:
77 bool setup_internal() override;
79
80 uint8_t read_register_(REGISTER reg);
81 void read_registers_(REGISTER reg, uint8_t values[], uint8_t n);
82 void set_register_(REGISTER reg, uint8_t value);
83 void set_registers_(REGISTER reg, uint8_t values[], uint8_t n);
84 void modify_register_(REGISTER reg, uint8_t mask, uint8_t data);
85
86 void prepare_id_(uint8_t *buffer, bool extended, uint32_t id);
91 canbus::Error set_filter_mask_(MASK mask, bool extended, uint32_t ul_data);
92 canbus::Error set_filter_(RXF num, bool extended, uint32_t ul_data);
94 canbus::Error send_message(struct canbus::CanFrame *frame) override;
96 canbus::Error read_message(struct canbus::CanFrame *frame) override;
97 bool check_receive_();
98 bool check_error_();
99 uint8_t get_error_flags_();
101 uint8_t get_int_();
102 uint8_t get_int_mask_();
103 void clear_int_();
104 void clear_tx_int_();
105 uint8_t get_status_();
106 void clear_rx_n_ovr_();
107 void clear_merr_();
108 void clear_errif_();
109};
110} // namespace esphome::mcp2515
BedjetMode mode
BedJet operating mode.
canbus::Error reset_()
Definition mcp2515.cpp:46
static const struct esphome::mcp2515::MCP2515::RxBnRegs RXB[N_RXBUFFERS]
Definition mcp2515.cpp:12
void modify_register_(REGISTER reg, uint8_t mask, uint8_t data)
Definition mcp2515.cpp:114
canbus::Error set_filter_mask_(MASK mask, bool extended, uint32_t ul_data)
Definition mcp2515.cpp:184
void prepare_id_(uint8_t *buffer, bool extended, uint32_t id)
Definition mcp2515.cpp:165
void read_registers_(REGISTER reg, uint8_t values[], uint8_t n)
Definition mcp2515.cpp:83
void set_mcp_mode(const CanctrlReqopMode mode)
Definition mcp2515.h:60
uint8_t read_register_(REGISTER reg)
Definition mcp2515.cpp:73
void set_mcp_clock(CanClock clock)
Definition mcp2515.h:59
void set_registers_(REGISTER reg, uint8_t values[], uint8_t n)
Definition mcp2515.cpp:103
CanctrlReqopMode mcp_mode_
Definition mcp2515.h:76
static const struct esphome::mcp2515::MCP2515::TxBnRegs TXB[N_TXBUFFERS]
Definition mcp2515.cpp:8
canbus::Error send_message(struct canbus::CanFrame *frame) override
Definition mcp2515.cpp:263
bool setup_internal() override
Definition mcp2515.cpp:15
void set_register_(REGISTER reg, uint8_t value)
Definition mcp2515.cpp:95
canbus::Error set_filter_(RXF num, bool extended, uint32_t ul_data)
Definition mcp2515.cpp:210
canbus::Error set_mode_(CanctrlReqopMode mode)
Definition mcp2515.cpp:132
canbus::Error send_message_(TXBn txbn, struct canbus::CanFrame *frame)
Definition mcp2515.cpp:248
canbus::Error read_message(struct canbus::CanFrame *frame) override
Definition mcp2515.cpp:322
canbus::Error set_clk_out_(CanClkOut divisor)
Definition mcp2515.cpp:144
canbus::Error read_message_(RXBn rxbn, struct canbus::CanFrame *frame)
Definition mcp2515.cpp:280
canbus::Error set_bitrate_(canbus::CanSpeed can_speed)
Definition mcp2515.cpp:391
The SPIDevice is what components using the SPI will create.
Definition spi.h:429
static void uint32_t