PER Firmware
Loading...
Searching...
No Matches
fdcan_priv.h
Go to the documentation of this file.
1
7#ifndef PHAL_G4_FDCAN_PRIV_H
8#define PHAL_G4_FDCAN_PRIV_H
9
10#include <stdint.h>
11
12#include "stm32g474xx.h"
13
14
18static constexpr uint32_t FDCAN_PRIV_KER_CLK_HZ = 16'000'000U;
19
20// Values originate from ST's HAL & documentation
21
23static constexpr uint32_t FDCAN_PRIV_RCC_FDCANCLKSOURCE_PCLK1 = RCC_CCIPR_FDCANSEL_1;
24
31
32// Message RAM layout. Same layout, different base offset for each peripheral
33
34static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLS_NBR = 28;
35static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLE_NBR = 8;
36static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF0_NBR = 3;
37static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF1_NBR = 3;
38static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TEF_NBR = 3;
39static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TFQ_NBR = 3;
40
41static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLS_SIZE = 1 * 4; // Filter Standard Element Size in bytes
42static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLE_SIZE = 2 * 4; // Filter Extended Element Size in bytes
43
45static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF0_SIZE = 18 * 4;
46
47static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF1_SIZE = 18 * 4; // RX FIFO 1 Elements Size in bytes
48static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TEF_SIZE = 2 * 4; // TX Event FIFO Elements Size in bytes
49
51static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TFQ_SIZE = 18 * 4;
52
56static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLSSA = 0;
57
62
68
72
75
76
78uint32_t PHAL_FDCAN_priv_ramBase(const FDCAN_GlobalTypeDef *fdcan);
79
82
84void PHAL_FDCAN_priv_enterConfig(FDCAN_GlobalTypeDef *fdcan);
85
87void PHAL_FDCAN_priv_exitConfig(FDCAN_GlobalTypeDef *fdcan);
88
89// Configure CCCR and TEST registers for classic CAN operation
90// Not FD, not BRS, not loopback, auto-retransmission enabled, TX pause on
91void PHAL_FDCAN_priv_controlConfig(FDCAN_GlobalTypeDef *fdcan);
92
94void PHAL_FDCAN_priv_setTransmitFifoQueueModeToFifo(FDCAN_GlobalTypeDef *fdcan);
95
97void PHAL_FDCAN_setInterruptLines(FDCAN_GlobalTypeDef *fdcan);
98
100void PHAL_FDCAN_priv_writeFilterAction(FDCAN_GlobalTypeDef *fdcan, PHAL_FDCAN_DefaultFilterAction_t action);
101
105
107void PHAL_FDCAN_priv_writeStandardFilters(FDCAN_GlobalTypeDef *fdcan, const uint32_t *sid_list, uint32_t num_sid);
108
110void PHAL_FDCAN_priv_writeExtendedFilters(FDCAN_GlobalTypeDef *fdcan, const uint32_t *xid_list, uint32_t num_xid);
111
114void PHAL_FDCAN_priv_writeTxElement(FDCAN_GlobalTypeDef *fdcan, CanMsgTypeDef_t *msg);
115
117// return true and fills msg on success. False if RX FIFO0 is empty
118bool PHAL_FDCAN_priv_readRxElement(FDCAN_GlobalTypeDef *fdcan, CanMsgTypeDef_t *msg);
119
121bool PHAL_FDCAN_priv_readTxFifoQueueStatusFullFlag(const FDCAN_GlobalTypeDef *fdcan);
122
124bool PHAL_FDCAN_priv_readReceiveFifo0NewMessageInterruptFlag(const FDCAN_GlobalTypeDef *fdcan);
125
127void PHAL_FDCAN_priv_clearReceiveFifo0NewMessageInterruptFlag(FDCAN_GlobalTypeDef *fdcan);
128
130bool PHAL_FDCAN_priv_readTransmitCompleteInterruptFlag(const FDCAN_GlobalTypeDef *fdcan);
131
133void PHAL_FDCAN_priv_clearTransmitCompleteInterruptFlag(FDCAN_GlobalTypeDef *fdcan);
134
135#endif // PHAL_G4_FDCAN_PRIV_H
PHAL_FDCAN_BaudRate_t
Supported baud rates for PER F4 CAN HAL.
Definition can.h:38
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF1_NBR
RX FIFO 0 Elements Number.
Definition fdcan_priv.h:37
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TFQSA
Definition fdcan_priv.h:71
PHAL_FDCAN_DefaultFilterAction_t
Definition fdcan_priv.h:27
@ FDCAN_PRIV_FILTER_REJECT
Definition fdcan_priv.h:29
@ FDCAN_PRIV_FILTER_ACCEPT_IN_RX_FIFO0
Definition fdcan_priv.h:28
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF0SA
Definition fdcan_priv.h:65
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLE_NBR
Max standard id filters.
Definition fdcan_priv.h:35
void PHAL_FDCAN_priv_writeStandardFilters(FDCAN_GlobalTypeDef *fdcan, const uint32_t *sid_list, uint32_t num_sid)
Set num_sid exact-match standard filters and forward to RX FIFO0.
Definition fdcan_priv.c:221
uint32_t PHAL_FDCAN_priv_getNBTP(PHAL_FDCAN_BaudRate_t bit_rate)
Definition fdcan_priv.c:181
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TEFSA
Definition fdcan_priv.h:67
void PHAL_FDCAN_priv_writeFilterAction(FDCAN_GlobalTypeDef *fdcan, PHAL_FDCAN_DefaultFilterAction_t action)
Write a filter action to RXGFC (accept/reject all)
Definition fdcan_priv.c:163
bool PHAL_FDCAN_priv_readTxFifoQueueStatusFullFlag(const FDCAN_GlobalTypeDef *fdcan)
Check whether the TX FIFO/Queue is full.
Definition fdcan_priv.c:392
void PHAL_FDCAN_priv_enableClock(void)
Enable FDCAN kernel + peripheral clocks (PCLK1)
Definition fdcan_priv.c:22
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TFQ_SIZE
Size in bytes of one TX FIFO/queue element (set by the hardware format)
Definition fdcan_priv.h:51
static constexpr uint32_t FDCAN_PRIV_RCC_FDCANCLKSOURCE_PCLK1
FDCAN clock is derived from PCLK1.
Definition fdcan_priv.h:23
void PHAL_FDCAN_priv_controlConfig(FDCAN_GlobalTypeDef *fdcan)
Definition fdcan_priv.c:83
static constexpr uint32_t FDCAN_PRIV_KER_CLK_HZ
Definition fdcan_priv.h:18
void PHAL_FDCAN_priv_clearReceiveFifo0NewMessageInterruptFlag(FDCAN_GlobalTypeDef *fdcan)
Clear the RX FIFO0 new message interrupt flag.
Definition fdcan_priv.c:407
bool PHAL_FDCAN_priv_readRxElement(FDCAN_GlobalTypeDef *fdcan, CanMsgTypeDef_t *msg)
Pop and decode the oldest element from RX FIFO0.
Definition fdcan_priv.c:337
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLESA
Definition fdcan_priv.h:61
void PHAL_FDCAN_priv_setTransmitFifoQueueModeToFifo(FDCAN_GlobalTypeDef *fdcan)
Set TX FIFO/Queue mode to FIFO (not queue)
Definition fdcan_priv.c:118
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TEF_SIZE
Definition fdcan_priv.h:48
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLE_SIZE
Definition fdcan_priv.h:42
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLS_NBR
Definition fdcan_priv.h:34
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF1SA
Definition fdcan_priv.h:66
void PHAL_FDCAN_priv_writeTxElement(FDCAN_GlobalTypeDef *fdcan, CanMsgTypeDef_t *msg)
Definition fdcan_priv.c:286
void PHAL_FDCAN_priv_exitConfig(FDCAN_GlobalTypeDef *fdcan)
Leave INIT mode, ending configuration. Blocks until left.
Definition fdcan_priv.c:72
bool PHAL_FDCAN_priv_readTransmitCompleteInterruptFlag(const FDCAN_GlobalTypeDef *fdcan)
Check whether the TX complete interrupt flag is set.
Definition fdcan_priv.c:413
void PHAL_FDCAN_priv_enterConfig(FDCAN_GlobalTypeDef *fdcan)
Enter INIT mode and unlock configuration registers. Blocks until entered.
Definition fdcan_priv.c:41
void PHAL_FDCAN_priv_writeExtendedFilters(FDCAN_GlobalTypeDef *fdcan, const uint32_t *xid_list, uint32_t num_xid)
Set num_xid exact-match extended filters and forward to RX FIFO0.
Definition fdcan_priv.c:250
uint32_t PHAL_FDCAN_priv_ramBase(const FDCAN_GlobalTypeDef *fdcan)
Base address of this peripheral's slice of shared message RAM.
Definition fdcan_priv.c:10
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLS_SIZE
TX FIFO Elements Number.
Definition fdcan_priv.h:41
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF0_NBR
Max extended id filters.
Definition fdcan_priv.h:36
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF0_SIZE
Size in bytes of one RX FIFO 0 element (set by the hardware format)
Definition fdcan_priv.h:45
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TEF_NBR
RX FIFO 1 Elements Number.
Definition fdcan_priv.h:38
void PHAL_FDCAN_priv_clearTransmitCompleteInterruptFlag(FDCAN_GlobalTypeDef *fdcan)
Clear the TX complete interrupt flag.
Definition fdcan_priv.c:419
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_TFQ_NBR
TX Event FIFO Elements Number.
Definition fdcan_priv.h:39
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_FLSSA
Definition fdcan_priv.h:56
void PHAL_FDCAN_setInterruptLines(FDCAN_GlobalTypeDef *fdcan)
Set up RX new message -> line 0, TX complete -> line 1.
Definition fdcan_priv.c:126
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_SIZE
Bytes required/consumed by one instance's full Message RAM layout (filters + RX FIFOs + TX event FIFO...
Definition fdcan_priv.h:74
static constexpr uint32_t FDCAN_PRIV_SRAMCAN_RF1_SIZE
Definition fdcan_priv.h:47
bool PHAL_FDCAN_priv_readReceiveFifo0NewMessageInterruptFlag(const FDCAN_GlobalTypeDef *fdcan)
Check whether the RX FIFO0 new message interrupt flag is set.
Definition fdcan_priv.c:399
Classic CAN frame.
Definition can.h:49