5 #include <driver/twai.h> 10 #define CAN_IO_UNUSED ((gpio_num_t) -1) 15 static const char *
const TAG =
"esp32_can";
17 static bool get_bitrate(
canbus::CanSpeed bitrate, twai_timing_config_t *t_config) {
20 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_50KBITS();
23 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_100KBITS();
26 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_125KBITS();
29 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_250KBITS();
32 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_500KBITS();
35 *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1MBITS();
43 twai_general_config_t g_config =
44 TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t) this->
tx_, (gpio_num_t) this->
rx_, TWAI_MODE_NORMAL);
45 twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
46 twai_timing_config_t t_config;
48 if (!get_bitrate(this->
bit_rate_, &t_config)) {
55 if (twai_driver_install(&g_config, &t_config, &f_config) != ESP_OK) {
62 if (twai_start() != ESP_OK) {
75 uint32_t
flags = TWAI_MSG_FLAG_NONE;
77 flags |= TWAI_MSG_FLAG_EXTD;
80 flags |= TWAI_MSG_FLAG_RTR;
83 twai_message_t message = {
85 .identifier = frame->
can_id,
92 if (twai_transmit(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
100 twai_message_t message;
102 if (twai_receive(&message, 0) != ESP_OK) {
106 frame->
can_id = message.identifier;
113 message.data_length_code < canbus::CAN_MAX_DATA_LENGTH ? message.data_length_code : canbus::CAN_MAX_DATA_LENGTH;
114 memcpy(frame->data, message.data, dlc);
bool setup_internal() override
uint8_t can_data_length_code
bool remote_transmission_request
canbus::Error read_message(struct canbus::CanFrame *frame) override
virtual void mark_failed()
Mark this component as failed.
canbus::Error send_message(struct canbus::CanFrame *frame) override