libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
can.hpp
1#pragma once
2
3#include "libxr.hpp"
4#include "message.hpp"
5
6namespace LibXR
7{
8
15class CAN
16{
17 public:
22 enum class Type : uint8_t
23 {
24 STANDARD = 0,
25 EXTENDED = 1,
26 REMOTE_STANDARD = 2,
27 REMOTE_EXTENDED = 3,
28 ERROR = 4,
29 TYPE_NUM = 5
30 };
31
36 struct BitTiming
37 {
38 uint32_t brp = 0;
39 uint32_t prop_seg = 0;
40 uint32_t phase_seg1 = 0;
41 uint32_t phase_seg2 = 0;
42 uint32_t sjw = 0;
43 };
44
49 struct Mode
50 {
51 bool loopback = false;
52 bool listen_only = false;
53 bool triple_sampling = false;
54 bool one_shot = false;
55 };
56
62 {
63 uint32_t bitrate = 0;
64 float sample_point = 0.0f;
67 };
68
74 virtual ErrorCode SetConfig(const CAN::Configuration& cfg) = 0;
75
80 virtual uint32_t GetClockFreq() const = 0;
81
88 {
89 uint8_t tx_error_counter = 0;
90 uint8_t rx_error_counter = 0;
91
92 bool bus_off = false;
93 bool error_passive = false;
94 bool error_warning = false;
95 };
96
107 virtual ErrorCode GetErrorState(ErrorState& state) const
108 {
109 (void)state;
111 }
112
116 CAN() = default;
117
121 virtual ~CAN() = default;
122
123 LIBXR_PACKED_BEGIN
129 {
130 uint32_t id;
133 uint8_t dlc;
134 uint8_t data[8];
135 };
136 LIBXR_PACKED_END
137
139 static constexpr uint32_t CAN_ERROR_ID_PREFIX = 0xFFFF0000u;
140
146 enum class ErrorID : uint32_t
147 {
148 CAN_ERROR_ID_GENERIC = CAN_ERROR_ID_PREFIX,
149 CAN_ERROR_ID_BUS_OFF = CAN_ERROR_ID_PREFIX + 1,
150 CAN_ERROR_ID_ERROR_PASSIVE = CAN_ERROR_ID_PREFIX + 2,
151 CAN_ERROR_ID_ERROR_WARNING = CAN_ERROR_ID_PREFIX + 3,
152 CAN_ERROR_ID_PROTOCOL = CAN_ERROR_ID_PREFIX + 4,
153 CAN_ERROR_ID_ACK = CAN_ERROR_ID_PREFIX + 5,
154 CAN_ERROR_ID_STUFF = CAN_ERROR_ID_PREFIX + 6,
155 CAN_ERROR_ID_FORM = CAN_ERROR_ID_PREFIX + 7,
156 CAN_ERROR_ID_BIT0 = CAN_ERROR_ID_PREFIX + 8,
157 CAN_ERROR_ID_BIT1 = CAN_ERROR_ID_PREFIX + 9,
158 CAN_ERROR_ID_CRC = CAN_ERROR_ID_PREFIX + 10,
159 CAN_ERROR_ID_OTHER = CAN_ERROR_ID_PREFIX + 11
160 };
161
163 static constexpr uint32_t FromErrorID(ErrorID e) noexcept
164 {
165 return static_cast<uint32_t>(e);
166 }
167
169 static constexpr bool IsErrorId(uint32_t id) noexcept
170 {
171 return (id & 0xFFFF0000u) == CAN_ERROR_ID_PREFIX;
172 }
173
175 static constexpr ErrorID ToErrorID(uint32_t id) noexcept
176 {
177 return static_cast<ErrorID>(id);
178 }
179
182
187 enum class FilterMode : uint8_t
188 {
189 ID_MASK = 0,
191 ID_RANGE = 1
193 };
194
207
219 uint32_t start_id_mask = 0, uint32_t end_id_mask = UINT32_MAX);
220
226 virtual ErrorCode AddMessage(const ClassicPack& pack) = 0;
227
228 protected:
235 void OnMessage(const ClassicPack& pack, bool in_isr);
236
237 private:
239 LockFreeList subscriber_list_[static_cast<uint8_t>(Type::TYPE_NUM)];
240};
241
247class FDCAN : public CAN
248{
249 public:
253 FDCAN() = default;
254
258 virtual ~FDCAN() = default;
259
260 LIBXR_PACKED_BEGIN
265 struct FDPack
266 {
267 uint32_t id;
269 uint8_t len;
270 uint8_t data[64];
271 };
272 LIBXR_PACKED_END
273
274 using CAN::AddMessage;
275 using CAN::FilterMode;
276 using CAN::Register;
277
280
293
299 {
300 uint32_t brp = 0;
301 uint32_t prop_seg = 0;
302 uint32_t phase_seg1 = 0;
303 uint32_t phase_seg2 = 0;
304 uint32_t sjw = 0;
305 };
306
311 struct FDMode
312 {
313 bool fd_enabled = false;
314 bool brs = false;
315 bool esi = false;
316 };
317
330
340 virtual ErrorCode SetConfig(const CAN::Configuration& cfg) override = 0;
341
348 virtual ErrorCode SetConfig(const FDCAN::Configuration& cfg) = 0;
349
359 void Register(CallbackFD cb, Type type, FilterMode mode = FilterMode::ID_RANGE,
360 uint32_t start_id_mask = 0, uint32_t end_id_mask = UINT32_MAX);
361
367 virtual ErrorCode AddMessage(const FDPack& pack) = 0;
368
369 protected:
370 using CAN::OnMessage;
371
378 void OnMessage(const FDPack& pack, bool in_isr);
379
380 private:
382 LockFreeList subscriber_list_fd_[static_cast<uint8_t>(Type::REMOTE_STANDARD)];
383};
384
385} // namespace LibXR
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
static constexpr uint32_t FromErrorID(ErrorID e) noexcept
将 ErrorID 转为 id / Convert ErrorID to ClassicPack::id.
Definition can.hpp:163
static constexpr bool IsErrorId(uint32_t id) noexcept
判断 id 是否处于错误 ID 空间 / Check if id is in error ID space.
Definition can.hpp:169
Type
CAN 消息类型 / CAN frame type.
Definition can.hpp:23
@ EXTENDED
扩展数据帧(29-bit ID) / Extended data frame (29-bit ID).
@ REMOTE_EXTENDED
扩展远程帧 / Extended remote frame.
@ STANDARD
标准数据帧(11-bit ID) / Standard data frame (11-bit ID).
@ REMOTE_STANDARD
标准远程帧 / Standard remote frame.
@ ERROR
错误帧(虚拟事件) / Error frame (virtual event).
@ TYPE_NUM
类型数量上界 / Number of frame types.
virtual ErrorCode AddMessage(const ClassicPack &pack)=0
添加经典 CAN 消息 / Add classic CAN message.
static constexpr ErrorID ToErrorID(uint32_t id) noexcept
将 id 解释为 ErrorID / Interpret id as ErrorID.
Definition can.hpp:175
virtual uint32_t GetClockFreq() const =0
获取 CAN 外设时钟频率(Hz)。 Get CAN peripheral clock frequency in Hz.
virtual ErrorCode GetErrorState(ErrorState &state) const
查询当前错误状态(快照)。 Query current CAN controller error state (snapshot).
Definition can.hpp:107
virtual ErrorCode SetConfig(const CAN::Configuration &cfg)=0
设置 CAN 配置 / Set CAN configuration.
void OnMessage(const ClassicPack &pack, bool in_isr)
分发接收到的经典 CAN 帧。 Dispatch a received classic CAN frame.
Definition can.cpp:18
void Register(Callback cb, Type type, FilterMode mode=FilterMode::ID_RANGE, uint32_t start_id_mask=0, uint32_t end_id_mask=UINT32_MAX)
注册经典 CAN 消息回调。 Register classic CAN message callback.
Definition can.cpp:8
ErrorID
ClassicPack::type == Type::ERROR 时使用的虚拟 ID。 Virtual IDs used when ClassicPack::type == Type::ERROR.
Definition can.hpp:147
static LIBXR_PACKED_END constexpr uint32_t CAN_ERROR_ID_PREFIX
错误 ID 前缀 / Error ID prefix.
Definition can.hpp:139
virtual ~CAN()=default
虚析构函数 / Virtual destructor.
FilterMode
CAN 过滤器模式 / CAN filter mode.
Definition can.hpp:188
CAN()=default
构造函数 / Constructor.
FDCAN 通信抽象类,扩展支持 CAN FD 帧。 Abstract class for FDCAN communication with CAN FD frame support.
Definition can.hpp:248
FDCAN()=default
构造函数 / Constructor.
virtual ~FDCAN()=default
虚析构函数 / Virtual destructor.
virtual ErrorCode AddMessage(const FDPack &pack)=0
添加 FD CAN 消息 / Add FD CAN message.
void OnMessage(const FDPack &pack, bool in_isr)
分发接收到的 FD CAN 帧。 Dispatch a received FD CAN frame.
Definition can.cpp:54
virtual ErrorCode SetConfig(const CAN::Configuration &cfg) override=0
设置经典 CAN 配置。 Set classic CAN configuration.
virtual ErrorCode SetConfig(const FDCAN::Configuration &cfg)=0
设置 FDCAN 配置。 Set FDCAN configuration.
void Register(CallbackFD cb, Type type, FilterMode mode=FilterMode::ID_RANGE, uint32_t start_id_mask=0, uint32_t end_id_mask=UINT32_MAX)
注册 FDCAN FD 帧回调。 Register FDCAN FD frame callback.
Definition can.cpp:44
FilterMode
CAN 过滤器模式 / CAN filter mode.
Definition can.hpp:188
链表实现,用于存储和管理数据节点。 A linked list implementation for storing and managing data nodes.
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ NOT_SUPPORT
不支持 / Not supported
CAN 位时序配置 / Bit timing configuration for CAN.
Definition can.hpp:37
uint32_t brp
预分频 / Baud rate prescaler.
Definition can.hpp:38
uint32_t sjw
同步跳宽 / Synchronization jump width.
Definition can.hpp:42
uint32_t phase_seg2
相位段 2 / Phase segment 2.
Definition can.hpp:41
uint32_t prop_seg
传播段 / Propagation segment.
Definition can.hpp:39
uint32_t phase_seg1
相位段 1 / Phase segment 1.
Definition can.hpp:40
经典 CAN 帧数据结构 / Classic CAN frame structure.
Definition can.hpp:129
Type type
帧类型 / Frame type.
Definition can.hpp:132
uint8_t data[8]
数据载荷 / Data payload (up to 8 bytes).
Definition can.hpp:134
uint8_t dlc
有效数据长度(0~8) / Data length code (0–8).
Definition can.hpp:133
CAN 配置参数 / CAN configuration parameters.
Definition can.hpp:62
BitTiming bit_timing
位时序配置 / Bit timing configuration.
Definition can.hpp:65
float sample_point
仲裁相位采样点(0~1) / Nominal sample point (0–1).
Definition can.hpp:64
Mode mode
工作模式 / Operating mode.
Definition can.hpp:66
uint32_t bitrate
仲裁相位目标波特率 / Target nominal bitrate.
Definition can.hpp:63
CAN 当前错误状态快照(来自硬件计数器/状态机)。 Snapshot of current CAN controller error state (from HW counters/state).
Definition can.hpp:88
bool bus_off
是否处于 BUS-OFF / True if controller is bus-off.
Definition can.hpp:92
bool error_passive
是否处于 Error Passive / True if error-passive.
Definition can.hpp:93
uint8_t tx_error_counter
发送错误计数 TEC / Transmit error counter (TEC).
Definition can.hpp:89
bool error_warning
是否处于 Error Warning / True if error-warning.
Definition can.hpp:94
uint8_t rx_error_counter
接收错误计数 REC / Receive error counter (REC).
Definition can.hpp:90
经典 CAN 订阅过滤器 / Classic CAN subscription filter.
Definition can.hpp:200
uint32_t start_id_mask
起始 ID 或掩码 / Start ID or mask.
Definition can.hpp:202
uint32_t end_id_mask
结束 ID 或匹配值 / End ID or match value.
Definition can.hpp:203
Callback cb
回调函数 / Callback function.
Definition can.hpp:205
FilterMode mode
过滤模式 / Filter mode.
Definition can.hpp:201
Type type
帧类型 / Frame type.
Definition can.hpp:204
CAN 工作模式 / CAN operating mode.
Definition can.hpp:50
bool triple_sampling
三采样 / Triple sampling.
Definition can.hpp:53
bool loopback
回环模式 / Loopback mode.
Definition can.hpp:51
bool one_shot
单次发送模式 / One-shot transmission.
Definition can.hpp:54
bool listen_only
只听(静默)模式 / Listen-only (silent) mode.
Definition can.hpp:52
FDCAN 配置参数,扩展 CAN::Configuration。 FDCAN configuration, extending CAN::Configuration.
Definition can.hpp:324
FDMode fd_mode
FD 模式配置 / FD mode configuration.
Definition can.hpp:328
float data_sample_point
数据相位采样点 / Data-phase sample point.
Definition can.hpp:326
DataBitTiming data_timing
数据相位位时序 / Data-phase bit timing.
Definition can.hpp:327
uint32_t data_bitrate
数据相位波特率 / Data-phase bitrate.
Definition can.hpp:325
数据相位位时序配置 / Data phase bit timing configuration.
Definition can.hpp:299
uint32_t prop_seg
传播段 / Propagation segment.
Definition can.hpp:301
uint32_t sjw
同步跳宽 / Synchronization jump width.
Definition can.hpp:304
uint32_t phase_seg2
相位段 2 / Phase segment 2.
Definition can.hpp:303
uint32_t brp
预分频 / Prescaler.
Definition can.hpp:300
uint32_t phase_seg1
相位段 1 / Phase segment 1.
Definition can.hpp:302
FDCAN FD 模式配置 / FDCAN FD mode configuration.
Definition can.hpp:312
bool esi
全局 ESI 标志 / Global ESI flag.
Definition can.hpp:315
bool brs
是否启用 BRS / Enable Bit Rate Switch.
Definition can.hpp:314
bool fd_enabled
是否启用 CAN FD / Enable CAN FD.
Definition can.hpp:313
CAN FD 帧数据结构 / CAN FD frame structure.
Definition can.hpp:266
Type type
帧类型 / Frame type.
Definition can.hpp:268
uint32_t id
CAN ID / CAN ID.
Definition can.hpp:267
uint8_t len
数据长度(0~64) / Data length (0–64 bytes).
Definition can.hpp:269
uint8_t data[64]
数据载荷 / Data payload.
Definition can.hpp:270
FDCAN 订阅过滤器 / FDCAN subscription filter.
Definition can.hpp:286
FilterMode mode
过滤模式 / Filter mode.
Definition can.hpp:287
uint32_t start_id_mask
起始 ID 或掩码 / Start ID or mask.
Definition can.hpp:288
CallbackFD cb
回调函数 / Callback function.
Definition can.hpp:291
Type type
帧类型 / Frame type.
Definition can.hpp:290
uint32_t end_id_mask
结束 ID 或匹配值 / End ID or match value.
Definition can.hpp:289