rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
at32_can.cpp
Go to the documentation of this file.
1/**
2 * @file at32_can.cpp
3 * @brief Low level common AT32 code
4 *
5 * @date Nov 19, 2023
6 * @author Andrey Gusakov, (c) 2023
7 */
8
9#include "pch.h"
10
11#if EFI_CAN_SUPPORT
12
13// Values below calculated with http://www.bittiming.can-wiki.info/
14// Pick ST micro bxCAN
15
16#if (STM32_PCLK1 == 144000000)
17// Clock rate of 144mhz for AT32F435
18// These have an 85.7% sample point
19// CAN_BTR_BRP - Baud Rate Prescaler
20// CAN_BTR_SJW - Resynchronization Jump Width
21// CAN_BTR_TS1 - Time Segment 1
22// CAN_BTR_TS2 - Time Segment 2
23#define CAN_BTR_50 (CAN_BTR_BRP(160 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1))
24#define CAN_BTR_83 (CAN_BTR_BRP(96 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1)) /* not accurate */
25#define CAN_BTR_100 (CAN_BTR_BRP(80 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1))
26#define CAN_BTR_125 (CAN_BTR_BRP(64 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1))
27#define CAN_BTR_250 (CAN_BTR_BRP(32 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1))
28#define CAN_BTR_500 (CAN_BTR_BRP(16 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1))
29#define CAN_BTR_1k0 (CAN_BTR_BRP(8 - 1) | CAN_BTR_SJW(18 - 1) | CAN_BTR_TS1(15 - 1) | CAN_BTR_TS2(2 - 1))
30#endif
31
32#define STM32FxMCR (CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP)
33
34static const CANConfig canConfig50 = {
35 .mcr = STM32FxMCR,
36 .btr = CAN_BTR_50
37};
38
39static const CANConfig canConfig83 = {
40 .mcr = STM32FxMCR,
41 .btr = CAN_BTR_83
42};
43
44static const CANConfig canConfig100 = {
45 .mcr = STM32FxMCR,
46 .btr = CAN_BTR_100
47};
48
49static const CANConfig canConfig125 = {
50 .mcr = STM32FxMCR,
51 .btr = CAN_BTR_125
52};
53
54static const CANConfig canConfig250 = {
55 .mcr = STM32FxMCR,
56 .btr = CAN_BTR_250
57};
58
59static const CANConfig canConfig500 = {
60 .mcr = STM32FxMCR,
61 .btr = CAN_BTR_500
62};
63
64static const CANConfig canConfig1000 = {
65 .mcr = STM32FxMCR,
66 .btr = CAN_BTR_1k0
67};
68
70 return pin == Gpio::A11 || pin == Gpio::B8 || pin == Gpio::D0 || pin == Gpio::G0;
71}
72
74 return pin == Gpio::A12 || pin == Gpio::B9 || pin == Gpio::D1 || pin == Gpio::G1;
75}
76
78 return pin == Gpio::B5 || pin == Gpio::B12 || pin == Gpio::G11;
79}
80
82 return pin == Gpio::B6 || pin == Gpio::B13 || pin == Gpio::G12;
83}
84
88
92
93CANDriver* detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx) {
94 if (pinRx == Gpio::Unassigned || pinTx == Gpio::Unassigned) {
95 return nullptr;
96 }
97#if STM32_CAN_USE_CAN1 || STM32_CAN_USE_FDCAN1
98 if (isValidCan1RxPin(pinRx) && isValidCan1TxPin(pinTx))
99 return &CAND1;
100#endif
101#if STM32_CAN_USE_CAN2 || STM32_CAN_USE_FDCAN2
102 if (isValidCan2RxPin(pinRx) && isValidCan2TxPin(pinTx))
103 return &CAND2;
104#endif
105 criticalError("invalid CAN pins tx %s and rx %s", hwPortname(pinTx), hwPortname(pinRx));
106 return nullptr;
107}
108
110 switch (rate) {
111 case B50KBPS:
112 return &canConfig50;
113 case B83KBPS:
114 return &canConfig83;
115 case B100KBPS:
116 return &canConfig100;
117 case B125KBPS:
118 return &canConfig125;
119 case B250KBPS:
120 return &canConfig250;
121 case B1MBPS:
122 return &canConfig1000;
123 case B500KBPS:
124 default:
125 return &canConfig500;
126 }
127}
128
129void canHwInfo(CANDriver* cand)
130{
131 /* TODO: */
132 (void)cand;
133}
134
135#endif /* EFI_CAN_SUPPORT */
static bool isValidCan2RxPin(brain_pin_e pin)
Definition at32_can.cpp:77
CANDriver * detectCanDevice(brain_pin_e pinRx, brain_pin_e pinTx)
Definition at32_can.cpp:93
static const CANConfig canConfig125
Definition at32_can.cpp:49
bool isValidCanRxPin(brain_pin_e pin)
Definition at32_can.cpp:89
static const CANConfig canConfig250
Definition at32_can.cpp:54
static const CANConfig canConfig50
Definition at32_can.cpp:34
static const CANConfig canConfig1000
Definition at32_can.cpp:64
static bool isValidCan1RxPin(brain_pin_e pin)
Definition at32_can.cpp:69
bool isValidCanTxPin(brain_pin_e pin)
Definition at32_can.cpp:85
static const CANConfig canConfig500
Definition at32_can.cpp:59
static const CANConfig canConfig83
Definition at32_can.cpp:39
static bool isValidCan2TxPin(brain_pin_e pin)
Definition at32_can.cpp:81
const CANConfig * findCanConfig(can_baudrate_e rate)
Definition at32_can.cpp:109
void canHwInfo(CANDriver *cand)
Definition at32_can.cpp:129
static bool isValidCan1TxPin(brain_pin_e pin)
Definition at32_can.cpp:73
static const CANConfig canConfig100
Definition at32_can.cpp:44
uint32_t rate
Definition bluetooth.cpp:39
@ Unassigned
const char * hwPortname(brain_pin_e brainPin)
can_baudrate_e
brain_pin_e pin
Definition stm32_adc.cpp:15