ESPHome 2025.5.0
Loading...
Searching...
No Matches
mcp2515.cpp
Go to the documentation of this file.
1#include "mcp2515.h"
2#include "esphome/core/log.h"
3
4namespace esphome {
5namespace mcp2515 {
6
7static const char *const TAG = "mcp2515";
8
9const struct MCP2515::TxBnRegs MCP2515::TXB[N_TXBUFFERS] = {{MCP_TXB0CTRL, MCP_TXB0SIDH, MCP_TXB0DATA},
12
13const struct MCP2515::RxBnRegs MCP2515::RXB[N_RXBUFFERS] = {{MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA, CANINTF_RX0IF},
15
17 this->spi_setup();
18
19 if (this->reset_() != canbus::ERROR_OK)
20 return false;
21 if (this->set_bitrate_(this->bit_rate_, this->mcp_clock_) != canbus::ERROR_OK)
22 return false;
23 if (this->set_mode_(this->mcp_mode_) != canbus::ERROR_OK)
24 return false;
25 uint8_t err_flags = this->get_error_flags_();
26 ESP_LOGD(TAG, "mcp2515 setup done, error_flags = %02X", err_flags);
27 return true;
28}
29
31 this->enable();
33 this->disable();
34 ESP_LOGV(TAG, "reset_()");
35 delay(10);
36
37 ESP_LOGV(TAG, "reset() CLEAR ALL TXB registers");
38
39 uint8_t zeros[14];
40 memset(zeros, 0, sizeof(zeros));
41 set_registers_(MCP_TXB0CTRL, zeros, 14);
42 set_registers_(MCP_TXB1CTRL, zeros, 14);
43 set_registers_(MCP_TXB2CTRL, zeros, 14);
44 ESP_LOGV(TAG, "reset() CLEARED TXB registers");
45
48
50
51 modify_register_(MCP_RXB0CTRL, RXB_CTRL_RXM_MASK | RXB_0_CTRL_BUKT, RXB_CTRL_RXM_STDEXT | RXB_0_CTRL_BUKT);
52 modify_register_(MCP_RXB1CTRL, RXB_CTRL_RXM_MASK, RXB_CTRL_RXM_STDEXT);
53
54 return canbus::ERROR_OK;
55}
56
58 this->enable();
60 this->transfer_byte(reg);
61 uint8_t ret = this->transfer_byte(0x00);
62 this->disable();
63
64 return ret;
65}
66
67void MCP2515::read_registers_(const REGISTER reg, uint8_t values[], const uint8_t n) {
68 this->enable();
70 this->transfer_byte(reg);
71 // this->transfer_array(values, n);
72 // mcp2515 has auto - increment of address - pointer
73 for (uint8_t i = 0; i < n; i++) {
74 values[i] = this->transfer_byte(0x00);
75 }
76 this->disable();
77}
78
79void MCP2515::set_register_(const REGISTER reg, const uint8_t value) {
80 this->enable();
82 this->transfer_byte(reg);
83 this->transfer_byte(value);
84 this->disable();
85}
86
87void MCP2515::set_registers_(const REGISTER reg, uint8_t values[], const uint8_t n) {
88 this->enable();
90 this->transfer_byte(reg);
91 // this->transfer_array(values, n);
92 for (uint8_t i = 0; i < n; i++) {
93 this->transfer_byte(values[i]);
94 }
95 this->disable();
96}
97
98void MCP2515::modify_register_(const REGISTER reg, const uint8_t mask, const uint8_t data) {
99 this->enable();
101 this->transfer_byte(reg);
102 this->transfer_byte(mask);
103 this->transfer_byte(data);
104 this->disable();
105}
106
108 this->enable();
110 uint8_t i = this->transfer_byte(0x00);
111 this->disable();
112
113 return i;
114}
115
117 modify_register_(MCP_CANCTRL, CANCTRL_REQOP, mode);
118
119 uint32_t end_time = millis() + 10;
120 while (millis() < end_time) {
121 if ((read_register_(MCP_CANSTAT) & CANSTAT_OPMOD) == mode)
122 return canbus::ERROR_OK;
123 }
124 ESP_LOGE(TAG, "Failed to set mode");
125 return canbus::ERROR_FAIL;
126}
127
129 if (divisor == CLKOUT_DISABLE) {
130 /* Turn off CLKEN */
131 modify_register_(MCP_CANCTRL, CANCTRL_CLKEN, 0x00);
132
133 /* Turn on CLKOUT for SOF */
134 modify_register_(MCP_CNF3, CNF3_SOF, CNF3_SOF);
135 return canbus::ERROR_OK;
136 }
137
138 /* Set the prescaler (CLKPRE) */
139 modify_register_(MCP_CANCTRL, CANCTRL_CLKPRE, divisor);
140
141 /* Turn on CLKEN */
142 modify_register_(MCP_CANCTRL, CANCTRL_CLKEN, CANCTRL_CLKEN);
143
144 /* Turn off CLKOUT for SOF */
145 modify_register_(MCP_CNF3, CNF3_SOF, 0x00);
146 return canbus::ERROR_OK;
147}
148
149void MCP2515::prepare_id_(uint8_t *buffer, const bool extended, const uint32_t id) {
150 uint16_t canid = (uint16_t) (id & 0x0FFFF);
151
152 if (extended) {
153 buffer[MCP_EID0] = (uint8_t) (canid & 0xFF);
154 buffer[MCP_EID8] = (uint8_t) (canid >> 8);
155 canid = (uint16_t) (id >> 16);
156 buffer[MCP_SIDL] = (uint8_t) (canid & 0x03);
157 buffer[MCP_SIDL] += (uint8_t) ((canid & 0x1C) << 3);
158 buffer[MCP_SIDL] |= TXB_EXIDE_MASK;
159 buffer[MCP_SIDH] = (uint8_t) (canid >> 5);
160 } else {
161 buffer[MCP_SIDH] = (uint8_t) (canid >> 3);
162 buffer[MCP_SIDL] = (uint8_t) ((canid & 0x07) << 5);
163 buffer[MCP_EID0] = 0;
164 buffer[MCP_EID8] = 0;
165 }
166}
167
168canbus::Error MCP2515::set_filter_mask_(const MASK mask, const bool extended, const uint32_t ul_data) {
170 if (res != canbus::ERROR_OK) {
171 return res;
172 }
173
174 uint8_t tbufdata[4];
175 prepare_id_(tbufdata, extended, ul_data);
176
177 REGISTER reg;
178 switch (mask) {
179 case MASK0:
180 reg = MCP_RXM0SIDH;
181 break;
182 case MASK1:
183 reg = MCP_RXM1SIDH;
184 break;
185 default:
186 return canbus::ERROR_FAIL;
187 }
188
189 set_registers_(reg, tbufdata, 4);
190
191 return canbus::ERROR_OK;
192}
193
194canbus::Error MCP2515::set_filter_(const RXF num, const bool extended, const uint32_t ul_data) {
196 if (res != canbus::ERROR_OK) {
197 return res;
198 }
199
200 REGISTER reg;
201
202 switch (num) {
203 case RXF0:
204 reg = MCP_RXF0SIDH;
205 break;
206 case RXF1:
207 reg = MCP_RXF1SIDH;
208 break;
209 case RXF2:
210 reg = MCP_RXF2SIDH;
211 break;
212 case RXF3:
213 reg = MCP_RXF3SIDH;
214 break;
215 case RXF4:
216 reg = MCP_RXF4SIDH;
217 break;
218 case RXF5:
219 reg = MCP_RXF5SIDH;
220 break;
221 default:
222 return canbus::ERROR_FAIL;
223 }
224
225 uint8_t tbufdata[4];
226 prepare_id_(tbufdata, extended, ul_data);
227 set_registers_(reg, tbufdata, 4);
228
229 return canbus::ERROR_OK;
230}
231
233 const struct TxBnRegs *txbuf = &TXB[txbn];
234
235 uint8_t data[13];
236
237 prepare_id_(data, frame->use_extended_id, frame->can_id);
238 data[MCP_DLC] =
239 frame->remote_transmission_request ? (frame->can_data_length_code | RTR_MASK) : frame->can_data_length_code;
240 memcpy(&data[MCP_DATA], frame->data, frame->can_data_length_code);
241 set_registers_(txbuf->SIDH, data, 5 + frame->can_data_length_code);
242 modify_register_(txbuf->CTRL, TXB_TXREQ, TXB_TXREQ);
243
244 return canbus::ERROR_OK;
245}
246
248 if (frame->can_data_length_code > canbus::CAN_MAX_DATA_LENGTH) {
250 }
251 TXBn tx_buffers[N_TXBUFFERS] = {TXB0, TXB1, TXB2};
252
253 for (auto &tx_buffer : tx_buffers) {
254 const struct TxBnRegs *txbuf = &TXB[tx_buffer];
255 uint8_t ctrlval = read_register_(txbuf->CTRL);
256 if ((ctrlval & TXB_TXREQ) == 0) {
257 return send_message_(tx_buffer, frame);
258 }
259 }
260
262}
263
265 const struct RxBnRegs *rxb = &RXB[rxbn];
266
267 uint8_t tbufdata[5];
268
269 read_registers_(rxb->SIDH, tbufdata, 5);
270
271 uint32_t id = (tbufdata[MCP_SIDH] << 3) + (tbufdata[MCP_SIDL] >> 5);
272 bool use_extended_id = false;
273 bool remote_transmission_request = false;
274
275 if ((tbufdata[MCP_SIDL] & TXB_EXIDE_MASK) == TXB_EXIDE_MASK) {
276 id = (id << 2) + (tbufdata[MCP_SIDL] & 0x03);
277 id = (id << 8) + tbufdata[MCP_EID8];
278 id = (id << 8) + tbufdata[MCP_EID0];
279 // id |= canbus::CAN_EFF_FLAG;
280 use_extended_id = true;
281 }
282
283 uint8_t dlc = (tbufdata[MCP_DLC] & DLC_MASK);
284 if (dlc > canbus::CAN_MAX_DATA_LENGTH) {
285 return canbus::ERROR_FAIL;
286 }
287
288 uint8_t ctrl = read_register_(rxb->CTRL);
289 if (ctrl & RXB_CTRL_RTR) {
290 // id |= canbus::CAN_RTR_FLAG;
291 remote_transmission_request = true;
292 }
293
294 frame->can_id = id;
295 frame->can_data_length_code = dlc;
296 frame->use_extended_id = use_extended_id;
297 frame->remote_transmission_request = remote_transmission_request;
298
299 read_registers_(rxb->DATA, frame->data, dlc);
300
301 modify_register_(MCP_CANINTF, rxb->CANINTF_RXnIF, 0);
302
303 return canbus::ERROR_OK;
304}
305
307 canbus::Error rc;
308 uint8_t stat = get_status_();
309
310 if (stat & STAT_RX0IF) {
311 rc = read_message_(RXB0, frame);
312 } else if (stat & STAT_RX1IF) {
313 rc = read_message_(RXB1, frame);
314 } else {
316 }
317
318 return rc;
319}
320
322 uint8_t res = get_status_();
323 return (res & STAT_RXIF_MASK) != 0;
324}
325
327 uint8_t eflg = get_error_flags_();
328 return (eflg & EFLG_ERRORMASK) != 0;
329}
330
332
334
336
338
340
342
344 uint8_t eflg = get_error_flags_();
345 if (eflg != 0) {
347 clear_int_();
348 // modify_register_(MCP_CANINTF, CANINTF_ERRIF, 0);
349 }
350}
351
353 // modify_register_(MCP_EFLG, EFLG_RX0OVR | EFLG_RX1OVR, 0);
354 // clear_int_();
356}
357
359 // modify_register_(MCP_EFLG, EFLG_RX0OVR | EFLG_RX1OVR, 0);
360 // clear_int_();
362}
363
365
368 if (error != canbus::ERROR_OK) {
369 return error;
370 }
371
372 uint8_t set, cfg1, cfg2, cfg3;
373 set = 1;
374 switch (can_clock) {
375 case (MCP_8MHZ):
376 switch (can_speed) {
377 case (canbus::CAN_5KBPS): // 5KBPS
378 cfg1 = MCP_8MHZ_5KBPS_CFG1;
379 cfg2 = MCP_8MHZ_5KBPS_CFG2;
380 cfg3 = MCP_8MHZ_5KBPS_CFG3;
381 break;
382 case (canbus::CAN_10KBPS): // 10KBPS
383 cfg1 = MCP_8MHZ_10KBPS_CFG1;
384 cfg2 = MCP_8MHZ_10KBPS_CFG2;
385 cfg3 = MCP_8MHZ_10KBPS_CFG3;
386 break;
387 case (canbus::CAN_20KBPS): // 20KBPS
388 cfg1 = MCP_8MHZ_20KBPS_CFG1;
389 cfg2 = MCP_8MHZ_20KBPS_CFG2;
390 cfg3 = MCP_8MHZ_20KBPS_CFG3;
391 break;
392 case (canbus::CAN_31K25BPS): // 31.25KBPS
393 cfg1 = MCP_8MHZ_31K25BPS_CFG1;
394 cfg2 = MCP_8MHZ_31K25BPS_CFG2;
395 cfg3 = MCP_8MHZ_31K25BPS_CFG3;
396 break;
397 case (canbus::CAN_33KBPS): // 33.333KBPS
398 cfg1 = MCP_8MHZ_33K3BPS_CFG1;
399 cfg2 = MCP_8MHZ_33K3BPS_CFG2;
400 cfg3 = MCP_8MHZ_33K3BPS_CFG3;
401 break;
402 case (canbus::CAN_40KBPS): // 40Kbps
403 cfg1 = MCP_8MHZ_40KBPS_CFG1;
404 cfg2 = MCP_8MHZ_40KBPS_CFG2;
405 cfg3 = MCP_8MHZ_40KBPS_CFG3;
406 break;
407 case (canbus::CAN_50KBPS): // 50Kbps
408 cfg1 = MCP_8MHZ_50KBPS_CFG1;
409 cfg2 = MCP_8MHZ_50KBPS_CFG2;
410 cfg3 = MCP_8MHZ_50KBPS_CFG3;
411 break;
412 case (canbus::CAN_80KBPS): // 80Kbps
413 cfg1 = MCP_8MHZ_80KBPS_CFG1;
414 cfg2 = MCP_8MHZ_80KBPS_CFG2;
415 cfg3 = MCP_8MHZ_80KBPS_CFG3;
416 break;
417 case (canbus::CAN_100KBPS): // 100Kbps
418 cfg1 = MCP_8MHZ_100KBPS_CFG1;
419 cfg2 = MCP_8MHZ_100KBPS_CFG2;
420 cfg3 = MCP_8MHZ_100KBPS_CFG3;
421 break;
422 case (canbus::CAN_125KBPS): // 125Kbps
423 cfg1 = MCP_8MHZ_125KBPS_CFG1;
424 cfg2 = MCP_8MHZ_125KBPS_CFG2;
425 cfg3 = MCP_8MHZ_125KBPS_CFG3;
426 break;
427 case (canbus::CAN_200KBPS): // 200Kbps
428 cfg1 = MCP_8MHZ_200KBPS_CFG1;
429 cfg2 = MCP_8MHZ_200KBPS_CFG2;
430 cfg3 = MCP_8MHZ_200KBPS_CFG3;
431 break;
432 case (canbus::CAN_250KBPS): // 250Kbps
433 cfg1 = MCP_8MHZ_250KBPS_CFG1;
434 cfg2 = MCP_8MHZ_250KBPS_CFG2;
435 cfg3 = MCP_8MHZ_250KBPS_CFG3;
436 break;
437 case (canbus::CAN_500KBPS): // 500Kbps
438 cfg1 = MCP_8MHZ_500KBPS_CFG1;
439 cfg2 = MCP_8MHZ_500KBPS_CFG2;
440 cfg3 = MCP_8MHZ_500KBPS_CFG3;
441 break;
442 case (canbus::CAN_1000KBPS): // 1Mbps
443 cfg1 = MCP_8MHZ_1000KBPS_CFG1;
444 cfg2 = MCP_8MHZ_1000KBPS_CFG2;
445 cfg3 = MCP_8MHZ_1000KBPS_CFG3;
446 break;
447 default:
448 set = 0;
449 break;
450 }
451 break;
452
453 case (MCP_12MHZ):
454 switch (can_speed) {
455 case (canbus::CAN_5KBPS): // 5Kbps
456 cfg1 = MCP_12MHZ_5KBPS_CFG1;
457 cfg2 = MCP_12MHZ_5KBPS_CFG2;
458 cfg3 = MCP_12MHZ_5KBPS_CFG3;
459 break;
460 case (canbus::CAN_10KBPS): // 10Kbps
461 cfg1 = MCP_12MHZ_10KBPS_CFG1;
462 cfg2 = MCP_12MHZ_10KBPS_CFG2;
463 cfg3 = MCP_12MHZ_10KBPS_CFG3;
464 break;
465 case (canbus::CAN_20KBPS): // 20Kbps
466 cfg1 = MCP_12MHZ_20KBPS_CFG1;
467 cfg2 = MCP_12MHZ_20KBPS_CFG2;
468 cfg3 = MCP_12MHZ_20KBPS_CFG3;
469 break;
470 case (canbus::CAN_33KBPS): // 33.333Kbps
471 cfg1 = MCP_12MHZ_33K3BPS_CFG1;
472 cfg2 = MCP_12MHZ_33K3BPS_CFG2;
473 cfg3 = MCP_12MHZ_33K3BPS_CFG3;
474 break;
475 case (canbus::CAN_40KBPS): // 40Kbps
476 cfg1 = MCP_12MHZ_40KBPS_CFG1;
477 cfg2 = MCP_12MHZ_40KBPS_CFG2;
478 cfg3 = MCP_12MHZ_40KBPS_CFG3;
479 break;
480 case (canbus::CAN_50KBPS): // 50Kbps
481 cfg2 = MCP_12MHZ_50KBPS_CFG2;
482 cfg3 = MCP_12MHZ_50KBPS_CFG3;
483 break;
484 case (canbus::CAN_80KBPS): // 80Kbps
485 cfg1 = MCP_12MHZ_80KBPS_CFG1;
486 cfg2 = MCP_12MHZ_80KBPS_CFG2;
487 cfg3 = MCP_12MHZ_80KBPS_CFG3;
488 break;
489 case (canbus::CAN_100KBPS): // 100Kbps
490 cfg1 = MCP_12MHZ_100KBPS_CFG1;
491 cfg2 = MCP_12MHZ_100KBPS_CFG2;
492 cfg3 = MCP_12MHZ_100KBPS_CFG3;
493 break;
494 case (canbus::CAN_125KBPS): // 125Kbps
495 cfg1 = MCP_12MHZ_125KBPS_CFG1;
496 cfg2 = MCP_12MHZ_125KBPS_CFG2;
497 cfg3 = MCP_12MHZ_125KBPS_CFG3;
498 break;
499 case (canbus::CAN_200KBPS): // 200Kbps
500 cfg1 = MCP_12MHZ_200KBPS_CFG1;
501 cfg2 = MCP_12MHZ_200KBPS_CFG2;
502 cfg3 = MCP_12MHZ_200KBPS_CFG3;
503 break;
504 case (canbus::CAN_250KBPS): // 250Kbps
505 cfg1 = MCP_12MHZ_250KBPS_CFG1;
506 cfg2 = MCP_12MHZ_250KBPS_CFG2;
507 cfg3 = MCP_12MHZ_250KBPS_CFG3;
508 break;
509 case (canbus::CAN_500KBPS): // 500Kbps
510 cfg1 = MCP_12MHZ_500KBPS_CFG1;
511 cfg2 = MCP_12MHZ_500KBPS_CFG2;
512 cfg3 = MCP_12MHZ_500KBPS_CFG3;
513 break;
514 case (canbus::CAN_1000KBPS): // 1Mbps
515 cfg1 = MCP_12MHZ_1000KBPS_CFG1;
516 cfg2 = MCP_12MHZ_1000KBPS_CFG2;
517 cfg3 = MCP_12MHZ_1000KBPS_CFG3;
518 break;
519 default:
520 set = 0;
521 break;
522 }
523 break;
524
525 case (MCP_16MHZ):
526 switch (can_speed) {
527 case (canbus::CAN_5KBPS): // 5Kbps
528 cfg1 = MCP_16MHZ_5KBPS_CFG1;
529 cfg2 = MCP_16MHZ_5KBPS_CFG2;
530 cfg3 = MCP_16MHZ_5KBPS_CFG3;
531 break;
532 case (canbus::CAN_10KBPS): // 10Kbps
533 cfg1 = MCP_16MHZ_10KBPS_CFG1;
534 cfg2 = MCP_16MHZ_10KBPS_CFG2;
535 cfg3 = MCP_16MHZ_10KBPS_CFG3;
536 break;
537 case (canbus::CAN_20KBPS): // 20Kbps
538 cfg1 = MCP_16MHZ_20KBPS_CFG1;
539 cfg2 = MCP_16MHZ_20KBPS_CFG2;
540 cfg3 = MCP_16MHZ_20KBPS_CFG3;
541 break;
542 case (canbus::CAN_33KBPS): // 33.333Kbps
543 cfg1 = MCP_16MHZ_33K3BPS_CFG1;
544 cfg2 = MCP_16MHZ_33K3BPS_CFG2;
545 cfg3 = MCP_16MHZ_33K3BPS_CFG3;
546 break;
547 case (canbus::CAN_40KBPS): // 40Kbps
548 cfg1 = MCP_16MHZ_40KBPS_CFG1;
549 cfg2 = MCP_16MHZ_40KBPS_CFG2;
550 cfg3 = MCP_16MHZ_40KBPS_CFG3;
551 break;
552 case (canbus::CAN_50KBPS): // 50Kbps
553 cfg1 = MCP_16MHZ_50KBPS_CFG1;
554 cfg2 = MCP_16MHZ_50KBPS_CFG2;
555 cfg3 = MCP_16MHZ_50KBPS_CFG3;
556 break;
557 case (canbus::CAN_80KBPS): // 80Kbps
558 cfg1 = MCP_16MHZ_80KBPS_CFG1;
559 cfg2 = MCP_16MHZ_80KBPS_CFG2;
560 cfg3 = MCP_16MHZ_80KBPS_CFG3;
561 break;
562 case (canbus::CAN_83K3BPS): // 83.333Kbps
563 cfg1 = MCP_16MHZ_83K3BPS_CFG1;
564 cfg2 = MCP_16MHZ_83K3BPS_CFG2;
565 cfg3 = MCP_16MHZ_83K3BPS_CFG3;
566 break;
567 case (canbus::CAN_100KBPS): // 100Kbps
568 cfg1 = MCP_16MHZ_100KBPS_CFG1;
569 cfg2 = MCP_16MHZ_100KBPS_CFG2;
570 cfg3 = MCP_16MHZ_100KBPS_CFG3;
571 break;
572 case (canbus::CAN_125KBPS): // 125Kbps
573 cfg1 = MCP_16MHZ_125KBPS_CFG1;
574 cfg2 = MCP_16MHZ_125KBPS_CFG2;
575 cfg3 = MCP_16MHZ_125KBPS_CFG3;
576 break;
577 case (canbus::CAN_200KBPS): // 200Kbps
578 cfg1 = MCP_16MHZ_200KBPS_CFG1;
579 cfg2 = MCP_16MHZ_200KBPS_CFG2;
580 cfg3 = MCP_16MHZ_200KBPS_CFG3;
581 break;
582 case (canbus::CAN_250KBPS): // 250Kbps
583 cfg1 = MCP_16MHZ_250KBPS_CFG1;
584 cfg2 = MCP_16MHZ_250KBPS_CFG2;
585 cfg3 = MCP_16MHZ_250KBPS_CFG3;
586 break;
587 case (canbus::CAN_500KBPS): // 500Kbps
588 cfg1 = MCP_16MHZ_500KBPS_CFG1;
589 cfg2 = MCP_16MHZ_500KBPS_CFG2;
590 cfg3 = MCP_16MHZ_500KBPS_CFG3;
591 break;
592 case (canbus::CAN_1000KBPS): // 1Mbps
593 cfg1 = MCP_16MHZ_1000KBPS_CFG1;
594 cfg2 = MCP_16MHZ_1000KBPS_CFG2;
595 cfg3 = MCP_16MHZ_1000KBPS_CFG3;
596 break;
597 default:
598 set = 0;
599 break;
600 }
601 break;
602
603 case (MCP_20MHZ):
604 switch (can_speed) {
605 case (canbus::CAN_33KBPS): // 33.333Kbps
606 cfg1 = MCP_20MHZ_33K3BPS_CFG1;
607 cfg2 = MCP_20MHZ_33K3BPS_CFG2;
608 cfg3 = MCP_20MHZ_33K3BPS_CFG3;
609 break;
610 case (canbus::CAN_40KBPS): // 40Kbps
611 cfg1 = MCP_20MHZ_40KBPS_CFG1;
612 cfg2 = MCP_20MHZ_40KBPS_CFG2;
613 cfg3 = MCP_20MHZ_40KBPS_CFG3;
614 break;
615 case (canbus::CAN_50KBPS): // 50Kbps
616 cfg1 = MCP_20MHZ_50KBPS_CFG1;
617 cfg2 = MCP_20MHZ_50KBPS_CFG2;
618 cfg3 = MCP_20MHZ_50KBPS_CFG3;
619 break;
620 case (canbus::CAN_80KBPS): // 80Kbps
621 cfg1 = MCP_20MHZ_80KBPS_CFG1;
622 cfg2 = MCP_20MHZ_80KBPS_CFG2;
623 cfg3 = MCP_20MHZ_80KBPS_CFG3;
624 break;
625 case (canbus::CAN_83K3BPS): // 83.333Kbps
626 cfg1 = MCP_20MHZ_83K3BPS_CFG1;
627 cfg2 = MCP_20MHZ_83K3BPS_CFG2;
628 cfg3 = MCP_20MHZ_83K3BPS_CFG3;
629 break;
630 case (canbus::CAN_100KBPS): // 100Kbps
631 cfg1 = MCP_20MHZ_100KBPS_CFG1;
632 cfg2 = MCP_20MHZ_100KBPS_CFG2;
633 cfg3 = MCP_20MHZ_100KBPS_CFG3;
634 break;
635 case (canbus::CAN_125KBPS): // 125Kbps
636 cfg1 = MCP_20MHZ_125KBPS_CFG1;
637 cfg2 = MCP_20MHZ_125KBPS_CFG2;
638 cfg3 = MCP_20MHZ_125KBPS_CFG3;
639 break;
640 case (canbus::CAN_200KBPS): // 200Kbps
641 cfg1 = MCP_20MHZ_200KBPS_CFG1;
642 cfg2 = MCP_20MHZ_200KBPS_CFG2;
643 cfg3 = MCP_20MHZ_200KBPS_CFG3;
644 break;
645 case (canbus::CAN_250KBPS): // 250Kbps
646 cfg1 = MCP_20MHZ_250KBPS_CFG1;
647 cfg2 = MCP_20MHZ_250KBPS_CFG2;
648 cfg3 = MCP_20MHZ_250KBPS_CFG3;
649 break;
650 case (canbus::CAN_500KBPS): // 500Kbps
651 cfg1 = MCP_20MHZ_500KBPS_CFG1;
652 cfg2 = MCP_20MHZ_500KBPS_CFG2;
653 cfg3 = MCP_20MHZ_500KBPS_CFG3;
654 break;
655 case (canbus::CAN_1000KBPS): // 1Mbps
656 cfg1 = MCP_20MHZ_1000KBPS_CFG1;
657 cfg2 = MCP_20MHZ_1000KBPS_CFG2;
658 cfg3 = MCP_20MHZ_1000KBPS_CFG3;
659 break;
660 default:
661 set = 0;
662 break;
663 }
664 break;
665
666 default:
667 set = 0;
668 break;
669 }
670
671 if (set) {
672 set_register_(MCP_CNF1, cfg1); // NOLINT
673 set_register_(MCP_CNF2, cfg2); // NOLINT
674 set_register_(MCP_CNF3, cfg3); // NOLINT
675 return canbus::ERROR_OK;
676 } else {
677 ESP_LOGE(TAG, "Invalid frequency/bitrate combination: %d/%d", can_clock, can_speed);
678 return canbus::ERROR_FAIL;
679 }
680}
681} // namespace mcp2515
682} // namespace esphome
send_message_t send_message_
BedjetMode mode
BedJet operating mode.
canbus::Error reset_()
Definition mcp2515.cpp:30
static const struct esphome::mcp2515::MCP2515::RxBnRegs RXB[N_RXBUFFERS]
Definition mcp2515.cpp:13
void modify_register_(REGISTER reg, uint8_t mask, uint8_t data)
Definition mcp2515.cpp:98
canbus::Error set_filter_mask_(MASK mask, bool extended, uint32_t ul_data)
Definition mcp2515.cpp:168
void prepare_id_(uint8_t *buffer, bool extended, uint32_t id)
Definition mcp2515.cpp:149
void read_registers_(REGISTER reg, uint8_t values[], uint8_t n)
Definition mcp2515.cpp:67
uint8_t read_register_(REGISTER reg)
Definition mcp2515.cpp:57
void set_registers_(REGISTER reg, uint8_t values[], uint8_t n)
Definition mcp2515.cpp:87
CanctrlReqopMode mcp_mode_
Definition mcp2515.h:77
static const struct esphome::mcp2515::MCP2515::TxBnRegs TXB[N_TXBUFFERS]
Definition mcp2515.cpp:9
canbus::Error send_message(struct canbus::CanFrame *frame) override
Definition mcp2515.cpp:247
bool setup_internal() override
Definition mcp2515.cpp:16
void set_register_(REGISTER reg, uint8_t value)
Definition mcp2515.cpp:79
canbus::Error set_filter_(RXF num, bool extended, uint32_t ul_data)
Definition mcp2515.cpp:194
canbus::Error set_mode_(CanctrlReqopMode mode)
Definition mcp2515.cpp:116
canbus::Error send_message_(TXBn txbn, struct canbus::CanFrame *frame)
Definition mcp2515.cpp:232
canbus::Error read_message(struct canbus::CanFrame *frame) override
Definition mcp2515.cpp:306
canbus::Error set_clk_out_(CanClkOut divisor)
Definition mcp2515.cpp:128
canbus::Error read_message_(RXBn rxbn, struct canbus::CanFrame *frame)
Definition mcp2515.cpp:264
canbus::Error set_bitrate_(canbus::CanSpeed can_speed)
Definition mcp2515.cpp:364
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
void IRAM_ATTR HOT delay(uint32_t ms)
Definition core.cpp:28
uint32_t IRAM_ATTR HOT millis()
Definition core.cpp:27
T id(T value)
Helper function to make id(var) known from lambdas work in custom components.
Definition helpers.h:798
uint8_t can_data_length_code
Definition canbus.h:61