libxr  1.0
Want to be the best embedded framework
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;
110 return ErrorCode::NOT_SUPPORT;
111 }
112
116 CAN() = default;
117
121 virtual ~CAN() = default;
122
123#pragma pack(push, 1)
129 {
130 uint32_t id;
132 uint8_t dlc;
133 uint8_t data[8];
134 };
135#pragma pack(pop)
136
138 static constexpr uint32_t CAN_ERROR_ID_PREFIX = 0xFFFF0000u;
139
145 enum class ErrorID : uint32_t
146 {
147 CAN_ERROR_ID_GENERIC = CAN_ERROR_ID_PREFIX,
148 CAN_ERROR_ID_BUS_OFF = CAN_ERROR_ID_PREFIX + 1,
149 CAN_ERROR_ID_ERROR_PASSIVE = CAN_ERROR_ID_PREFIX + 2,
150 CAN_ERROR_ID_ERROR_WARNING = CAN_ERROR_ID_PREFIX + 3,
151 CAN_ERROR_ID_PROTOCOL = CAN_ERROR_ID_PREFIX + 4,
152 CAN_ERROR_ID_ACK = CAN_ERROR_ID_PREFIX + 5,
153 CAN_ERROR_ID_STUFF = CAN_ERROR_ID_PREFIX + 6,
154 CAN_ERROR_ID_FORM = CAN_ERROR_ID_PREFIX + 7,
155 CAN_ERROR_ID_BIT0 = CAN_ERROR_ID_PREFIX + 8,
156 CAN_ERROR_ID_BIT1 = CAN_ERROR_ID_PREFIX + 9,
157 CAN_ERROR_ID_CRC = CAN_ERROR_ID_PREFIX + 10,
158 CAN_ERROR_ID_OTHER = CAN_ERROR_ID_PREFIX + 11
159 };
160
162 static constexpr uint32_t FromErrorID(ErrorID e) noexcept
163 {
164 return static_cast<uint32_t>(e);
165 }
166
168 static constexpr bool IsErrorId(uint32_t id) noexcept
169 {
170 return (id & 0xFFFF0000u) == CAN_ERROR_ID_PREFIX;
171 }
172
174 static constexpr ErrorID ToErrorID(uint32_t id) noexcept
175 {
176 return static_cast<ErrorID>(id);
177 }
178
181
186 enum class FilterMode : uint8_t
187 {
188 ID_MASK = 0,
190 ID_RANGE = 1
192 };
193
206
218 uint32_t start_id_mask = 0, uint32_t end_id_mask = UINT32_MAX);
219
225 virtual ErrorCode AddMessage(const ClassicPack &pack) = 0;
226
227 protected:
234 void OnMessage(const ClassicPack &pack, bool in_isr);
235
236 private:
239};
240
246class FDCAN : public CAN
247{
248 public:
252 FDCAN() = default;
253
257 virtual ~FDCAN() = default;
258
259#pragma pack(push, 1)
264 struct FDPack
265 {
266 uint32_t id;
268 uint8_t len;
269 uint8_t data[64];
270 };
271#pragma pack(pop)
272
273 using CAN::AddMessage;
274 using CAN::FilterMode;
275 using CAN::Register;
276
279
292
298 {
299 uint32_t brp = 0;
300 uint32_t prop_seg = 0;
301 uint32_t phase_seg1 = 0;
302 uint32_t phase_seg2 = 0;
303 uint32_t sjw = 0;
304 };
305
310 struct FDMode
311 {
312 bool fd_enabled = false;
313 bool brs = false;
314 bool esi = false;
315 };
316
329
339 virtual ErrorCode SetConfig(const CAN::Configuration &cfg) override = 0;
340
347 virtual ErrorCode SetConfig(const FDCAN::Configuration &cfg) = 0;
348
358 void Register(CallbackFD cb, Type type, FilterMode mode = FilterMode::ID_RANGE,
359 uint32_t start_id_mask = 0, uint32_t end_id_mask = UINT32_MAX);
360
366 virtual ErrorCode AddMessage(const FDPack &pack) = 0;
367
368 protected:
369 using CAN::OnMessage;
370
377 void OnMessage(const FDPack &pack, bool in_isr);
378
379 private:
382};
383
384} // 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:162
static constexpr bool IsErrorId(uint32_t id) noexcept
判断 id 是否处于错误 ID 空间。Check if id is in error ID space.
Definition can.hpp:168
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 uint32_t CAN_ERROR_ID_PREFIX
错误 ID 前缀 Error ID prefix.
Definition can.hpp:138
static constexpr ErrorID ToErrorID(uint32_t id) noexcept
将 id 解释为 ErrorID。Interpret id as ErrorID.
Definition can.hpp:174
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:146
LockFreeList subscriber_list_[static_cast< uint8_t >(Type::TYPE_NUM)]
按帧类型划分的订阅者链表数组。Subscriber lists per frame type.
Definition can.hpp:238
virtual ~CAN()=default
虚析构函数。Virtual destructor.
FilterMode
CAN 过滤器模式。CAN filter mode.
Definition can.hpp:187
CAN()=default
构造函数。Constructor.
FDCAN 通信抽象类,扩展支持 CAN FD 帧。 Abstract class for FDCAN communication with CAN FD frame support.
Definition can.hpp:247
FDCAN()=default
构造函数。Constructor.
virtual ~FDCAN()=default
虚析构函数。Virtual destructor.
LockFreeList subscriber_list_fd_[static_cast< uint8_t >(Type::REMOTE_STANDARD)]
按帧类型划分的 FD 订阅者链表数组。FD subscriber lists per frame type.
Definition can.hpp:381
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:187
链表实现,用于存储和管理数据节点。 A linked list implementation for storing and managing data nodes.
LibXR 命名空间
Definition ch32_can.hpp:14
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:131
uint32_t id
CAN ID(11/29 bit 或 ErrorID)。CAN ID (11/29 bits or ErrorID).
Definition can.hpp:130
uint8_t data[8]
数据载荷。Data payload (up to 8 bytes).
Definition can.hpp:133
uint8_t dlc
有效数据长度(0~8)。Data length code (0–8).
Definition can.hpp:132
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:199
uint32_t start_id_mask
起始 ID 或掩码。Start ID or mask.
Definition can.hpp:201
uint32_t end_id_mask
结束 ID 或匹配值。End ID or match value.
Definition can.hpp:202
Callback cb
回调函数。Callback function.
Definition can.hpp:204
FilterMode mode
过滤模式。Filter mode.
Definition can.hpp:200
Type type
帧类型。Frame type.
Definition can.hpp:203
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:323
FDMode fd_mode
FD 模式配置。FD mode configuration.
Definition can.hpp:327
float data_sample_point
数据相位采样点。Data-phase sample point.
Definition can.hpp:325
DataBitTiming data_timing
数据相位位时序。Data-phase bit timing.
Definition can.hpp:326
uint32_t data_bitrate
数据相位波特率。Data-phase bitrate.
Definition can.hpp:324
数据相位位时序配置。Data phase bit timing configuration.
Definition can.hpp:298
uint32_t prop_seg
传播段。Propagation segment.
Definition can.hpp:300
uint32_t sjw
同步跳宽。Synchronization jump width.
Definition can.hpp:303
uint32_t phase_seg2
相位段 2。Phase segment 2.
Definition can.hpp:302
uint32_t brp
预分频。Prescaler.
Definition can.hpp:299
uint32_t phase_seg1
相位段 1。Phase segment 1.
Definition can.hpp:301
FDCAN FD 模式配置。FDCAN FD mode configuration.
Definition can.hpp:311
bool esi
全局 ESI 标志。Global ESI flag.
Definition can.hpp:314
bool brs
是否启用 BRS。Enable Bit Rate Switch.
Definition can.hpp:313
bool fd_enabled
是否启用 CAN FD。Enable CAN FD.
Definition can.hpp:312
CAN FD 帧数据结构。CAN FD frame structure.
Definition can.hpp:265
Type type
帧类型。Frame type.
Definition can.hpp:267
uint32_t id
CAN ID。CAN ID.
Definition can.hpp:266
uint8_t len
数据长度(0~64)。Data length (0–64 bytes).
Definition can.hpp:268
uint8_t data[64]
数据载荷。Data payload.
Definition can.hpp:269
FDCAN 订阅过滤器。FDCAN subscription filter.
Definition can.hpp:285
FilterMode mode
过滤模式。Filter mode.
Definition can.hpp:286
uint32_t start_id_mask
起始 ID 或掩码。Start ID or mask.
Definition can.hpp:287
CallbackFD cb
回调函数。Callback function.
Definition can.hpp:290
Type type
帧类型。Frame type.
Definition can.hpp:289
uint32_t end_id_mask
结束 ID 或匹配值。End ID or match value.
Definition can.hpp:288