7 static const char *
const TAG =
"mcp2515";
16 bool MCP2515::setup_internal() {
21 this->set_bitrate_(this->bit_rate_, this->mcp_clock_);
22 this->set_mode_(this->mcp_mode_);
23 ESP_LOGV(TAG,
"setup done");
31 ESP_LOGV(TAG,
"reset_()");
34 ESP_LOGV(TAG,
"reset() CLEAR ALL TXB registers");
37 memset(zeros, 0,
sizeof(zeros));
41 ESP_LOGD(TAG,
"reset() CLEARED TXB registers");
48 modify_register_(
MCP_RXB0CTRL, RXB_CTRL_RXM_MASK | RXB_0_CTRL_BUKT, RXB_CTRL_RXM_STDEXT | RXB_0_CTRL_BUKT);
49 modify_register_(
MCP_RXB1CTRL, RXB_CTRL_RXM_MASK, RXB_CTRL_RXM_STDEXT);
54 uint8_t MCP2515::read_register_(
const REGISTER reg) {
57 this->transfer_byte(reg);
58 uint8_t ret = this->transfer_byte(0x00);
64 void MCP2515::read_registers_(
const REGISTER reg, uint8_t values[],
const uint8_t n) {
67 this->transfer_byte(reg);
70 for (uint8_t i = 0; i < n; i++) {
71 values[i] = this->transfer_byte(0x00);
76 void MCP2515::set_register_(
const REGISTER reg,
const uint8_t value) {
79 this->transfer_byte(reg);
80 this->transfer_byte(value);
84 void MCP2515::set_registers_(
const REGISTER reg, uint8_t values[],
const uint8_t n) {
87 this->transfer_byte(reg);
89 for (uint8_t i = 0; i < n; i++) {
90 this->transfer_byte(values[i]);
95 void MCP2515::modify_register_(
const REGISTER reg,
const uint8_t mask,
const uint8_t data) {
98 this->transfer_byte(reg);
99 this->transfer_byte(mask);
100 this->transfer_byte(data);
104 uint8_t MCP2515::get_status_() {
107 uint8_t i = this->transfer_byte(0x00);
114 modify_register_(
MCP_CANCTRL, CANCTRL_REQOP, mode);
116 uint32_t end_time =
millis() + 10;
117 bool mode_match =
false;
118 while (
millis() < end_time) {
120 new_mode &= CANSTAT_OPMOD;
121 mode_match = new_mode ==
mode;
132 modify_register_(
MCP_CANCTRL, CANCTRL_CLKEN, 0x00);
135 modify_register_(
MCP_CNF3, CNF3_SOF, CNF3_SOF);
140 modify_register_(
MCP_CANCTRL, CANCTRL_CLKPRE, divisor);
143 modify_register_(
MCP_CANCTRL, CANCTRL_CLKEN, CANCTRL_CLKEN);
146 modify_register_(
MCP_CNF3, CNF3_SOF, 0x00);
150 void MCP2515::prepare_id_(uint8_t *buffer,
const bool extended,
const uint32_t
id) {
151 uint16_t canid = (uint16_t)(
id & 0x0FFFF);
154 buffer[MCP_EID0] = (uint8_t)(canid & 0xFF);
155 buffer[MCP_EID8] = (uint8_t)(canid >> 8);
156 canid = (uint16_t)(
id >> 16);
157 buffer[MCP_SIDL] = (uint8_t)(canid & 0x03);
158 buffer[MCP_SIDL] += (uint8_t)((canid & 0x1C) << 3);
159 buffer[MCP_SIDL] |= TXB_EXIDE_MASK;
160 buffer[MCP_SIDH] = (uint8_t)(canid >> 5);
162 buffer[MCP_SIDH] = (uint8_t)(canid >> 3);
163 buffer[MCP_SIDL] = (uint8_t)((canid & 0x07) << 5);
164 buffer[MCP_EID0] = 0;
165 buffer[MCP_EID8] = 0;
169 canbus::Error MCP2515::set_filter_mask_(
const MASK mask,
const bool extended,
const uint32_t ul_data) {
176 prepare_id_(tbufdata, extended, ul_data);
190 set_registers_(reg, tbufdata, 4);
195 canbus::Error MCP2515::set_filter_(
const RXF num,
const bool extended,
const uint32_t ul_data) {
227 prepare_id_(tbufdata, extended, ul_data);
228 set_registers_(reg, tbufdata, 4);
234 const struct TxBnRegs *txbuf = &TXB[txbn];
254 for (
auto &tx_buffer : tx_buffers) {
255 const struct TxBnRegs *txbuf = &TXB[tx_buffer];
256 uint8_t ctrlval = read_register_(txbuf->CTRL);
258 return send_message_(tx_buffer, frame);
266 const struct RxBnRegs *rxb = &RXB[rxbn];
270 read_registers_(rxb->SIDH, tbufdata, 5);
272 uint32_t
id = (tbufdata[MCP_SIDH] << 3) + (tbufdata[MCP_SIDL] >> 5);
273 bool use_extended_id =
false;
274 bool remote_transmission_request =
false;
276 if ((tbufdata[MCP_SIDL] & TXB_EXIDE_MASK) == TXB_EXIDE_MASK) {
277 id = (
id << 2) + (tbufdata[MCP_SIDL] & 0x03);
278 id = (
id << 8) + tbufdata[MCP_EID8];
279 id = (
id << 8) + tbufdata[MCP_EID0];
281 use_extended_id =
true;
284 uint8_t dlc = (tbufdata[MCP_DLC] & DLC_MASK);
285 if (dlc > canbus::CAN_MAX_DATA_LENGTH) {
289 uint8_t ctrl = read_register_(rxb->CTRL);
290 if (ctrl & RXB_CTRL_RTR) {
292 remote_transmission_request =
true;
300 read_registers_(rxb->DATA, frame->data, dlc);
302 modify_register_(
MCP_CANINTF, rxb->CANINTF_RXnIF, 0);
309 uint8_t stat = get_status_();
312 rc = read_message_(
RXB0, frame);
314 rc = read_message_(
RXB1, frame);
322 bool MCP2515::check_receive_() {
323 uint8_t res = get_status_();
324 return (res & STAT_RXIF_MASK) != 0;
327 bool MCP2515::check_error_() {
328 uint8_t eflg = get_error_flags_();
329 return (eflg & EFLG_ERRORMASK) != 0;
332 uint8_t MCP2515::get_error_flags_() {
return read_register_(
MCP_EFLG); }
336 uint8_t MCP2515::get_int_() {
return read_register_(
MCP_CANINTF); }
338 void MCP2515::clear_int_() { set_register_(
MCP_CANINTF, 0); }
340 uint8_t MCP2515::get_int_mask_() {
return read_register_(
MCP_CANINTE); }
344 void MCP2515::clear_rx_n_ovr_() {
345 uint8_t eflg = get_error_flags_();
347 clear_rx_n_ovr_flags_();
353 void MCP2515::clear_merr_() {
359 void MCP2515::clear_errif_() {
373 uint8_t
set, cfg1, cfg2, cfg3;
379 cfg1 = MCP_8MHZ_5KBPS_CFG1;
380 cfg2 = MCP_8MHZ_5KBPS_CFG2;
381 cfg3 = MCP_8MHZ_5KBPS_CFG3;
384 cfg1 = MCP_8MHZ_10KBPS_CFG1;
385 cfg2 = MCP_8MHZ_10KBPS_CFG2;
386 cfg3 = MCP_8MHZ_10KBPS_CFG3;
389 cfg1 = MCP_8MHZ_20KBPS_CFG1;
390 cfg2 = MCP_8MHZ_20KBPS_CFG2;
391 cfg3 = MCP_8MHZ_20KBPS_CFG3;
394 cfg1 = MCP_8MHZ_31K25BPS_CFG1;
395 cfg2 = MCP_8MHZ_31K25BPS_CFG2;
396 cfg3 = MCP_8MHZ_31K25BPS_CFG3;
399 cfg1 = MCP_8MHZ_33K3BPS_CFG1;
400 cfg2 = MCP_8MHZ_33K3BPS_CFG2;
401 cfg3 = MCP_8MHZ_33K3BPS_CFG3;
404 cfg1 = MCP_8MHZ_40KBPS_CFG1;
405 cfg2 = MCP_8MHZ_40KBPS_CFG2;
406 cfg3 = MCP_8MHZ_40KBPS_CFG3;
409 cfg1 = MCP_8MHZ_50KBPS_CFG1;
410 cfg2 = MCP_8MHZ_50KBPS_CFG2;
411 cfg3 = MCP_8MHZ_50KBPS_CFG3;
414 cfg1 = MCP_8MHZ_80KBPS_CFG1;
415 cfg2 = MCP_8MHZ_80KBPS_CFG2;
416 cfg3 = MCP_8MHZ_80KBPS_CFG3;
419 cfg1 = MCP_8MHZ_100KBPS_CFG1;
420 cfg2 = MCP_8MHZ_100KBPS_CFG2;
421 cfg3 = MCP_8MHZ_100KBPS_CFG3;
424 cfg1 = MCP_8MHZ_125KBPS_CFG1;
425 cfg2 = MCP_8MHZ_125KBPS_CFG2;
426 cfg3 = MCP_8MHZ_125KBPS_CFG3;
429 cfg1 = MCP_8MHZ_200KBPS_CFG1;
430 cfg2 = MCP_8MHZ_200KBPS_CFG2;
431 cfg3 = MCP_8MHZ_200KBPS_CFG3;
434 cfg1 = MCP_8MHZ_250KBPS_CFG1;
435 cfg2 = MCP_8MHZ_250KBPS_CFG2;
436 cfg3 = MCP_8MHZ_250KBPS_CFG3;
439 cfg1 = MCP_8MHZ_500KBPS_CFG1;
440 cfg2 = MCP_8MHZ_500KBPS_CFG2;
441 cfg3 = MCP_8MHZ_500KBPS_CFG3;
444 cfg1 = MCP_8MHZ_1000KBPS_CFG1;
445 cfg2 = MCP_8MHZ_1000KBPS_CFG2;
446 cfg3 = MCP_8MHZ_1000KBPS_CFG3;
457 cfg1 = MCP_16MHZ_5KBPS_CFG1;
458 cfg2 = MCP_16MHZ_5KBPS_CFG2;
459 cfg3 = MCP_16MHZ_5KBPS_CFG3;
462 cfg1 = MCP_16MHZ_10KBPS_CFG1;
463 cfg2 = MCP_16MHZ_10KBPS_CFG2;
464 cfg3 = MCP_16MHZ_10KBPS_CFG3;
467 cfg1 = MCP_16MHZ_20KBPS_CFG1;
468 cfg2 = MCP_16MHZ_20KBPS_CFG2;
469 cfg3 = MCP_16MHZ_20KBPS_CFG3;
472 cfg1 = MCP_16MHZ_33K3BPS_CFG1;
473 cfg2 = MCP_16MHZ_33K3BPS_CFG2;
474 cfg3 = MCP_16MHZ_33K3BPS_CFG3;
477 cfg1 = MCP_16MHZ_40KBPS_CFG1;
478 cfg2 = MCP_16MHZ_40KBPS_CFG2;
479 cfg3 = MCP_16MHZ_40KBPS_CFG3;
482 cfg2 = MCP_16MHZ_50KBPS_CFG2;
483 cfg3 = MCP_16MHZ_50KBPS_CFG3;
486 cfg1 = MCP_16MHZ_80KBPS_CFG1;
487 cfg2 = MCP_16MHZ_80KBPS_CFG2;
488 cfg3 = MCP_16MHZ_80KBPS_CFG3;
491 cfg1 = MCP_16MHZ_83K3BPS_CFG1;
492 cfg2 = MCP_16MHZ_83K3BPS_CFG2;
493 cfg3 = MCP_16MHZ_83K3BPS_CFG3;
496 cfg1 = MCP_16MHZ_100KBPS_CFG1;
497 cfg2 = MCP_16MHZ_100KBPS_CFG2;
498 cfg3 = MCP_16MHZ_100KBPS_CFG3;
501 cfg1 = MCP_16MHZ_125KBPS_CFG1;
502 cfg2 = MCP_16MHZ_125KBPS_CFG2;
503 cfg3 = MCP_16MHZ_125KBPS_CFG3;
506 cfg1 = MCP_16MHZ_200KBPS_CFG1;
507 cfg2 = MCP_16MHZ_200KBPS_CFG2;
508 cfg3 = MCP_16MHZ_200KBPS_CFG3;
511 cfg1 = MCP_16MHZ_250KBPS_CFG1;
512 cfg2 = MCP_16MHZ_250KBPS_CFG2;
513 cfg3 = MCP_16MHZ_250KBPS_CFG3;
516 cfg1 = MCP_16MHZ_500KBPS_CFG1;
517 cfg2 = MCP_16MHZ_500KBPS_CFG2;
518 cfg3 = MCP_16MHZ_500KBPS_CFG3;
521 cfg1 = MCP_16MHZ_1000KBPS_CFG1;
522 cfg2 = MCP_16MHZ_1000KBPS_CFG2;
523 cfg3 = MCP_16MHZ_1000KBPS_CFG3;
534 cfg1 = MCP_20MHZ_33K3BPS_CFG1;
535 cfg2 = MCP_20MHZ_33K3BPS_CFG2;
536 cfg3 = MCP_20MHZ_33K3BPS_CFG3;
539 cfg1 = MCP_20MHZ_40KBPS_CFG1;
540 cfg2 = MCP_20MHZ_40KBPS_CFG2;
541 cfg3 = MCP_20MHZ_40KBPS_CFG3;
544 cfg1 = MCP_20MHZ_50KBPS_CFG1;
545 cfg2 = MCP_20MHZ_50KBPS_CFG2;
546 cfg3 = MCP_20MHZ_50KBPS_CFG3;
549 cfg1 = MCP_20MHZ_80KBPS_CFG1;
550 cfg2 = MCP_20MHZ_80KBPS_CFG2;
551 cfg3 = MCP_20MHZ_80KBPS_CFG3;
554 cfg1 = MCP_20MHZ_83K3BPS_CFG1;
555 cfg2 = MCP_20MHZ_83K3BPS_CFG2;
556 cfg3 = MCP_20MHZ_83K3BPS_CFG3;
559 cfg1 = MCP_20MHZ_100KBPS_CFG1;
560 cfg2 = MCP_20MHZ_100KBPS_CFG2;
561 cfg3 = MCP_20MHZ_100KBPS_CFG3;
564 cfg1 = MCP_20MHZ_125KBPS_CFG1;
565 cfg2 = MCP_20MHZ_125KBPS_CFG2;
566 cfg3 = MCP_20MHZ_125KBPS_CFG3;
569 cfg1 = MCP_20MHZ_200KBPS_CFG1;
570 cfg2 = MCP_20MHZ_200KBPS_CFG2;
571 cfg3 = MCP_20MHZ_200KBPS_CFG3;
574 cfg1 = MCP_20MHZ_250KBPS_CFG1;
575 cfg2 = MCP_20MHZ_250KBPS_CFG2;
576 cfg3 = MCP_20MHZ_250KBPS_CFG3;
579 cfg1 = MCP_20MHZ_500KBPS_CFG1;
580 cfg2 = MCP_20MHZ_500KBPS_CFG2;
581 cfg3 = MCP_20MHZ_500KBPS_CFG3;
584 cfg1 = MCP_20MHZ_1000KBPS_CFG1;
585 cfg2 = MCP_20MHZ_1000KBPS_CFG2;
586 cfg3 = MCP_20MHZ_1000KBPS_CFG3;
uint8_t can_data_length_code
T id(T value)
Helper function to make id(var) known from lambdas work in custom components.
uint32_t IRAM_ATTR HOT millis()
bool remote_transmission_request
BedjetMode mode
BedJet operating mode.
void IRAM_ATTR HOT delay(uint32_t ms)