25#define CAN_BTR_33 (CAN_BTR_SJW(0) | CAN_BTR_BRP(139)| CAN_BTR_TS1(6) | CAN_BTR_TS2(0))
27#define CAN_BTR_50 (CAN_BTR_SJW(0) | CAN_BTR_BRP(59) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
28#define CAN_BTR_83 (CAN_BTR_SJW(0) | CAN_BTR_BRP(35) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
29#define CAN_BTR_100 (CAN_BTR_SJW(0) | CAN_BTR_BRP(29) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
30#define CAN_BTR_125 (CAN_BTR_SJW(0) | CAN_BTR_BRP(23) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
31#define CAN_BTR_250 (CAN_BTR_SJW(0) | CAN_BTR_BRP(11) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
32#define CAN_BTR_500 (CAN_BTR_SJW(0) | CAN_BTR_BRP(5) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
33#define CAN_BTR_666 (CAN_BTR_SJW(0) | CAN_BTR_BRP(2) | CAN_BTR_TS1(15) | CAN_BTR_TS2(3))
34#define CAN_BTR_1k0 (CAN_BTR_SJW(0) | CAN_BTR_BRP(2) | CAN_BTR_TS1(10) | CAN_BTR_TS2(1))
36#elif defined(STM32F7XX)
39#define CAN_BTR_33 (CAN_BTR_SJW(0) | CAN_BTR_BRP(179)| CAN_BTR_TS1(6) | CAN_BTR_TS2(0))
40#define CAN_BTR_50 (CAN_BTR_SJW(0) | CAN_BTR_BRP(59) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
41#define CAN_BTR_83 (CAN_BTR_SJW(0) | CAN_BTR_BRP(35) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
42#define CAN_BTR_100 (CAN_BTR_SJW(0) | CAN_BTR_BRP(29) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
43#define CAN_BTR_125 (CAN_BTR_SJW(0) | CAN_BTR_BRP(23) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
44#define CAN_BTR_250 (CAN_BTR_SJW(0) | CAN_BTR_BRP(11) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
45#define CAN_BTR_500 (CAN_BTR_SJW(0) | CAN_BTR_BRP(5) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
46#define CAN_BTR_666 (CAN_BTR_SJW(0) | CAN_BTR_BRP(8) | CAN_BTR_TS1(6) | CAN_BTR_TS2(0))
47#define CAN_BTR_1k0 (CAN_BTR_SJW(0) | CAN_BTR_BRP(2) | CAN_BTR_TS1(14) | CAN_BTR_TS2(1))
49#elif defined(STM32H7XX)
53static_assert(STM32_FDCANCLK == 80'000'000,
"CANFD baudrates calculated for 80MHz clock!");
55constexpr uint32_t
CAN_NBTP_H7(uint32_t sjw, uint32_t prescaler, uint32_t seg1, uint32_t seg2) {
56 return ((sjw-1)<<24) | ((prescaler-1)<<16) | ((seg1-1)<<8) | (seg2-1);
58constexpr uint32_t
CAN_DBTP_H7(uint32_t sjw, uint32_t prescaler, uint32_t seg1, uint32_t seg2) {
59 return ((prescaler-1) << 16) | ((seg1-1) << 8) | ((seg2-1)<<4) | (sjw-1);
63#define CAN_NBTP_33 0x06950c01
64#define CAN_DBTP_33 0x00950D03
67#define CAN_NBTP_50 0x061F1F10
68#define CAN_DBTP_50 0x001F2003
71#define CAN_NBTP_83 0x061F1803
72#define CAN_DBTP_83 0x001F1833
75#define CAN_NBTP_100 0x061F1402
76#define CAN_DBTP_100 0x001F1423
79#define CAN_NBTP_125 0x061F0F02
80#define CAN_DBTP_125 0x001F0F23
83#define CAN_NBTP_250 0x06130C01
84#define CAN_DBTP_250 0x00130C13
86#define CAN_NBTP_500 CAN_NBTP_H7(7, 10, 13, 2)
87#define CAN_DBTP_500 CAN_DBTP_H7(4, 10, 13, 2)
88static_assert(CAN_NBTP_500 == 0x06090C01);
89static_assert(CAN_DBTP_500 == 0x00090C13);
91#define CAN_NBTP_1k0 CAN_NBTP_H7(7, 5, 13, 2)
92#define CAN_DBTP_1k0 CAN_DBTP_H7(4, 5, 13, 2)
93static_assert(CAN_NBTP_1k0 == 0x06040C01);
94static_assert(CAN_DBTP_1k0 == 0x00040C13);
97#define CAN_NBTP_666 CAN_NBTP_H7(7, 8, 12, 2)
98#define CAN_DBTP_666 CAN_DBTP_H7(4, 8, 12, 2)
101#error Please define CAN BTR settings for your MCU!
113#if defined(STM32F4XX) || defined(STM32F7XX)
115#define STM32FxMCR (CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP)
162#elif defined(STM32H7XX)
164 .op_mode = OPMODE_CAN,
174 .op_mode = OPMODE_CAN,
184 .op_mode = OPMODE_CAN,
194 .op_mode = OPMODE_CAN,
195 .NBTP = CAN_NBTP_100,
196 .DBTP = CAN_DBTP_100,
204 .op_mode = OPMODE_CAN,
205 .NBTP = CAN_NBTP_125,
206 .DBTP = CAN_DBTP_125,
214 .op_mode = OPMODE_CAN,
215 .NBTP = CAN_NBTP_250,
216 .DBTP = CAN_DBTP_250,
224 .op_mode = OPMODE_CAN,
225 .NBTP = CAN_NBTP_500,
226 .DBTP = CAN_DBTP_500,
234 .op_mode = OPMODE_CAN,
235 .NBTP = CAN_NBTP_666,
236 .DBTP = CAN_DBTP_666,
244 .op_mode = OPMODE_CAN,
245 .NBTP = CAN_NBTP_1k0,
246 .DBTP = CAN_DBTP_1k0,
270#if STM32_CAN_USE_CAN3
279#elif STM32_CAN_USE_FDCAN3
313#if STM32_CAN_USE_CAN1 || STM32_CAN_USE_FDCAN1
317#if STM32_CAN_USE_CAN2 || STM32_CAN_USE_FDCAN2
321#if STM32_CAN_USE_CAN3 || STM32_CAN_USE_FDCAN3
357 if (cand->state != CAN_READY) {
358 efiPrintf(
"Interface is not ready");
362#if STM32_CAN_USE_CAN1 || STM32_CAN_USE_CAN2
363 if (cand->can == NULL) {
364 efiPrintf(
"No device assigned!");
367 uint32_t
esr = cand->can->ESR;
368 efiPrintf(
"Receive error counter %ld", (
esr >> 24) & 0xff);
369 efiPrintf(
"Transmit error counter %ld", (
esr >> 16) & 0xff);
370 efiPrintf(
"Last error %ld", (
esr >> 4) & 0x7);
371 efiPrintf(
"Flags: %s %s %s",
372 (
esr & 0x4) ?
"BOFF" :
"",
373 (
esr & 0x2) ?
"EPVF" :
"",
374 (
esr & 0x1) ?
"EWGF" :
"");
typedef __attribute__
Ignition Mode.
const char * hwPortname(brain_pin_e brainPin)
esr("WBO: ESR", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 1956, 1.0, 0.0, 10000.0, "ohm")
static bool isValidCan2RxPin(brain_pin_e pin)
CANDriver * detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx)
static const CANConfig canConfig500
bool isValidCanRxPin(brain_pin_e pin)
static const CANConfig canConfig125
static const CANConfig canConfig1000
static const CANConfig canConfig83
static const CANConfig canConfig50
static const CANConfig canConfig250
static bool isValidCan3RxPin(brain_pin_e pin)
constexpr uint32_t CAN_NBTP_H7(uint32_t sjw, uint32_t prescaler, uint32_t seg1, uint32_t seg2)
static const CANConfig canConfig666
static const CANConfig canConfig100
constexpr uint32_t CAN_DBTP_H7(uint32_t sjw, uint32_t prescaler, uint32_t seg1, uint32_t seg2)
static bool isValidCan1RxPin(brain_pin_e pin)
bool isValidCanTxPin(brain_pin_e pin)
static bool isValidCan2TxPin(brain_pin_e pin)
const CANConfig * findCanConfig(can_baudrate_e rate)
static bool isValidCan3TxPin(brain_pin_e pin)
static const CANConfig canConfig33
void canHwInfo(CANDriver *cand)
static bool isValidCan1TxPin(brain_pin_e pin)