xtensa/esp32: Add support to TWAI/CANBus controller

This commit is contained in:
Alan C. Assis 2022-04-03 15:14:42 -03:00 committed by Petro Karashchenko
parent dfbf06e250
commit 1090e1a8ea
9 changed files with 2270 additions and 6 deletions

View File

@ -117,7 +117,8 @@
#define ESP32_PERIPH_PWM3 42 /* INTR_STATUS_REG_1, bit 10 */
#define ESP32_PERIPH_LEDC 43 /* INTR_STATUS_REG_1, bit 11 */
#define ESP32_PERIPH_EFUSE 44 /* INTR_STATUS_REG_1, bit 12 */
#define ESP32_PERIPH_CAN 45 /* INTR_STATUS_REG_1, bit 13 */
#define ESP32_PERIPH_TWAI 45 /* INTR_STATUS_REG_1, bit 13 */
#define ESP32_PERIPH_CAN ESP32_PERIPH_TWAI
#define ESP32_PERIPH_RTC_CORE 46 /* INTR_STATUS_REG_1, bit 14 */
#define ESP32_PERIPH_RMT 47 /* INTR_STATUS_REG_1, bit 15 */
#define ESP32_PERIPH_PCNT 48 /* INTR_STATUS_REG_1, bit 16 */
@ -244,7 +245,8 @@
#define ESP32_IRQ_PWM3 (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_PWM3)
#define ESP32_IRQ_LEDC (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_LEDC)
#define ESP32_IRQ_EFUSE (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_EFUSE)
#define ESP32_IRQ_CAN (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_CAN)
#define ESP32_IRQ_TWAI (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_CAN)
#define ESP32_IRQ_CAN ESP32_IRQ_TWAI
#define ESP32_IRQ_RTC_CORE (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_RTC_CORE)
#define ESP32_IRQ_RMT (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_RMT)
#define ESP32_IRQ_PCNT (XTENSA_IRQ_FIRSTPERIPH+ESP32_PERIPH_PCNT)

View File

@ -309,6 +309,11 @@ config ESP32_I2C
bool
default n
config ESP32_TWAI
bool
default n
select CAN
config ESP32_I2S0
bool "I2S 0"
default n
@ -527,6 +532,11 @@ config ESP32_I2C1
default n
select ESP32_I2C
config ESP32_TWAI0
bool "TWAI (CAN) 0"
default n
select ESP32_TWAI
config ESP32_AES_ACCELERATOR
bool "AES Accelerator"
default n
@ -830,6 +840,58 @@ config ESP32_I2CTIMEOMS
endmenu # I2C configuration
menu "TWAI driver options"
depends on ESP32_TWAI
if ESP32_TWAI0
config ESP32_TWAI0_TXPIN
int "TWAI0 TX Pin"
default 21
config ESP32_TWAI0_RXPIN
int "TWAI0 RX Pin"
default 22
config ESP32_TWAI0_BITRATE
int "TWAI0 bitrate"
default 1000000
---help---
TWAI0 bit rate. Required if ESP32_TWAI0 is defined.
config ESP32_TWAI0_SAMPLEP
int "TWAI0 sample point"
default 80
---help---
TWAI0 sample point location as a percent value. Required
if ESP32_TWAI0 is defined.
config ESP32_TWAI0_SJW
int "TWAI0 synchronization jump width"
default 3
---help---
SJW limits the number of Time Quanta corrections during bit
Resynchronization. Default: 3
config ESP32_TWAI0_SAM
bool "TWAI0 sampling"
default n
---help---
The bus is sampled 3 times (recommended for low to medium speed buses
to spikes on the bus-line).
endif # ESP32_TWAI0
config ESP32_TWAI_REGDEBUG
bool "TWAI register level debug"
depends on DEBUG_CAN_INFO
default n
---help---
Output detailed register-level TWAI debug information. Requires also
CONFIG_DEBUG_CAN_INFO.
endmenu #ESP32_TWAI
menu "SPI configuration"
depends on ESP32_SPI

View File

@ -107,6 +107,10 @@ ifeq ($(CONFIG_ESP32_I2C),y)
CHIP_CSRCS += esp32_i2c.c
endif
ifeq ($(CONFIG_ESP32_TWAI),y)
CHIP_CSRCS += esp32_twai.c
endif
ifeq ($(CONFIG_ESP32_SPI),y)
CHIP_CSRCS += esp32_spi.c
ifeq ($(CONFIG_SPI_SLAVE),y)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,77 @@
/****************************************************************************
* arch/xtensa/src/esp32/esp32_twai.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_XTENSA_SRC_ESP32_ESP32_TWAI_H
#define __ARCH_XTENSA_SRC_ESP32_ESP32_TWAI_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include "hardware/esp32_twai.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Public Types
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
#ifndef __ASSEMBLY__
#ifdef __cplusplus
extern "C"
{
#endif
/****************************************************************************
* Public Functions Prototypes
****************************************************************************/
/****************************************************************************
* Name: esp32_twaiinitialize
*
* Description:
* Initialize the selected CAN port
*
* Input Parameters:
* Port number (for hardware that has multiple TWAI interfaces)
*
* Returned Value:
* Valid TWAI device structure reference on success; a NULL on failure
*
****************************************************************************/
#if defined(CONFIG_CAN) && defined(CONFIG_ESP32_TWAI)
struct can_dev_s;
FAR struct can_dev_s *esp32_twaiinitialize(int port);
#endif
#ifdef __cplusplus
}
#endif
#endif /* __ASSEMBLY__ */
#endif /* __ARCH_XTENSA_SRC_ESP32_ESP32_TWAI_H */

View File

@ -1099,7 +1099,8 @@
#define DPORT_SPI_DMA_CLK_EN (BIT(22))
#define DPORT_I2S1_CLK_EN (BIT(21))
#define DPORT_PWM1_CLK_EN (BIT(20))
#define DPORT_CAN_CLK_EN (BIT(19))
#define DPORT_TWAI_CLK_EN (BIT(19))
#define DPORT_CAN_CLK_EN DPORT_TWAI_CLK_EN
#define DPORT_I2C_EXT1_CLK_EN (BIT(18))
#define DPORT_PWM0_CLK_EN (BIT(17))
#define DPORT_SPI_CLK_EN (BIT(16))
@ -1134,7 +1135,8 @@
#define DPORT_SPI_DMA_RST (BIT(22))
#define DPORT_I2S1_RST (BIT(21))
#define DPORT_PWM1_RST (BIT(20))
#define DPORT_CAN_RST (BIT(19))
#define DPORT_TWAI_RST (BIT(19))
#define DPORT_CAN_RST DPORT_CAN_RST
#define DPORT_I2C_EXT1_RST (BIT(18))
#define DPORT_PWM0_RST (BIT(17))
#define DPORT_SPI_RST (BIT(16))

View File

@ -205,7 +205,8 @@
#define RMT_SIG_OUT5_IDX 92
#define EXT_ADC_START_IDX 93
#define RMT_SIG_OUT6_IDX 93
#define CAN_RX_IDX 94
#define TWAI_RX_IDX 94
#define CAN_RX_IDX TWAI_RX_IDX
#define RMT_SIG_OUT7_IDX 94
#define I2CEXT1_SCL_IN_IDX 95
#define I2CEXT1_SCL_OUT_IDX 95
@ -263,7 +264,8 @@
#define PWM2_OUT4L_IDX 121
#define PWM3_CAP1_IN_IDX 122
#define PWM3_CAP2_IN_IDX 123
#define CAN_TX_IDX 123
#define TWAI_TX_IDX 123
#define CAN_TX_IDX TWAI_TX_IDX
#define PWM3_CAP3_IN_IDX 124
#define CAN_BUS_OFF_ON_IDX 124
#define CAN_CLKOUT_IDX 125

View File

@ -245,6 +245,8 @@
#define DR_REG_I2C1_EXT_BASE 0x3ff67000
#define DR_REG_SDMMC_BASE 0x3ff68000
#define DR_REG_EMAC_BASE 0x3ff69000
#define DR_REG_TWAI_BASE 0x3ff6b000
#define DR_REG_CAN_BASE DR_REG_TWAI_BASE
#define DR_REG_PWM1_BASE 0x3ff6c000
#define DR_REG_I2S1_BASE 0x3ff6d000
#define DR_REG_UART2_BASE 0x3ff6e000

View File

@ -0,0 +1,856 @@
/****************************************************************************
* arch/xtensa/src/esp32/hardware/esp32_twai.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_XTENSA_SRC_ESP32_HARDWARE_ESP32_TWAI_H
#define __ARCH_XTENSA_SRC_ESP32_HARDWARE_ESP32_TWAI_H
/****************************************************************************
* Included Files
****************************************************************************/
#include "esp32_soc.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* TWAI_MODE_REG register
* Mode Register
*/
#define TWAI_MODE_REG (DR_REG_TWAI_BASE + 0x0)
/* TWAI_RX_FILTER_MODE : R/W; bitpos: [3]; default: 0;
* This bit is used to configure the filter mode. 0: Dual filter mode; 1:
* Single filter mode.
*/
#define TWAI_RX_FILTER_MODE (BIT(3))
#define TWAI_RX_FILTER_MODE_M (TWAI_RX_FILTER_MODE_V << TWAI_RX_FILTER_MODE_S)
#define TWAI_RX_FILTER_MODE_V 0x00000001
#define TWAI_RX_FILTER_MODE_S 3
/* TWAI_SELF_TEST_MODE : R/W; bitpos: [2]; default: 0;
* 1: Self test mode. In this mode the TX nodes can perform a successful
* transmission without receiving the acknowledge signal. This mode is often
* used to test a single node with the self reception request command.
*/
#define TWAI_SELF_TEST_MODE (BIT(2))
#define TWAI_SELF_TEST_MODE_M (TWAI_SELF_TEST_MODE_V << TWAI_SELF_TEST_MODE_S)
#define TWAI_SELF_TEST_MODE_V 0x00000001
#define TWAI_SELF_TEST_MODE_S 2
/* TWAI_LISTEN_ONLY_MODE : R/W; bitpos: [1]; default: 0;
* 1: Listen only mode. In this mode the nodes will only receive messages
* from the bus, without generating the acknowledge signal nor updating the
* RX error counter.
*/
#define TWAI_LISTEN_ONLY_MODE (BIT(1))
#define TWAI_LISTEN_ONLY_MODE_M (TWAI_LISTEN_ONLY_MODE_V << TWAI_LISTEN_ONLY_MODE_S)
#define TWAI_LISTEN_ONLY_MODE_V 0x00000001
#define TWAI_LISTEN_ONLY_MODE_S 1
/* TWAI_RESET_MODE : R/W; bitpos: [0]; default: 1;
* This bit is used to configure the operating mode of the TWAI Controller.
* 1: Reset mode; 0: Operating mode.
*/
#define TWAI_RESET_MODE (BIT(0))
#define TWAI_RESET_MODE_M (TWAI_RESET_MODE_V << TWAI_RESET_MODE_S)
#define TWAI_RESET_MODE_V 0x00000001
#define TWAI_RESET_MODE_S 0
/* TWAI_CMD_REG register
* Command Register
*/
#define TWAI_CMD_REG (DR_REG_TWAI_BASE + 0x4)
/* TWAI_SELF_RX_REQ : WO; bitpos: [4]; default: 0;
* Self reception request command. Set the bit to 1 to allow a message be
* transmitted and received simultaneously.
*/
#define TWAI_SELF_RX_REQ (BIT(4))
#define TWAI_SELF_RX_REQ_M (TWAI_SELF_RX_REQ_V << TWAI_SELF_RX_REQ_S)
#define TWAI_SELF_RX_REQ_V 0x00000001
#define TWAI_SELF_RX_REQ_S 4
/* TWAI_CLR_OVERRUN : WO; bitpos: [3]; default: 0;
* Set the bit to 1 to clear the data overrun status bit.
*/
#define TWAI_CLR_OVERRUN (BIT(3))
#define TWAI_CLR_OVERRUN_M (TWAI_CLR_OVERRUN_V << TWAI_CLR_OVERRUN_S)
#define TWAI_CLR_OVERRUN_V 0x00000001
#define TWAI_CLR_OVERRUN_S 3
/* TWAI_RELEASE_BUF : WO; bitpos: [2]; default: 0;
* Set the bit to 1 to release the RX buffer.
*/
#define TWAI_RELEASE_BUF (BIT(2))
#define TWAI_RELEASE_BUF_M (TWAI_RELEASE_BUF_V << TWAI_RELEASE_BUF_S)
#define TWAI_RELEASE_BUF_V 0x00000001
#define TWAI_RELEASE_BUF_S 2
/* TWAI_ABORT_TX : WO; bitpos: [1]; default: 0;
* Set the bit to 1 to cancel a pending transmission request.
*/
#define TWAI_ABORT_TX (BIT(1))
#define TWAI_ABORT_TX_M (TWAI_ABORT_TX_V << TWAI_ABORT_TX_S)
#define TWAI_ABORT_TX_V 0x00000001
#define TWAI_ABORT_TX_S 1
/* TWAI_TX_REQ : WO; bitpos: [0]; default: 0;
* Set the bit to 1 to allow the driving nodes start transmission.
*/
#define TWAI_TX_REQ (BIT(0))
#define TWAI_TX_REQ_M (TWAI_TX_REQ_V << TWAI_TX_REQ_S)
#define TWAI_TX_REQ_V 0x00000001
#define TWAI_TX_REQ_S 0
/* TWAI_STATUS_REG register
* Status register
*/
#define TWAI_STATUS_REG (DR_REG_TWAI_BASE + 0x8)
/* TWAI_MISS_ST : RO; bitpos: [8]; default: 0;
* This bit reflects whether the data packet in the RX FIFO is complete. 1:
* The current packet is missing; 0: The current packet is complete
*/
#define TWAI_MISS_ST (BIT(8))
#define TWAI_MISS_ST_M (TWAI_MISS_ST_V << TWAI_MISS_ST_S)
#define TWAI_MISS_ST_V 0x00000001
#define TWAI_MISS_ST_S 8
/* TWAI_BUS_OFF_ST : RO; bitpos: [7]; default: 0;
* 1: In bus-off status, the TWAI Controller is no longer involved in bus
* activities.
*/
#define TWAI_BUS_OFF_ST (BIT(7))
#define TWAI_BUS_OFF_ST_M (TWAI_BUS_OFF_ST_V << TWAI_BUS_OFF_ST_S)
#define TWAI_BUS_OFF_ST_V 0x00000001
#define TWAI_BUS_OFF_ST_S 7
/* TWAI_ERR_ST : RO; bitpos: [6]; default: 0;
* 1: At least one of the RX/TX error counter has reached or exceeded the
* value set in register TWAI_ERR_WARNING_LIMIT_REG.
*/
#define TWAI_ERR_ST (BIT(6))
#define TWAI_ERR_ST_M (TWAI_ERR_ST_V << TWAI_ERR_ST_S)
#define TWAI_ERR_ST_V 0x00000001
#define TWAI_ERR_ST_S 6
/* TWAI_TX_ST : RO; bitpos: [5]; default: 0;
* 1: The TWAI Controller is transmitting a message to the bus.
*/
#define TWAI_TX_ST (BIT(5))
#define TWAI_TX_ST_M (TWAI_TX_ST_V << TWAI_TX_ST_S)
#define TWAI_TX_ST_V 0x00000001
#define TWAI_TX_ST_S 5
/* TWAI_RX_ST : RO; bitpos: [4]; default: 0;
* 1: The TWAI Controller is receiving a message from the bus.
*/
#define TWAI_RX_ST (BIT(4))
#define TWAI_RX_ST_M (TWAI_RX_ST_V << TWAI_RX_ST_S)
#define TWAI_RX_ST_V 0x00000001
#define TWAI_RX_ST_S 4
/* TWAI_TX_COMPLETE : RO; bitpos: [3]; default: 0;
* 1: The TWAI controller has successfully received a packet from the bus.
*/
#define TWAI_TX_COMPLETE (BIT(3))
#define TWAI_TX_COMPLETE_M (TWAI_TX_COMPLETE_V << TWAI_TX_COMPLETE_S)
#define TWAI_TX_COMPLETE_V 0x00000001
#define TWAI_TX_COMPLETE_S 3
/* TWAI_TX_BUF_ST : RO; bitpos: [2]; default: 0;
* 1: The TX buffer is empty, the CPU may write a message into it.
*/
#define TWAI_TX_BUF_ST (BIT(2))
#define TWAI_TX_BUF_ST_M (TWAI_TX_BUF_ST_V << TWAI_TX_BUF_ST_S)
#define TWAI_TX_BUF_ST_V 0x00000001
#define TWAI_TX_BUF_ST_S 2
/* TWAI_OVERRUN_ST : RO; bitpos: [1]; default: 0;
* 1: The RX FIFO is full and data overrun has occurred.
*/
#define TWAI_OVERRUN_ST (BIT(1))
#define TWAI_OVERRUN_ST_M (TWAI_OVERRUN_ST_V << TWAI_OVERRUN_ST_S)
#define TWAI_OVERRUN_ST_V 0x00000001
#define TWAI_OVERRUN_ST_S 1
/* TWAI_RX_BUF_ST : RO; bitpos: [0]; default: 0;
* 1: The data in the RX buffer is not empty, with at least one received
* data packet.
*/
#define TWAI_RX_BUF_ST (BIT(0))
#define TWAI_RX_BUF_ST_M (TWAI_RX_BUF_ST_V << TWAI_RX_BUF_ST_S)
#define TWAI_RX_BUF_ST_V 0x00000001
#define TWAI_RX_BUF_ST_S 0
/* TWAI_INT_RAW_REG register
* Interrupt Register
*/
#define TWAI_INT_RAW_REG (DR_REG_TWAI_BASE + 0xc)
/* TWAI_BUS_ERR_INT_ST : RO; bitpos: [7]; default: 0;
* Error interrupt. If this bit is set to 1, it indicates an error is
* detected on the bus.
*/
#define TWAI_BUS_ERR_INT_ST (BIT(7))
#define TWAI_BUS_ERR_INT_ST_M (TWAI_BUS_ERR_INT_ST_V << TWAI_BUS_ERR_INT_ST_S)
#define TWAI_BUS_ERR_INT_ST_V 0x00000001
#define TWAI_BUS_ERR_INT_ST_S 7
/* TWAI_ARB_LOST_INT_ST : RO; bitpos: [6]; default: 0;
* Arbitration lost interrupt. If this bit is set to 1, it indicates an
* arbitration lost interrupt is generated.
*/
#define TWAI_ARB_LOST_INT_ST (BIT(6))
#define TWAI_ARB_LOST_INT_ST_M (TWAI_ARB_LOST_INT_ST_V << TWAI_ARB_LOST_INT_ST_S)
#define TWAI_ARB_LOST_INT_ST_V 0x00000001
#define TWAI_ARB_LOST_INT_ST_S 6
/* TWAI_ERR_PASSIVE_INT_ST : RO; bitpos: [5]; default: 0;
* Error passive interrupt. If this bit is set to 1, it indicates the TWAI
* Controller is switched between error active status and error passive
* status due to the change of error counters.
*/
#define TWAI_ERR_PASSIVE_INT_ST (BIT(5))
#define TWAI_ERR_PASSIVE_INT_ST_M (TWAI_ERR_PASSIVE_INT_ST_V << TWAI_ERR_PASSIVE_INT_ST_S)
#define TWAI_ERR_PASSIVE_INT_ST_V 0x00000001
#define TWAI_ERR_PASSIVE_INT_ST_S 5
/* TWAI_OVERRUN_INT_ST : RO; bitpos: [3]; default: 0;
* Data overrun interrupt. If this bit is set to 1, it indicates a data
* overrun interrupt is generated in the RX FIFO.
*/
#define TWAI_OVERRUN_INT_ST (BIT(3))
#define TWAI_OVERRUN_INT_ST_M (TWAI_OVERRUN_INT_ST_V << TWAI_OVERRUN_INT_ST_S)
#define TWAI_OVERRUN_INT_ST_V 0x00000001
#define TWAI_OVERRUN_INT_ST_S 3
/* TWAI_ERR_WARN_INT_ST : RO; bitpos: [2]; default: 0;
* Error warning interrupt. If this bit is set to 1, it indicates the error
* status signal and the bus-off status signal of Status register have
* changed (e.g., switched from 0 to 1 or from 1 to 0).
*/
#define TWAI_ERR_WARN_INT_ST (BIT(2))
#define TWAI_ERR_WARN_INT_ST_M (TWAI_ERR_WARN_INT_ST_V << TWAI_ERR_WARN_INT_ST_S)
#define TWAI_ERR_WARN_INT_ST_V 0x00000001
#define TWAI_ERR_WARN_INT_ST_S 2
/* TWAI_TX_INT_ST : RO; bitpos: [1]; default: 0;
* Transmit interrupt. If this bit is set to 1, it indicates the message
* transmitting mis- sion is finished and a new transmission is able to
* execute.
*/
#define TWAI_TX_INT_ST (BIT(1))
#define TWAI_TX_INT_ST_M (TWAI_TX_INT_ST_V << TWAI_TX_INT_ST_S)
#define TWAI_TX_INT_ST_V 0x00000001
#define TWAI_TX_INT_ST_S 1
/* TWAI_RX_INT_ST : RO; bitpos: [0]; default: 0;
* Receive interrupt. If this bit is set to 1, it indicates there are
* messages to be handled in the RX FIFO.
*/
#define TWAI_RX_INT_ST (BIT(0))
#define TWAI_RX_INT_ST_M (TWAI_RX_INT_ST_V << TWAI_RX_INT_ST_S)
#define TWAI_RX_INT_ST_V 0x00000001
#define TWAI_RX_INT_ST_S 0
/* TWAI_INT_ENA_REG register
* Interrupt Enable Register
*/
#define TWAI_INT_ENA_REG (DR_REG_TWAI_BASE + 0x10)
/* TWAI_BUS_ERR_INT_ENA : R/W; bitpos: [7]; default: 0;
* Set this bit to 1 to enable error interrupt.
*/
#define TWAI_BUS_ERR_INT_ENA (BIT(7))
#define TWAI_BUS_ERR_INT_ENA_M (TWAI_BUS_ERR_INT_ENA_V << TWAI_BUS_ERR_INT_ENA_S)
#define TWAI_BUS_ERR_INT_ENA_V 0x00000001
#define TWAI_BUS_ERR_INT_ENA_S 7
/* TWAI_ARB_LOST_INT_ENA : R/W; bitpos: [6]; default: 0;
* Set this bit to 1 to enable arbitration lost interrupt.
*/
#define TWAI_ARB_LOST_INT_ENA (BIT(6))
#define TWAI_ARB_LOST_INT_ENA_M (TWAI_ARB_LOST_INT_ENA_V << TWAI_ARB_LOST_INT_ENA_S)
#define TWAI_ARB_LOST_INT_ENA_V 0x00000001
#define TWAI_ARB_LOST_INT_ENA_S 6
/* TWAI_ERR_PASSIVE_INT_ENA : R/W; bitpos: [5]; default: 0;
* Set this bit to 1 to enable error passive interrupt.
*/
#define TWAI_ERR_PASSIVE_INT_ENA (BIT(5))
#define TWAI_ERR_PASSIVE_INT_ENA_M (TWAI_ERR_PASSIVE_INT_ENA_V << TWAI_ERR_PASSIVE_INT_ENA_S)
#define TWAI_ERR_PASSIVE_INT_ENA_V 0x00000001
#define TWAI_ERR_PASSIVE_INT_ENA_S 5
/* TWAI_OVERRUN_INT_ENA : R/W; bitpos: [3]; default: 0;
* Set this bit to 1 to enable data overrun interrupt.
*/
#define TWAI_OVERRUN_INT_ENA (BIT(3))
#define TWAI_OVERRUN_INT_ENA_M (TWAI_OVERRUN_INT_ENA_V << TWAI_OVERRUN_INT_ENA_S)
#define TWAI_OVERRUN_INT_ENA_V 0x00000001
#define TWAI_OVERRUN_INT_ENA_S 3
/* TWAI_ERR_WARN_INT_ENA : R/W; bitpos: [2]; default: 0;
* Set this bit to 1 to enable error warning interrupt.
*/
#define TWAI_ERR_WARN_INT_ENA (BIT(2))
#define TWAI_ERR_WARN_INT_ENA_M (TWAI_ERR_WARN_INT_ENA_V << TWAI_ERR_WARN_INT_ENA_S)
#define TWAI_ERR_WARN_INT_ENA_V 0x00000001
#define TWAI_ERR_WARN_INT_ENA_S 2
/* TWAI_TX_INT_ENA : R/W; bitpos: [1]; default: 0;
* Set this bit to 1 to enable transmit interrupt.
*/
#define TWAI_TX_INT_ENA (BIT(1))
#define TWAI_TX_INT_ENA_M (TWAI_TX_INT_ENA_V << TWAI_TX_INT_ENA_S)
#define TWAI_TX_INT_ENA_V 0x00000001
#define TWAI_TX_INT_ENA_S 1
/* TWAI_RX_INT_ENA : R/W; bitpos: [0]; default: 0;
* Set this bit to 1 to enable receive interrupt.
*/
#define TWAI_RX_INT_ENA (BIT(0))
#define TWAI_RX_INT_ENA_M (TWAI_RX_INT_ENA_V << TWAI_RX_INT_ENA_S)
#define TWAI_RX_INT_ENA_V 0x00000001
#define TWAI_RX_INT_ENA_S 0
/* TWAI_BUS_TIMING_0_REG register
* Bus Timing Register 0
*/
#define TWAI_BUS_TIMING_0_REG (DR_REG_TWAI_BASE + 0x18)
/* TWAI_SYNC_JUMP_WIDTH : RO | R/W; bitpos: [15:14]; default: 0;
* Synchronization Jump Width (SJW), 1 \verb+~+ 14 Tq wide.
*/
#define TWAI_SYNC_JUMP_WIDTH 0x00000003
#define TWAI_SYNC_JUMP_WIDTH_M (TWAI_SYNC_JUMP_WIDTH_V << TWAI_SYNC_JUMP_WIDTH_S)
#define TWAI_SYNC_JUMP_WIDTH_V 0x00000003
#define TWAI_SYNC_JUMP_WIDTH_S 14
/* TWAI_BAUD_PRESC : RO | R/W; bitpos: [13:0]; default: 0;
* Baud Rate Prescaler, determines the frequency dividing ratio.
*/
#define TWAI_BAUD_PRESC 0x00003FFF
#define TWAI_BAUD_PRESC_M (TWAI_BAUD_PRESC_V << TWAI_BAUD_PRESC_S)
#define TWAI_BAUD_PRESC_V 0x00003FFF
#define TWAI_BAUD_PRESC_S 0
/* TWAI_BUS_TIMING_1_REG register
* Bus Timing Register 1
*/
#define TWAI_BUS_TIMING_1_REG (DR_REG_TWAI_BASE + 0x1c)
/* TWAI_TIME_SAMP : RO | R/W; bitpos: [7]; default: 0;
* The number of sample points. 0: the bus is sampled once; 1: the bus is
* sampled three times
*/
#define TWAI_TIME_SAMP (BIT(7))
#define TWAI_TIME_SAMP_M (TWAI_TIME_SAMP_V << TWAI_TIME_SAMP_S)
#define TWAI_TIME_SAMP_V 0x00000001
#define TWAI_TIME_SAMP_S 7
/* TWAI_TIME_SEG2 : RO | R/W; bitpos: [6:4]; default: 0;
* The width of PBS2.
*/
#define TWAI_TIME_SEG2 0x00000007
#define TWAI_TIME_SEG2_M (TWAI_TIME_SEG2_V << TWAI_TIME_SEG2_S)
#define TWAI_TIME_SEG2_V 0x00000007
#define TWAI_TIME_SEG2_S 4
/* TWAI_TIME_SEG1 : RO | R/W; bitpos: [3:0]; default: 0;
* The width of PBS1.
*/
#define TWAI_TIME_SEG1 0x0000000F
#define TWAI_TIME_SEG1_M (TWAI_TIME_SEG1_V << TWAI_TIME_SEG1_S)
#define TWAI_TIME_SEG1_V 0x0000000F
#define TWAI_TIME_SEG1_S 0
/* TWAI_ARB_LOST_CAP_REG register
* Arbitration Lost Capture Register
*/
#define TWAI_ARB_LOST_CAP_REG (DR_REG_TWAI_BASE + 0x2c)
/* TWAI_ARB_LOST_CAP : RO; bitpos: [4:0]; default: 0;
* This register contains information about the bit position of lost
* arbitration.
*/
#define TWAI_ARB_LOST_CAP 0x0000001F
#define TWAI_ARB_LOST_CAP_M (TWAI_ARB_LOST_CAP_V << TWAI_ARB_LOST_CAP_S)
#define TWAI_ARB_LOST_CAP_V 0x0000001F
#define TWAI_ARB_LOST_CAP_S 0
/* TWAI_ERR_CODE_CAP_REG register
* Error Code Capture Register
*/
#define TWAI_ERR_CODE_CAP_REG (DR_REG_TWAI_BASE + 0x30)
/* TWAI_ECC_TYPE : RO; bitpos: [7:6]; default: 0;
* This register contains information about error types: 00: bit error; 01:
* form error; 10: stuff error; 11: other type of error
*/
#define TWAI_ECC_TYPE 0x00000003
#define TWAI_ECC_TYPE_M (TWAI_ECC_TYPE_V << TWAI_ECC_TYPE_S)
#define TWAI_ECC_TYPE_V 0x00000003
#define TWAI_ECC_TYPE_S 6
/* TWAI_ECC_DIRECTION : RO; bitpos: [5]; default: 0;
* This register contains information about transmission direction of the
* node when error occurs. 1: Error occurs when receiving a message; 0:
* Error occurs when transmitting a message
*/
#define TWAI_ECC_DIRECTION (BIT(5))
#define TWAI_ECC_DIRECTION_M (TWAI_ECC_DIRECTION_V << TWAI_ECC_DIRECTION_S)
#define TWAI_ECC_DIRECTION_V 0x00000001
#define TWAI_ECC_DIRECTION_S 5
/* TWAI_ECC_SEGMENT : RO; bitpos: [4:0]; default: 0;
* This register contains information about the location of errors, see
* Table 181 for details.
*/
#define TWAI_ECC_SEGMENT 0x0000001F
#define TWAI_ECC_SEGMENT_M (TWAI_ECC_SEGMENT_V << TWAI_ECC_SEGMENT_S)
#define TWAI_ECC_SEGMENT_V 0x0000001F
#define TWAI_ECC_SEGMENT_S 0
/* TWAI_ERR_WARNING_LIMIT_REG register
* Error Warning Limit Register
*/
#define TWAI_ERR_WARNING_LIMIT_REG (DR_REG_TWAI_BASE + 0x34)
/* TWAI_ERR_WARNING_LIMIT : RO | R/W; bitpos: [7:0]; default: 96;
* Error warning threshold. In the case when any of a error counter value
* exceeds the threshold, or all the error counter values are below the
* threshold, an error warning interrupt will be triggered (given the enable
* signal is valid).
*/
#define TWAI_ERR_WARNING_LIMIT 0x000000FF
#define TWAI_ERR_WARNING_LIMIT_M (TWAI_ERR_WARNING_LIMIT_V << TWAI_ERR_WARNING_LIMIT_S)
#define TWAI_ERR_WARNING_LIMIT_V 0x000000FF
#define TWAI_ERR_WARNING_LIMIT_S 0
/* TWAI_RX_ERR_CNT_REG register
* Receive Error Counter Register
*/
#define TWAI_RX_ERR_CNT_REG (DR_REG_TWAI_BASE + 0x38)
/* TWAI_RX_ERR_CNT : RO | R/W; bitpos: [7:0]; default: 0;
* The RX error counter register, reflects value changes under reception
* status.
*/
#define TWAI_RX_ERR_CNT 0x000000FF
#define TWAI_RX_ERR_CNT_M (TWAI_RX_ERR_CNT_V << TWAI_RX_ERR_CNT_S)
#define TWAI_RX_ERR_CNT_V 0x000000FF
#define TWAI_RX_ERR_CNT_S 0
/* TWAI_TX_ERR_CNT_REG register
* Transmit Error Counter Register
*/
#define TWAI_TX_ERR_CNT_REG (DR_REG_TWAI_BASE + 0x3c)
/* TWAI_TX_ERR_CNT : RO | R/W; bitpos: [7:0]; default: 0;
* The TX error counter register, reflects value changes under transmission
* status.
*/
#define TWAI_TX_ERR_CNT 0x000000FF
#define TWAI_TX_ERR_CNT_M (TWAI_TX_ERR_CNT_V << TWAI_TX_ERR_CNT_S)
#define TWAI_TX_ERR_CNT_V 0x000000FF
#define TWAI_TX_ERR_CNT_S 0
/* TWAI_DATA_0_REG register
* Data register 0
*/
#define TWAI_DATA_0_REG (DR_REG_TWAI_BASE + 0x40)
/* TWAI_TX_BYTE_0 : WO; bitpos: [7:0]; default: 0;
* Stored the 0th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_0 0x000000FF
#define TWAI_TX_BYTE_0_M (TWAI_TX_BYTE_0_V << TWAI_TX_BYTE_0_S)
#define TWAI_TX_BYTE_0_V 0x000000FF
#define TWAI_TX_BYTE_0_S 0
/* TWAI_ACCEPTANCE_CODE_0 : WO; bitpos: [7:0]; default: 0;
* Stored the 0th byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_CODE_0 0x000000FF
#define TWAI_ACCEPTANCE_CODE_0_M (TWAI_ACCEPTANCE_CODE_0_V << TWAI_ACCEPTANCE_CODE_0_S)
#define TWAI_ACCEPTANCE_CODE_0_V 0x000000FF
#define TWAI_ACCEPTANCE_CODE_0_S 0
/* TWAI_DATA_1_REG register
* Data register 1
*/
#define TWAI_DATA_1_REG (DR_REG_TWAI_BASE + 0x44)
/* TWAI_TX_BYTE_1 : WO; bitpos: [7:0]; default: 0;
* Stored the 1st byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_1 0x000000FF
#define TWAI_TX_BYTE_1_M (TWAI_TX_BYTE_1_V << TWAI_TX_BYTE_1_S)
#define TWAI_TX_BYTE_1_V 0x000000FF
#define TWAI_TX_BYTE_1_S 0
/* TWAI_ACCEPTANCE_CODE_1 : WO; bitpos: [7:0]; default: 0;
* Stored the 1st byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_CODE_1 0x000000FF
#define TWAI_ACCEPTANCE_CODE_1_M (TWAI_ACCEPTANCE_CODE_1_V << TWAI_ACCEPTANCE_CODE_1_S)
#define TWAI_ACCEPTANCE_CODE_1_V 0x000000FF
#define TWAI_ACCEPTANCE_CODE_1_S 0
/* TWAI_DATA_2_REG register
* Data register 2
*/
#define TWAI_DATA_2_REG (DR_REG_TWAI_BASE + 0x48)
/* TWAI_TX_BYTE_2 : WO; bitpos: [7:0]; default: 0;
* Stored the 2nd byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_2 0x000000FF
#define TWAI_TX_BYTE_2_M (TWAI_TX_BYTE_2_V << TWAI_TX_BYTE_2_S)
#define TWAI_TX_BYTE_2_V 0x000000FF
#define TWAI_TX_BYTE_2_S 0
/* TWAI_ACCEPTANCE_CODE_2 : WO; bitpos: [7:0]; default: 0;
* Stored the 2nd byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_CODE_2 0x000000FF
#define TWAI_ACCEPTANCE_CODE_2_M (TWAI_ACCEPTANCE_CODE_2_V << TWAI_ACCEPTANCE_CODE_2_S)
#define TWAI_ACCEPTANCE_CODE_2_V 0x000000FF
#define TWAI_ACCEPTANCE_CODE_2_S 0
/* TWAI_DATA_3_REG register
* Data register 3
*/
#define TWAI_DATA_3_REG (DR_REG_TWAI_BASE + 0x4c)
/* TWAI_TX_BYTE_3 : WO; bitpos: [7:0]; default: 0;
* Stored the 3rd byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_3 0x000000FF
#define TWAI_TX_BYTE_3_M (TWAI_TX_BYTE_3_V << TWAI_TX_BYTE_3_S)
#define TWAI_TX_BYTE_3_V 0x000000FF
#define TWAI_TX_BYTE_3_S 0
/* TWAI_ACCEPTANCE_CODE_3 : WO; bitpos: [7:0]; default: 0;
* Stored the 3rd byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_CODE_3 0x000000FF
#define TWAI_ACCEPTANCE_CODE_3_M (TWAI_ACCEPTANCE_CODE_3_V << TWAI_ACCEPTANCE_CODE_3_S)
#define TWAI_ACCEPTANCE_CODE_3_V 0x000000FF
#define TWAI_ACCEPTANCE_CODE_3_S 0
/* TWAI_DATA_4_REG register
* Data register 4
*/
#define TWAI_DATA_4_REG (DR_REG_TWAI_BASE + 0x50)
/* TWAI_TX_BYTE_4 : WO; bitpos: [7:0]; default: 0;
* Stored the 4th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_4 0x000000FF
#define TWAI_TX_BYTE_4_M (TWAI_TX_BYTE_4_V << TWAI_TX_BYTE_4_S)
#define TWAI_TX_BYTE_4_V 0x000000FF
#define TWAI_TX_BYTE_4_S 0
/* TWAI_ACCEPTANCE_MASK_0 : WO; bitpos: [7:0]; default: 0;
* Stored the 0th byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_MASK_0 0x000000FF
#define TWAI_ACCEPTANCE_MASK_0_M (TWAI_ACCEPTANCE_MASK_0_V << TWAI_ACCEPTANCE_MASK_0_S)
#define TWAI_ACCEPTANCE_MASK_0_V 0x000000FF
#define TWAI_ACCEPTANCE_MASK_0_S 0
/* TWAI_DATA_5_REG register
* Data register 5
*/
#define TWAI_DATA_5_REG (DR_REG_TWAI_BASE + 0x54)
/* TWAI_TX_BYTE_5 : WO; bitpos: [7:0]; default: 0;
* Stored the 5th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_5 0x000000FF
#define TWAI_TX_BYTE_5_M (TWAI_TX_BYTE_5_V << TWAI_TX_BYTE_5_S)
#define TWAI_TX_BYTE_5_V 0x000000FF
#define TWAI_TX_BYTE_5_S 0
/* TWAI_ACCEPTANCE_MASK_1 : WO; bitpos: [7:0]; default: 0;
* Stored the 1st byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_MASK_1 0x000000FF
#define TWAI_ACCEPTANCE_MASK_1_M (TWAI_ACCEPTANCE_MASK_1_V << TWAI_ACCEPTANCE_MASK_1_S)
#define TWAI_ACCEPTANCE_MASK_1_V 0x000000FF
#define TWAI_ACCEPTANCE_MASK_1_S 0
/* TWAI_DATA_6_REG register
* Data register 6
*/
#define TWAI_DATA_6_REG (DR_REG_TWAI_BASE + 0x58)
/* TWAI_TX_BYTE_6 : WO; bitpos: [7:0]; default: 0;
* Stored the 6th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_6 0x000000FF
#define TWAI_TX_BYTE_6_M (TWAI_TX_BYTE_6_V << TWAI_TX_BYTE_6_S)
#define TWAI_TX_BYTE_6_V 0x000000FF
#define TWAI_TX_BYTE_6_S 0
/* TWAI_ACCEPTANCE_MASK_2 : WO; bitpos: [7:0]; default: 0;
* Stored the 2nd byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_MASK_2 0x000000FF
#define TWAI_ACCEPTANCE_MASK_2_M (TWAI_ACCEPTANCE_MASK_2_V << TWAI_ACCEPTANCE_MASK_2_S)
#define TWAI_ACCEPTANCE_MASK_2_V 0x000000FF
#define TWAI_ACCEPTANCE_MASK_2_S 0
/* TWAI_DATA_7_REG register
* Data register 7
*/
#define TWAI_DATA_7_REG (DR_REG_TWAI_BASE + 0x5c)
/* TWAI_TX_BYTE_7 : WO; bitpos: [7:0]; default: 0;
* Stored the 7th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_7 0x000000FF
#define TWAI_TX_BYTE_7_M (TWAI_TX_BYTE_7_V << TWAI_TX_BYTE_7_S)
#define TWAI_TX_BYTE_7_V 0x000000FF
#define TWAI_TX_BYTE_7_S 0
/* TWAI_ACCEPTANCE_MASK_3 : WO; bitpos: [7:0]; default: 0;
* Stored the 3th byte of the filter code in reset mode.
*/
#define TWAI_ACCEPTANCE_MASK_3 0x000000FF
#define TWAI_ACCEPTANCE_MASK_3_M (TWAI_ACCEPTANCE_MASK_3_V << TWAI_ACCEPTANCE_MASK_3_S)
#define TWAI_ACCEPTANCE_MASK_3_V 0x000000FF
#define TWAI_ACCEPTANCE_MASK_3_S 0
/* TWAI_DATA_8_REG register
* Data register 8
*/
#define TWAI_DATA_8_REG (DR_REG_TWAI_BASE + 0x60)
/* TWAI_TX_BYTE_8 : WO; bitpos: [7:0]; default: 0;
* Stored the 8th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_8 0x000000FF
#define TWAI_TX_BYTE_8_M (TWAI_TX_BYTE_8_V << TWAI_TX_BYTE_8_S)
#define TWAI_TX_BYTE_8_V 0x000000FF
#define TWAI_TX_BYTE_8_S 0
/* TWAI_DATA_9_REG register
* Data register 9
*/
#define TWAI_DATA_9_REG (DR_REG_TWAI_BASE + 0x64)
/* TWAI_TX_BYTE_9 : WO; bitpos: [7:0]; default: 0;
* Stored the 9th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_9 0x000000FF
#define TWAI_TX_BYTE_9_M (TWAI_TX_BYTE_9_V << TWAI_TX_BYTE_9_S)
#define TWAI_TX_BYTE_9_V 0x000000FF
#define TWAI_TX_BYTE_9_S 0
/* TWAI_DATA_10_REG register
* Data register 10
*/
#define TWAI_DATA_10_REG (DR_REG_TWAI_BASE + 0x68)
/* TWAI_TX_BYTE_10 : WO; bitpos: [7:0]; default: 0;
* Stored the 10th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_10 0x000000FF
#define TWAI_TX_BYTE_10_M (TWAI_TX_BYTE_10_V << TWAI_TX_BYTE_10_S)
#define TWAI_TX_BYTE_10_V 0x000000FF
#define TWAI_TX_BYTE_10_S 0
/* TWAI_DATA_11_REG register
* Data register 11
*/
#define TWAI_DATA_11_REG (DR_REG_TWAI_BASE + 0x6c)
/* TWAI_TX_BYTE_11 : WO; bitpos: [7:0]; default: 0;
* Stored the 11th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_11 0x000000FF
#define TWAI_TX_BYTE_11_M (TWAI_TX_BYTE_11_V << TWAI_TX_BYTE_11_S)
#define TWAI_TX_BYTE_11_V 0x000000FF
#define TWAI_TX_BYTE_11_S 0
/* TWAI_DATA_12_REG register
* Data register 12
*/
#define TWAI_DATA_12_REG (DR_REG_TWAI_BASE + 0x70)
/* TWAI_TX_BYTE_12 : WO; bitpos: [7:0]; default: 0;
* Stored the 12th byte information of the data to be transmitted under
* operating mode.
*/
#define TWAI_TX_BYTE_12 0x000000FF
#define TWAI_TX_BYTE_12_M (TWAI_TX_BYTE_12_V << TWAI_TX_BYTE_12_S)
#define TWAI_TX_BYTE_12_V 0x000000FF
#define TWAI_TX_BYTE_12_S 0
/* TWAI_RX_MESSAGE_CNT_REG register
* Receive Message Counter Register
*/
#define TWAI_RX_MESSAGE_CNT_REG (DR_REG_TWAI_BASE + 0x74)
/* TWAI_RX_MESSAGE_COUNTER : RO; bitpos: [6:0]; default: 0;
* This register reflects the number of messages available within the RX
* FIFO.
*/
#define TWAI_RX_MESSAGE_COUNTER 0x0000007F
#define TWAI_RX_MESSAGE_COUNTER_M (TWAI_RX_MESSAGE_COUNTER_V << TWAI_RX_MESSAGE_COUNTER_S)
#define TWAI_RX_MESSAGE_COUNTER_V 0x0000007F
#define TWAI_RX_MESSAGE_COUNTER_S 0
/* TWAI_CLOCK_DIVIDER_REG register
* Clock Divider register
*/
#define TWAI_CLOCK_DIVIDER_REG (DR_REG_TWAI_BASE + 0x7c)
/* TWAI_CLOCK_OFF : RO | R/W; bitpos: [8]; default: 0;
* This bit can be configured under reset mode. 1: Disable the external
* CLKOUT pin; 0: Enable the external CLKOUT pin
*/
#define TWAI_CLOCK_OFF (BIT(8))
#define TWAI_CLOCK_OFF_M (TWAI_CLOCK_OFF_V << TWAI_CLOCK_OFF_S)
#define TWAI_CLOCK_OFF_V 0x00000001
#define TWAI_CLOCK_OFF_S 8
/* TWAI_CD : R/W; bitpos: [7:0]; default: 0;
* These bits are used to configure frequency dividing coefficients of the
* external CLKOUT pin.
*/
#define TWAI_CD 0x000000FF
#define TWAI_CD_M (TWAI_CD_V << TWAI_CD_S)
#define TWAI_CD_V 0x000000FF
#define TWAI_CD_S 0
#endif /* __ARCH_XTENSA_SRC_ESP32_HARDWARE_ESP32_TWAI_H */