Loading...
Searching...
No Matches
fdcandev_stm32.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024 COGIP Robotics association
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser
5 * General Public License v2.1. See the file LICENSE in the top level
6 * directory for more details.
7 */
8
9#pragma once
10
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37#include "can/candev.h"
38
40#if defined(FDCAN3)
41#define FDCANDEV_STM32_CHAN_NUMOF 3
42#elif defined(FDCAN2)
43#define FDCANDEV_STM32_CHAN_NUMOF 2
44#elif defined(FDCAN1) || DOXYGEN
45#define FDCANDEV_STM32_CHAN_NUMOF 1
46#else
47#error "FDCAN STM32: CPU not supported"
48#endif
49
54#define ISR_FDCAN1_IT0 isr_fdcan1_it0
55#define ISR_FDCAN1_IT1 isr_fdcan1_it1
57
62#define FDCAN_STM32_NB_STD_FILTER 28U
63#define FDCAN_STM32_NB_EXT_FILTER 8U
64#define FDCAN_STM32_NB_FILTER \
65 (FDCAN_STM32_NB_STD_FILTER + FDCAN_STM32_NB_EXT_FILTER)
66
67
72#ifndef FDCANDEV_STM32_DEFAULT_BITRATE
73#define FDCANDEV_STM32_DEFAULT_BITRATE 500000U
75#endif
76#ifndef FDCANDEV_STM32_DEFAULT_FD_DATA_BITRATE
77#define FDCANDEV_STM32_DEFAULT_FD_DATA_BITRATE 1000000U
79#endif
81
82#ifndef FDCANDEV_STM32_DEFAULT_SPT
84#define FDCANDEV_STM32_DEFAULT_SPT 875
85#endif
86
88typedef struct {
89 FDCAN_GlobalTypeDef *can;
90 uint32_t rcc_mask;
91 gpio_t rx_pin;
92 gpio_t tx_pin;
95 uint8_t it0_irqn;
96 uint8_t it1_irqn;
97 uint8_t ttcm : 1;
98 uint8_t abom : 1;
99 uint8_t awum : 1;
100 uint8_t nart : 1;
101 uint8_t rflm : 1;
102 uint8_t txfp : 1;
103 uint8_t lbkm : 1;
104 uint8_t silm : 1;
105} can_conf_t;
107#define HAVE_CAN_CONF_T
108
113#define FDCAN_STM32_TX_MAILBOXES 3
115#define FDCAN_STM32_RX_MAILBOXES (FDCANDEV_STM32_CHAN_NUMOF * 6)
119
121typedef struct can can_t;
123#define HAVE_CAN_T
124
125#define FDCAN_SRAM_MESSAGE_RAM_SIZE 0x350
126
131#define FDCAN_SRAM_FLESA 0x1CU
132#define FDCAN_SRAM_F0SA 0x2CU
133#define FDCAN_SRAM_F1SA 0x62U
134#define FDCAN_SRAM_EFSA 0x98U
135#define FDCAN_SRAM_TBSA 0x9EU
137
142#define FDCAN_SRAM_FLS_SFID1_Pos (16U)
144#define FDCAN_SRAM_FLS_SFID1_Msk (0x7FFU << FDCAN_SRAM_FLS_SFID1_Pos)
146#define FDCAN_SRAM_FLS_SFID1 FDCAN_SRAM_FLS_SFID1_Msk
148#define FDCAN_SRAM_FLS_SFID2_Msk (0x7FFU)
150#define FDCAN_SRAM_FLS_SFID2 FDCAN_SRAM_FLS_SFID2_Msk
152#define FDCAN_SRAM_FLS_SFT_Pos (30U)
154#define FDCAN_SRAM_FLS_SFT_Msk (0x3U << FDCAN_SRAM_FLS_SFT_Pos)
156#define FDCAN_SRAM_FLS_SFT FDCAN_SRAM_FLS_SFT_Msk
158#define FDCAN_SRAM_FLS_SFEC_Pos (27U)
160#define FDCAN_SRAM_FLS_SFEC_Msk (0x7U << FDCAN_SRAM_FLS_SFEC_Pos)
162#define FDCAN_SRAM_FLS_SFEC FDCAN_SRAM_FLS_SFEC_Msk
165
170#define FDCAN_SRAM_FLS_FILTER_SIZE 1U
172#define FDCAN_SRAM_FLS_SFT_DISABLED (0x3U << FDCAN_SRAM_FLS_SFT_Pos)
174#define FDCAN_SRAM_FLS_SFT_CLASSIC (0x2U << FDCAN_SRAM_FLS_SFT_Pos)
176#define FDCAN_SRAM_FLS_SFEC_DISABLED (0x0U << FDCAN_SRAM_FLS_SFEC_Pos)
178#define FDCAN_SRAM_FLS_SFEC_FIFO0 (0x1U << FDCAN_SRAM_FLS_SFEC_Pos)
180#define FDCAN_SRAM_FLS_SFEC_FIFO1 (0x2U << FDCAN_SRAM_FLS_SFEC_Pos)
183
188#define FDCAN_SRAM_FLE_F0_EFID1_Msk 0x1FFFFFFFU
190#define FDCAN_SRAM_FLE_F0_EFID1 FDCAN_SRAM_FLE_F0_EFID1_Msk
192#define FDCAN_SRAM_FLE_F1_EFID2_Msk 0x1FFFFFFFU
194#define FDCAN_SRAM_FLE_F1_EFID2 FDCAN_SRAM_FLE_F1_EFID2_Msk
196#define FDCAN_SRAM_FLE_F1_EFT_Pos 30U
198#define FDCAN_SRAM_FLE_F1_EFT_Msk (0x3U << FDCAN_SRAM_FLE_F1_EFT_Pos)
200#define FDCAN_SRAM_FLE_F1_EFT FDCAN_SRAM_FLE_F1_EFT_Msk
202#define FDCAN_SRAM_FLE_F0_EFEC_Pos 29U
204#define FDCAN_SRAM_FLE_F0_EFEC_Msk (0x7U << FDCAN_SRAM_FLE_F0_EFEC_Pos)
206#define FDCAN_SRAM_FLE_F0_EFEC FDCAN_SRAM_FLE_F0_EFEC_Msk
209
214#define FDCAN_SRAM_FLE_FILTER_SIZE 2U
216#define FDCAN_SRAM_FLE_F1_EFT_CLASSIC (0x2U << FDCAN_SRAM_FLE_F1_EFT_Pos)
218#define FDCAN_SRAM_FLE_F0_EFEC_DISABLED (0x0U)
220#define FDCAN_SRAM_FLE_F0_EFEC_FIFO0 (0x1U << FDCAN_SRAM_FLE_F0_EFEC_Pos)
222#define FDCAN_SRAM_FLE_F0_EFEC_FIFO1 (0x2U << FDCAN_SRAM_FLE_F0_EFEC_Pos)
225
230#define FDCAN_SRAM_TXBUFFER_T0_ESI_Pos 31U
232#define FDCAN_SRAM_TXBUFFER_T0_ESI_Msk (0x1U << FDCAN_SRAM_TXBUFFER_T0_ESI_Pos)
234#define FDCAN_SRAM_TXBUFFER_T0_ESI FDCAN_SRAM_TXBUFFER_T0_ESI_Msk
236#define FDCAN_SRAM_TXBUFFER_T0_XTD_Pos 30U
238#define FDCAN_SRAM_TXBUFFER_T0_XTD_Msk (0x1U << FDCAN_SRAM_TXBUFFER_T0_XTD_Pos)
240#define FDCAN_SRAM_TXBUFFER_T0_XTD FDCAN_SRAM_TXBUFFER_T0_XTD_Msk
242#define FDCAN_SRAM_TXBUFFER_T0_RTR_Pos 29U
244#define FDCAN_SRAM_TXBUFFER_T0_RTR_Msk (0x1U << FDCAN_SRAM_TXBUFFER_T0_RTR_Pos)
246#define FDCAN_SRAM_TXBUFFER_T0_RTR FDCAN_SRAM_TXBUFFER_T0_RTR_Msk
248#define FDCAN_SRAM_TXBUFFER_T0_ID_Pos 18U
250#define FDCAN_SRAM_TXBUFFER_T1_EFC_Pos 23U
252#define FDCAN_SRAM_TXBUFFER_T1_EFC_Msk (0x1U << FDCAN_SRAM_TXBUFFER_T1_EFC_Pos)
254#define FDCAN_SRAM_TXBUFFER_T1_EFC FDCAN_SRAM_TXBUFFER_T1_EFC_Msk
256#define FDCAN_SRAM_TXBUFFER_T1_FDF_Pos 21U
258#define FDCAN_SRAM_TXBUFFER_T1_FDF_Msk (0x1U << FDCAN_SRAM_TXBUFFER_T1_FDF_Pos)
260#define FDCAN_SRAM_TXBUFFER_T1_FDF FDCAN_SRAM_TXBUFFER_T1_FDF_Msk
262#define FDCAN_SRAM_TXBUFFER_T1_BRS_Pos 20U
264#define FDCAN_SRAM_TXBUFFER_T1_BRS_Msk (0x1U << FDCAN_SRAM_TXBUFFER_T1_BRS_Pos)
266#define FDCAN_SRAM_TXBUFFER_T1_BRS FDCAN_SRAM_TXBUFFER_T1_BRS_Msk
268#define FDCAN_SRAM_TXBUFFER_T1_DLC_Pos 16U
270#define FDCAN_SRAM_TXBUFFER_T1_DLC_Msk (0xFU << FDCAN_SRAM_TXBUFFER_T1_DLC_Pos)
272#define FDCAN_SRAM_TXBUFFER_T1_DLC FDCAN_SRAM_TXBUFFER_T1_DLC_Msk
275
280#define FDCAN_SRAM_TXBUFFER_SIZE 18U
282#define FDCAN_SRAM_TXBUFFER_T0_ESI_PASSIVE_FLAG (0x0U << FDCAN_SRAM_TXBUFFER_T0_ESI_Pos)
284#define FDCAN_SRAM_TXBUFFER_T0_ESI_RECESSIVE (0x1U << FDCAN_SRAM_TXBUFFER_T0_ESI_Pos)
286#define FDCAN_SRAM_TXBUFFER_T1_EFC_DISABLE (0x0U << FDCAN_SRAM_TXBUFFER_T1_EFC_Pos)
288#define FDCAN_SRAM_TXBUFFER_T1_EFC_STORE_EVENTS (0x1U << FDCAN_SRAM_TXBUFFER_T1_EFC_Pos)
290#define FDCAN_SRAM_TXBUFFER_T1_FDF_CLASSIC (0x0U << FDCAN_SRAM_TXBUFFER_T1_FDF_Pos)
292#define FDCAN_SRAM_TXBUFFER_T1_FDF_FD (0x1U << FDCAN_SRAM_TXBUFFER_T1_FDF_Pos)
294#define FDCAN_SRAM_TXBUFFER_T1_BRS_OFF (0x0U << FDCAN_SRAM_TXBUFFER_T1_BRS_Pos)
296#define FDCAN_SRAM_TXBUFFER_T1_BRS_ON (0x1U << FDCAN_SRAM_TXBUFFER_T1_BRS_Pos)
299
304#define FDCAN_SRAM_RXFIFO_R0_ESI_Pos 31U
306#define FDCAN_SRAM_RXFIFO_R0_ESI_Msk (0x1U << FDCAN_SRAM_RXFIFO_R0_ESI_Pos)
308#define FDCAN_SRAM_RXFIFO_R0_ESI FDCAN_SRAM_RXFIFO_R0_ESI_Msk
310#define FDCAN_SRAM_RXFIFO_R0_XTD_Pos 30U
312#define FDCAN_SRAM_RXFIFO_R0_XTD_Msk (0x1U << FDCAN_SRAM_RXFIFO_R0_XTD_Pos)
314#define FDCAN_SRAM_RXFIFO_R0_XTD FDCAN_SRAM_RXFIFO_R0_XTD_Msk
316#define FDCAN_SRAM_RXFIFO_R0_RTR_Pos 29U
318#define FDCAN_SRAM_RXFIFO_R0_RTR_Msk (0x1U << FDCAN_SRAM_RXFIFO_R0_RTR_Pos)
320#define FDCAN_SRAM_RXFIFO_R0_RTR FDCAN_SRAM_RXFIFO_R0_RTR_Msk
322#define FDCAN_SRAM_RXFIFO_R0_ID_Pos 18U
324#define FDCAN_SRAM_RXFIFO_R0_ID_Msk 0x1FFFFFFFU
326#define FDCAN_SRAM_RXFIFO_R0_ID FDCAN_SRAM_RXFIFO_R0_ID_Msk
328#define FDCAN_SRAM_RXFIFO_R1_EFC_Pos 23U
330#define FDCAN_SRAM_RXFIFO_R1_EFC_Msk (0x1U << FDCAN_SRAM_RXFIFO_R1_EFC_Pos)
332#define FDCAN_SRAM_RXFIFO_R1_EFC FDCAN_SRAM_RXFIFO_R1_EFC_Msk
334#define FDCAN_SRAM_RXFIFO_R1_FDF_Pos 21U
336#define FDCAN_SRAM_RXFIFO_R1_FDF_Msk (0x1U << FDCAN_SRAM_RXFIFO_R1_FDF_Pos)
338#define FDCAN_SRAM_RXFIFO_R1_FDF FDCAN_SRAM_RXFIFO_R1_FDF_Msk
340#define FDCAN_SRAM_RXFIFO_R1_BRS_Pos 20U
342#define FDCAN_SRAM_RXFIFO_R1_BRS_Msk (0x1U << FDCAN_SRAM_RXFIFO_R1_BRS_Pos)
344#define FDCAN_SRAM_RXFIFO_R1_BRS FDCAN_SRAM_RXFIFO_R1_BRS_Msk
346#define FDCAN_SRAM_RXFIFO_R1_DLC_Pos 16U
348#define FDCAN_SRAM_RXFIFO_R1_DLC_Msk (0xFU << FDCAN_SRAM_RXFIFO_R1_DLC_Pos)
350#define FDCAN_SRAM_RXFIFO_R1_DLC FDCAN_SRAM_RXFIFO_R1_DLC_Msk
353
358#define FDCAN_SRAM_RXFIFO_SIZE 54U
360#define FDCAN_SRAM_RXFIFO_ELEMENT_SIZE 18U
362#define FDCAN_SRAM_RXFIFO_R0_ESI_PASSIVE_FLAG (0x0U << FDCAN_SRAM_RXFIFO_R0_ESI_Pos)
364#define FDCAN_SRAM_RXFIFO_R0_ESI_RECESSIVE (0x1U << FDCAN_SRAM_RXFIFO_R0_ESI_Pos)
366#define FDCAN_SRAM_RXFIFO_R1_EFC_DISABLE (0x0U << FDCAN_SRAM_RXFIFO_R1_EFC_Pos)
368#define FDCAN_SRAM_RXFIFO_R1_EFC_STORE_EVENTS (0x1U << FDCAN_SRAM_RXFIFO_R1_EFC_Pos)
370#define FDCAN_SRAM_RXFIFO_R1_FDF_CLASSIC (0x0U << FDCAN_SRAM_RXFIFO_R1_FDF_Pos)
372#define FDCAN_SRAM_RXFIFO_R1_FDF_FD (0x1U << FDCAN_SRAM_RXFIFO_R1_FDF_Pos)
374#define FDCAN_SRAM_RXFIFO_R1_BRS_OFF (0x0U << FDCAN_SRAM_RXFIFO_R1_BRS_Pos)
376#define FDCAN_SRAM_RXFIFO_R1_BRS_ON (0x1U << FDCAN_SRAM_RXFIFO_R1_BRS_Pos)
379
391
393typedef struct candev_stm32_isr {
394 int isr_tx : 3;
395 int isr_rx : 2;
396 int isr_wkup : 1;
398
400struct can {
402 const can_conf_t *conf;
403 gpio_t rx_pin;
404 gpio_t tx_pin;
405 gpio_af_t af;
406 const can_frame_t
410};
411
420void candev_stm32_set_pins(can_t *dev, gpio_t tx_pin, gpio_t rx_pin,
421 gpio_af_t af);
422#ifdef __cplusplus
423}
424#endif
Definitions for low-level CAN driver interface.
struct candev_stm32_isr candev_stm32_isr_t
Internal interrupt flags.
#define FDCAN_STM32_RX_MAILBOXES
Maximum number of frame the driver can receive simultaneously.
struct candev_stm32_rx_mailbox candev_stm32_rx_mailbox_t
This structure holds anything related to the receive part.
#define FDCAN_STM32_TX_MAILBOXES
Number of frame the driver can transmit simultaneously.
void candev_stm32_set_pins(can_t *dev, gpio_t tx_pin, gpio_t rx_pin, gpio_af_t af)
Set the pins of an stm32 CAN device.
struct candev_stm32_isr candev_stm32_isr_t
Internal interrupt flags.
gpio_af_t
Override alternative GPIO mode options.
Definition periph_cpu.h:165
struct can can_t
Low level device structure for ESP32 CAN (extension of candev_t)
struct candev_conf can_conf_t
Linux candev configuration.
struct candev candev_t
Forward declaration for candev struct.
Definition candev.h:59
struct can_frame can_frame_t
CAN frame.
Definition can.h:178
ESP CAN device configuration.
Definition can_esp.h:87
CAN_TypeDef * can
CAN device.
uint8_t nart
No automatic retransmission.
uint8_t it1_irqn
Interrupt line 1 IRQ channel.
gpio_t tx_pin
CAN transceiver TX pin.
Definition can_esp.h:89
uint8_t txfp
Transmit FIFO priority.
uint32_t rcc_mask
RCC mask to enable clock.
uint8_t abom
Automatic bus-off management.
gpio_t rx_pin
CAN transceiver RX pin.
Definition can_esp.h:90
uint8_t awum
Automatic wakeup mode.
uint8_t it0_irqn
Interrupt line 0 IRQ channel.
gpio_af_t af
Alternate pin function to use.
bool en_deep_sleep_wake_up
Enable deep-sleep wake-up interrupt.
uint8_t silm
Silent mode.
uint8_t rflm
Receive FIFO locked mode.
uint8_t ttcm
Time triggered communication mode.
uint8_t lbkm
Loopback mode.
Low level device structure for ESP32 CAN (extension of candev_t)
Definition can_esp.h:63
const struct can_frame * tx_mailbox[CAN_STM32_TX_MAILBOXES]
Tx mailboxes.
candev_stm32_isr_t isr_flags
ISR flags.
gpio_t rx_pin
RX pin.
candev_stm32_rx_mailbox_t rx_mailbox
Rx mailboxes.
candev_t candev
candev base structure
Definition can_esp.h:64
gpio_t tx_pin
TX pin.
const can_conf_t * conf
Configuration.
gpio_af_t af
Alternate pin function to use.
Internal interrupt flags.
int isr_rx
Rx FIFO interrupt.
int isr_tx
Tx mailboxes interrupt.
int isr_wkup
Wake up interrupt.
This structure holds anything related to the receive part.
int write_idx
Write index in the receive FIFO.
can_frame_t frame[FDCAN_STM32_RX_MAILBOXES]
Receive FIFO.
int read_idx
Read index in the receive FIFO.
int is_full
Flag set when the FIFO is full.