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 
33 #ifdef __cplusplus
34 extern "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
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)
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
82 #ifndef FDCANDEV_STM32_DEFAULT_SPT
84 #define FDCANDEV_STM32_DEFAULT_SPT 875
85 #endif
86 
88 typedef struct {
89  FDCAN_GlobalTypeDef *can;
90  uint32_t rcc_mask;
91  gpio_t rx_pin;
92  gpio_t tx_pin;
93  gpio_af_t af;
94  bool en_deep_sleep_wake_up;
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)
121 typedef struct can can_t;
123 #define HAVE_CAN_T
124 
125 #define FDCAN_SRAM_MESSAGE_RAM_SIZE 0x350
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
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
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)
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
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)
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
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)
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
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)
381 typedef struct candev_stm32_rx_mailbox {
386  int read_idx;
388  int is_full;
391 
393 typedef struct candev_stm32_isr {
394  int isr_tx : 3;
395  int isr_rx : 2;
396  int isr_wkup : 1;
398 
400 struct can {
401  candev_t candev;
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 
420 void 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.
#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 candev_conf can_conf_t
Linux candev configuration.
ESP CAN device configuration.
Definition: can_esp.h:87
FDCAN_GlobalTypeDef * can
CAN device.
uint8_t it1_irqn
Interrupt line 1 IRQ channel.
uint8_t it0_irqn
Interrupt line 0 IRQ channel.
Controller Area Network frame.
Definition: can.h:100
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.
Definition: candev_stm32.h:171
candev_stm32_isr_t isr_flags
ISR flags.
Definition: candev_stm32.h:173
gpio_t rx_pin
RX pin.
Definition: candev_stm32.h:167
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.
Definition: candev_stm32.h:168
const can_conf_t * conf
Configuration.
Definition: candev_stm32.h:166
gpio_af_t af
Alternate pin function to use.
Definition: candev_stm32.h:169
Internal interrupt flags.
Definition: candev_stm32.h:157
int isr_rx
Rx FIFO interrupt.
Definition: candev_stm32.h:159
int isr_tx
Tx mailboxes interrupt.
Definition: candev_stm32.h:158
int isr_wkup
Wake up interrupt.
Definition: candev_stm32.h:160
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.
Structure to hold driver state.
Definition: candev.h:76