34#ifndef _FREERTOS_DRIVERS_COMMON_TCAN4550CAN_HXX_
35#define _FREERTOS_DRIVERS_COMMON_TCAN4550CAN_HXX_
47#define TCAN4550_DEBUG 0
62 void (*interrupt_enable)(),
void (*interrupt_disable)(),
66 const Gpio *test_pin =
nullptr
101 void init(
const char *spi_name, uint32_t freq, uint32_t baud,
102 uint16_t rx_timeout_bits);
105 __attribute__((optimize(
"-O3")))
110 sem_.post_from_isr(&woken);
111 os_isr_exit_yield_test(woken);
273 static_assert(
TXEFS * 4 == 0x10F4,
"register enum misaligned");
274 static_assert(
ILE * 4 == 0x105C,
"register enum misaligned");
276 "register enum misaligned");
405 Nbtp(uint32_t sjw, uint32_t tseg2, uint32_t tseg1, uint32_t brp)
979 "unexpected MRAMSPIMessage size");
995 ssize_t
read(
File *file,
void *buf,
size_t count)
override;
1003 ssize_t
write(
File *file,
const void *buf,
size_t count)
override;
1010 int ioctl(
File *file,
unsigned long int key,
unsigned long data)
override;
1021 void *
entry()
override;
1035 __attribute__((optimize(
"-O3")))
1040 msg.
addrH = address >> 6;
1041 msg.
addrL = (address << 2) & 0xFF;
1044 spi_ioc_transfer xfer;
1045 xfer.tx_buf = (
unsigned long)(&msg);
1046 xfer.rx_buf = (
unsigned long)(&msg);
1047 xfer.len =
sizeof(msg);
1061 __attribute__((optimize(
"-O3")))
1066 msg.
addrH = address >> 6;
1067 msg.
addrL = (address << 2) & 0xFF;
1071 spi_ioc_transfer xfer;
1072 xfer.tx_buf = (
unsigned long)(&msg);
1073 xfer.rx_buf = (
unsigned long)(&msg);
1074 xfer.len =
sizeof(msg);
1086 __attribute__((optimize(
"-O3")))
1092 msg.
addrH = address >> 8;
1093 msg.
addrL = address & 0xFF;
1096 spi_ioc_transfer xfer[2];
1097 xfer[0].tx_buf = (
unsigned long)(&msg);
1098 xfer[0].rx_buf = (
unsigned long)(&msg);
1100 xfer[1].tx_buf = (
unsigned long)(
nullptr);
1101 xfer[1].rx_buf = (
unsigned long)(buf);
1114 __attribute__((optimize(
"-O3")))
1118 "Unexpected MRAMTXBuffer size");
1121 buf->header.cmd =
WRITE;
1122 buf->header.addrH = address >> 8;
1123 buf->header.addrL = address & 0xFF;
1124 buf->header.length = count * (
sizeof(
MRAMTXBuffer) / 4);
1126 spi_ioc_transfer xfer;
1127 xfer.tx_buf = (
unsigned long)&buf->header;
1128 xfer.rx_buf = (
unsigned long)&buf->header;
1129 xfer.len =
sizeof(buf->header) + (count *
sizeof(
MRAMTXBuffer));
1133 HASSERT((buf->header.status & 0x8) == 0);
1156 volatile uint32_t regs_[64];
1157 volatile uint32_t status_;
1158 volatile uint32_t enable_;
1159 volatile uint32_t spiStatus_;
1160 const Gpio *testPin_;
Lightweight locking class for protecting small critical sections.
Base class for a CAN device for the Arduino environment.
const char * name
device name
OS-independent abstraction for GPIO.
OSMutex lock_
protects internal structures.
This class provides a mutex API.
This class provides a counting semaphore API.
This class provides a threading API.
Private data for an SPI device.
int transfer_with_cs_assert_polled(struct spi_ioc_transfer *msgs, int num=1)
Method to transmit/receive the data.
Specification of CAN driver for the TCAN4550.
static constexpr uint32_t TX_FIFO_SIZE
size in elements for the TX FIFO
static constexpr uint16_t TX_BUFFERS_MRAM_ADDR
start address of TX BUFFERS in MRAM
void disable() override
function to disable device
void * entry() override
User entry point for the created thread.
MCANInterrupt mcanInterruptEnable_
shadow for the interrupt enable
bool select(File *file, int mode) override
Device select method.
@ WRITE
write one or more addresses
@ READ
read one or more addresses
static constexpr uint32_t TX_DEDICATED_BUFFER_COUNT
size in elements for the dedicated TX buffers
static constexpr uint16_t RX_FIFO_0_MRAM_ADDR
start address of RX FIFO 0 in MRAM
uint32_t register_read(Registers address)
Read from a SPI register.
void init(const char *spi_name, uint32_t freq, uint32_t baud, uint16_t rx_timeout_bits)
Initialize CAN device settings.
int spiFd_
SPI bus that accesses TCAN4550.
int ioctl(File *file, unsigned long int key, unsigned long data) override
Request an ioctl transaction.
Registers
SPI Registers, word addressing, not byte addressing.
@ TXFQS
0xC4 0xC4 TX FIFO/queue status
@ RXF0C
0xA0 -— RX FIFO 0 configuration
@ RSVD15
0xE8 -— reserved
@ NBTP
nominal bit timing and prescaler
@ INTERRUPT_STATUS
interrupt and diagnostic flags
@ RXESC
0xBC -— RX buffer/FIFO element size configuration
@ TXBCIE
0xE4 0xE0 TX buffer cancellation finished interrupt enable
@ TXEFS
0xF4 0xE4 TX event FIFO status
@ DBTP
data bit timing and prescaler
@ TXBAR
0xD0 0xCC TX buffer add request
@ RXF0S
0xA4 0x90 RX FIFO 0 status
@ ECC
ECC error detection and testing.
@ NDAT1
0x98 -— new data 1
@ TXBTO
0xD8 0xD4 TX buffer transmission occurred
@ TXESC
0xC8 -— TX buffer element size configuration
@ TXEFC
0xF0 -— TX event FIFO configuration
@ RXF0A
0xA8 0x94 RX FIFO 0 Acknowledge
@ RXBC
0xAC -— RX buffer configuration
@ RXF1S
0xB4 0x98 RX FIFO 1 status
@ ILE
interrupt line enable
@ HPMS
0x94 0x88 high prioirty message status
@ RXF1A
0xB8 0x9C RX FIFO 1 acknowledge
@ RSVD14
0x8C -— reserved
@ MCAN_INTERRUPT_STATUS
interrupt flags related to MCAN core
@ SIDFC
0x84 -— standard ID filter configuration
@ DEVICE_IDL
device ID "TCAN"
@ RXF1C
0xB0 -— RX FIFO 1 configuration
@ RSVD16
0xEC -— reserved
@ TXEFA
0xF8 0xE8 TX event FIFO acknowledge
@ GFC
0x80 0x80 global filter configuration
@ TXBC
0xC0 0xC0 TX buffer configuration
@ TXBRP
0xCC 0xC8 TX buffer request pending
@ INTERRUPT_ENABLE
interrupt and diagnostic flags
@ MODE
modes of operation and pin configurations
@ TOCV
timeout counter value
@ DEVICE_IDH
device ID "4550"
@ REVISION
silicon revision
@ TIMESTAMP_PRESCALER
timestamp presacaler
@ XIDAM
0x90 0x84 extended ID and mask
@ TDCR
transmitter delay compensation
@ TXBTIE
0xE0 0xDC TX buffer transmission interrupt enable
@ TXBCF
0xDC 0xD8 TX buffer cancellation finished
@ TEST
read and write test registers, scratchpad
@ TXBCR
0xD4 0xD0 TX buffer cancellation request
@ TSCC
timestamp counter configuration
@ TOCC
timeout counter configuration
@ TSCV
timestamp counter value
@ XIDFC
0x88 -— extended ID filter configuration
@ ILS
interrupt line select
@ NDAT2
0x9C -— new data 2
static constexpr uint32_t RX_FIFO_SIZE
size in elements for the RX FIFO
void txbuf_write(uint16_t offset, MRAMTXBufferMultiWrite *buf, size_t count)
Write one or more TX buffers.
ssize_t write(File *file, const void *buf, size_t count) override
Write to a file or device.
static constexpr size_t MRAM_SIZE_WORDS
size in words of the MRAM memory
TCAN4550Can(const char *name, void(*interrupt_enable)(), void(*interrupt_disable)(), const Gpio *test_pin=nullptr)
Constructor.
void tx_msg() override
Function to try and transmit a message.
void(* interruptEnable_)()
enable interrupt callback
static constexpr uint16_t TX_EVENT_FIFO_MRAM_ADDR
start address of TX Event FIFO in MRAM
void register_write(Registers address, uint32_t data)
Write to a SPI register.
~TCAN4550Can()
Destructor.
SPI * spi_
pointer to a SPI object instance
ssize_t read(File *file, void *buf, size_t count) override
Read from a file or device.
static constexpr uint32_t TX_FIFO_BUFFERS_MASK
mask of all the TX buffers used in the TX FIFO
void enable() override
function to enable device
uint8_t txPending_
waiting on a TX active event
void rxbuf_read(uint16_t offset, MRAMRXBuffer *buf, size_t count)
Read one or more RX buffers.
static constexpr uint32_t SPI_MAX_SPEED_HZ
maximum SPI clock speed in Hz
void interrupt_handler()
Handle an interrupt. Called by user provided interrupt handler.
OSSem sem_
semaphore for posting events
void flush_buffers() override
Called after disable.
MRAMTXBufferMultiWrite txBufferMultiWrite_
Allocating this buffer here avoids having to put it on the TCAN4550Can::write() caller's stack.
static constexpr uint16_t MRAM_ADDR_OFFSET
Offset of the MRAM address over SPI.
TCAN4550Can()
Default Constructor.
uint8_t state_
present bus state
uint8_t rxPending_
waiting on a RX active event
static constexpr uint16_t TX_FIFO_BUFFERS_MRAM_ADDR
start address of TX FIFO in MRAM
uint32_t txCompleteMask_
shadow for the transmit complete buffer mask
static const TCAN4550Baud BAUD_TABLE[]
baud rate settings table
OSMutex * get_spi_bus_lock()
Return a mutex that can be used by another SPI driver instance sharing the same bus as its bus lock.
void(* interruptDisable_)()
disable interrupt callback
static constexpr uint32_t TX_EVENT_FIFO_SIZE
size in elements for the TX event FIFO
#define CAN_STATE_STOPPED
CAN bus stopped.
#define HASSERT(x)
Checks that the value of expression x is true, else terminates the current process.
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Removes default copy-constructor and assignment added by C++.
static constexpr const Gpio * instance()
CC control register definition.
uint32_t txp
transmitter pause
uint32_t brse
bit rate switch enable
uint32_t efbi
edge filtering during bus integration
uint32_t test
test mode enable
uint32_t asm_
restricted operation mode
uint32_t data
raw word value
uint32_t fdoe
FD operation enable.
uint32_t csa
clock stop acknowledge
uint32_t cce
configuration change enable
Cccr()
Constructor. Sets the reset value.
uint32_t dar
disable automatic retransmission
uint32_t niso
non ISO operation
uint32_t mon
bus monitorying mode is disabled
uint32_t csr
clock stop request
uint32_t pxhd
protocol exception handling disable
uint32_t init
initialzation
Data bit timing and prescaler register definition.
uint32_t reserved1
reserved
uint32_t dtseg1
data time segment after sample
uint32_t reserved2
reserved
uint32_t data
raw word value
uint32_t reserved3
reserved
uint32_t tdc
trasmitter delay compensation
uint32_t dbrp
data bit rate prescaler
uint32_t dsjw
data (re)synchronization jump width
uint32_t dtseg2
data time segment before sample
Dbtp(uint32_t dsjw, uint32_t dtseg2, uint32_t dtseg1, uint32_t dbrp, uint32_t tdc)
Constructor.
MCAN interrupt line enable register definition.
Ile()
Constructor. Sets the reset value.
uint32_t eint1
enable interrupt line 1
uint32_t eint0
enable interrupt line 0
uint32_t data
raw word value
TCAN4550 interrupt registers (INTERRUPT_ENABLE/STATUS)
uint32_t wdto
watchdog timeout
uint32_t tsd
thermal shutdown
uint32_t sms
sleep mode status
uint32_t canslnt
CAN silent.
uint32_t spierr
SPI error.
uint32_t globalerr
global error (any fault)
Interrupt()
Constructor. Sets the reset value.
uint32_t wkrq
wake request
uint32_t mcanint
M_CAN global interrupt.
uint32_t canint
CAN bus wake up interrupt.
uint32_t data
raw word value
uint32_t lwu
local wake up
uint32_t eccerr
uncorrectable ECC error detected
uint32_t vtwd
global voltage, temp or wdto
uint32_t uvsup
under voltage VSUP and UVCCOUT
uint32_t candom
CAN stuck dominant.
uint32_t uvio
under voltage VIO
uint32_t canbusnom
CAN bus normal.
MCAN interrupt registers (IR, IE, and ILS) definition.
uint32_t rf1l
RX FIFO 1 message lost.
uint32_t tcf
transmission cancellation finished
uint32_t bec
bit error corrected
uint32_t teff
TX event FIFO full.
uint32_t tefw
TX event FIFO watermark reached.
uint32_t mraf
message RAM access failure
uint32_t rf1f
RX FIFO 1 full.
uint32_t rf1n
RX FIFO 1 new message.
uint32_t rf0f
RX FIFO 0 full.
uint32_t ped
protocol error in data phase
uint32_t tefn
TX event FIFO new entry.
uint32_t rf1w
RX FIFO 1 watermark reached.
uint32_t tefl
TX event FIFO event lost.
uint32_t tfe
TX FIFO empty.
uint32_t drx
message stored to dedicated RX buffer
uint32_t beu
bit error uncorrected
uint32_t tc
transmission completed
uint32_t hpm
high priority message
uint32_t too
timeout occurred
uint32_t rf0l
RX FIFO 0 message lost.
uint32_t elo
error logging overflow
uint32_t ara
access to reserved address
uint32_t rf0w
RX FIFO 0 watermark reached.
uint32_t rf0n
RX FIFO 0 new message.
uint32_t pea
protocol error in arbitration phase
MCANInterrupt()
Constructor. Sets the reset value.
uint32_t data
raw word value
uint32_t bo
bus-off status
uint32_t tsw
timestamp wraparound
uint32_t ew
warning status
uint64_t data64
data payload (64-bit)
uint16_t data16[4]
data payload (0 - 3 half word)
uint8_t data[8]
data payload (0 - 8 byte)
uint32_t brs
bit rate switch
uint32_t xtd
extended identifier
uint32_t id
CAN identifier.
uint32_t esi
error state indicator
uint32_t fidx
filter index that message mached if ANMF = 0
uint32_t anmf
accepted non-matching frame of filter element
uint32_t dlc
data length code
uint32_t rxts
receive timestamp
uint32_t rtr
remote transmission request
uint32_t data32[2]
data payload (0 - 1 word)
MRAM SPI message for read/write commands.
uint8_t addrL
register address LSB
uint8_t payload[4]
raw payload
uint32_t payload32
raw paylaod as 32-bit value
uint8_t length
length in words
uint8_t addrH
register address MSB
uint8_t status
bits 0..7 of INTERRUPT_STATUS
Structure for writing multiple TX buffers in one SPI transaction.
MRAMTXBuffer txBuffers[TX_FIFO_SIZE]
buffer payload
uint32_t padding
padding for 8-byte alignment
MRAMSPIMessage header
message header
uint32_t mm
message marker
uint64_t data64
data payload 64-bit
uint32_t efc
event FIFO control
uint16_t data16[4]
data payload (0 - 3 half word)
uint32_t data32[2]
data payload (0 - 1 word)
uint32_t brs
bit rate switch
uint32_t id
CAN identifier.
uint32_t dlc
data length code
uint32_t esi
error state indicator
uint32_t xtd
extended identifier
uint32_t rtr
remote transmission request
TX Event FIFO Element structure.
uint32_t esi
error state indicator
uint32_t brs
bit rate switch
uint32_t mm
message marker
uint32_t txts
transmit timestamp
uint32_t id
CAN identifier.
uint32_t dlc
data length code
uint32_t xtd
extended identifier
uint32_t rtr
remote transmission request
Mode register definition.
Mode()
Constructor. Sets the reset value.
uint32_t reserved1
reserved
uint32_t gpio1GpoConfig
GPIO1 output function select.
uint32_t nWkrqConfig
nWKRQ pin function
uint32_t wdBitSet
write a '1' to reset timer
uint32_t wdEnable
watchdog enable
uint32_t inhDisable
INH pin disable.
uint32_t reserved2
reserved
uint32_t sweDis
sleep wake error disable
uint32_t testModeEn
test mode enable
uint32_t data
raw word value
uint32_t wakeConfig
Wake pin configuration.
uint32_t modeSel
mode of operation select
uint32_t testModeConfig
test mode configuration
uint32_t clkRef
CLKIN/crystal freq reference.
uint32_t reset
device reset
uint32_t wdTimer
watchdog timer
uint32_t gpio1Config
GPIO1 pin function select.
uint32_t nWkrqVoltage
nWKRQ pin GPO buffer voltage
uint32_t wdAction
selected watchdog action
uint32_t reserved3
reserved
uint32_t gpo2Config
GPO2 pin configuration.
uint32_t failSafeEnable
fail safe mode enable
uint32_t reserved4
reserved
Nominal bit timing & prescaler register definition.
Nbtp(uint32_t sjw, uint32_t tseg2, uint32_t tseg1, uint32_t brp)
Constructor.
uint32_t ntseg1
time segment after sample
uint32_t data
raw word value
uint32_t nbrp
bit rate prescaler
uint32_t nsjw
re-synchronization jump width
uint32_t ntseg2
time segment before sample
Protocol status register definition.
uint32_t dlec
data phase last error code
uint32_t ew
warning status
uint32_t lec
last error code
uint32_t data
raw word value
uint32_t rbrs
BRS of last received CAN FD message.
uint32_t pxe
protocol exception event
uint32_t bo
bus-off status
uint32_t resi
ESI of last received CAN FD message.
uint32_t rfdf
received a CAN FD message
uint32_t tdcv
transmitter delauy compenation value
RX FIFO x acknowledge register definition.
Rxfxa()
Constructor. Sets the reset value.
uint32_t fai
RX FIFO acknowledge index.
uint32_t data
raw word value
RX FIFO x configuraation register definition.
Rxfxc()
Constructor. Sets the reset value.
uint32_t fsa
RX FIFO start address.
uint32_t fom
RX FIFO operation mode.
uint32_t fwm
RX FIFO high water mark.
uint32_t data
raw word value
RX FIFO x status register definition.
uint32_t data
raw word value
uint32_t fgi
RX FIFO get index.
uint32_t rfl
RX FIFO message lost.
uint32_t fpi
RX FIFO put index.
uint32_t ffl
RX FIFO fill level.
SPI message for read/write commands.
uint8_t addrH
register address MSB
uint8_t addrL
register address LSB
uint64_t payload64
raw payload as 64-bit value
uint8_t payload[8]
raw payload
uint32_t payload32[2]
raw paylaod as 32-bit array
uint8_t status
bits 0..7 of INTERRUPT_STATUS
uint8_t length
length in words
uint32_t freq
incoming frequency
uint32_t baud
target baud rate
Nbtp nbtp
data bit timing and prescaler
Timeout counter configuration register definition.
uint32_t etoc
enable timeout counter
uint32_t top
timeout period
Tocc()
Constructor. Sets the reset value.
uint32_t data
raw word value
uint32_t tos
timeout select
Timeout counter value register definition.
uint32_t data
raw word value
uint32_t toc
timeout counter
Timestamp counter configuration register definition.
Tscc()
Constructor. Sets the reset value.
uint32_t data
raw word value
uint32_t tss
timestamp select
uint32_t tcp
timestamp counter prescaler
Timestamp counter value register definition.
uint32_t tsc
timestamp counter
uint32_t data
raw word value
TX Buffer configuraation register definition.
uint32_t tfqs
TX FIFO/queue size.
uint32_t data
raw word value
Txbc()
Constructor. Sets the reset value.
uint32_t ndtb
number of dediated transmit buffers
uint32_t tbsa
TX buffers start address.
uint32_t tfqm
TX FIFO/queue mode.
TX event FIFO acknowledge register definition.
uint32_t data
raw word value
uint32_t efai
TX event FIFO acknowledge index.
Txefa()
Constructor. Sets the reset value.
TX event FIFO configuration register definition.
uint32_t efsa
event FIFO start address
uint32_t efwm
event FIFO watermark
Txefc()
Constructor. Sets the reset value.
uint32_t efs
event FIFO size
uint32_t data
raw word value
TX event FIFO status register definition.
uint32_t data
raw word value
uint32_t efpi
event FIFO put index
uint32_t efgi
event FIFO get index
uint32_t tefl
TX event FIFO element lost.
uint32_t effl
event FIFO fill level
uint32_t eff
event FIFO full
TX buffer element size configurataion register definition.
uint32_t tbds
TX buffer data field size.
uint32_t data
raw word value
Txesc()
Constructor. Sets the reset value.
TX FIFO/queue status register definition.
uint32_t tfgi
TX FIFO/queue get index.
uint32_t tfqpi
TX FIFO/queue put index.
uint32_t data
raw word value
uint32_t tfqf
TX FIFO/queue full.
uint32_t tffl
TX FIFO free level.