15static const char *
const TAG =
"esp32_can";
17static bool get_bitrate(
canbus::CanSpeed bitrate, twai_timing_config_t *t_config) {
19#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32C61) || \
20 defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || \
21 defined(USE_ESP32_VARIANT_ESP32S3)
23 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1KBITS();
26 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_5KBITS();
29 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_10KBITS();
32 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_12_5KBITS();
35 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_16KBITS();
38 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_20KBITS();
42 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_25KBITS();
45 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_50KBITS();
48 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_100KBITS();
51 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_125KBITS();
54 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_250KBITS();
57 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_500KBITS();
60 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_800KBITS();
63 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1MBITS();
71 static int next_twai_ctrl_num = 0;
72 if (
static_cast<unsigned>(next_twai_ctrl_num) >= SOC_TWAI_CONTROLLER_NUM) {
73 ESP_LOGW(TAG,
"Maximum number of esp32_can components created already");
78 twai_general_config_t g_config =
79 TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t) this->
tx_, (gpio_num_t) this->
rx_, TWAI_MODE_NORMAL);
80 g_config.controller_id = next_twai_ctrl_num++;
88 twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
89 twai_timing_config_t t_config;
91 if (!get_bitrate(this->
bit_rate_, &t_config)) {
98 if (twai_driver_install_v2(&g_config, &t_config, &f_config, &(this->
twai_handle_)) != ESP_OK) {
123 uint32_t
flags = TWAI_MSG_FLAG_NONE;
125 flags |= TWAI_MSG_FLAG_EXTD;
128 flags |= TWAI_MSG_FLAG_RTR;
133 .identifier = frame->
can_id,
156 if (twai_receive_v2(this->
twai_handle_, &message, 0) != ESP_OK) {
167 message.data_length_code < canbus::CAN_MAX_DATA_LENGTH ?
message.data_length_code : canbus::CAN_MAX_DATA_LENGTH;
168 memcpy(frame->data,
message.data, dlc);