libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
LibXR::FDCAN Class Referenceabstract

FDCAN 通信抽象类,扩展支持 CAN FD 帧。 Abstract class for FDCAN communication with CAN FD frame support. More...

#include <can.hpp>

Inheritance diagram for LibXR::FDCAN:
[legend]
Collaboration diagram for LibXR::FDCAN:
[legend]

Classes

struct  Configuration
 FDCAN 配置参数,扩展 CAN::Configuration。 FDCAN configuration, extending CAN::Configuration. More...
 
struct  DataBitTiming
 数据相位位时序配置 / Data phase bit timing configuration. More...
 
struct  FDMode
 FDCAN FD 模式配置 / FDCAN FD mode configuration. More...
 
struct  FDPack
 CAN FD 帧数据结构 / CAN FD frame structure. More...
 
struct  Filter
 FDCAN 订阅过滤器 / FDCAN subscription filter. More...
 

Public Types

using CallbackFD = LibXR::Callback<const FDPack&>
 FD 帧回调类型 / Callback type for FD frames.
 
enum class  FilterMode
 CAN 过滤器模式 / CAN filter mode. More...
 
- Public Types inherited from LibXR::CAN
enum class  Type : uint8_t {
  STANDARD = 0 , EXTENDED = 1 , REMOTE_STANDARD = 2 , REMOTE_EXTENDED = 3 ,
  ERROR = 4 , TYPE_NUM = 5
}
 CAN 消息类型 / CAN frame type. More...
 
enum class  ErrorID : uint32_t {
  CAN_ERROR_ID_GENERIC = CAN_ERROR_ID_PREFIX , CAN_ERROR_ID_BUS_OFF = CAN_ERROR_ID_PREFIX + 1 , CAN_ERROR_ID_ERROR_PASSIVE = CAN_ERROR_ID_PREFIX + 2 , CAN_ERROR_ID_ERROR_WARNING = CAN_ERROR_ID_PREFIX + 3 ,
  CAN_ERROR_ID_PROTOCOL = CAN_ERROR_ID_PREFIX + 4 , CAN_ERROR_ID_ACK = CAN_ERROR_ID_PREFIX + 5 , CAN_ERROR_ID_STUFF = CAN_ERROR_ID_PREFIX + 6 , CAN_ERROR_ID_FORM = CAN_ERROR_ID_PREFIX + 7 ,
  CAN_ERROR_ID_BIT0 = CAN_ERROR_ID_PREFIX + 8 , CAN_ERROR_ID_BIT1 = CAN_ERROR_ID_PREFIX + 9 , CAN_ERROR_ID_CRC = CAN_ERROR_ID_PREFIX + 10 , CAN_ERROR_ID_OTHER = CAN_ERROR_ID_PREFIX + 11
}
 ClassicPack::type == Type::ERROR 时使用的虚拟 ID。 Virtual IDs used when ClassicPack::type == Type::ERROR. More...
 
enum class  FilterMode : uint8_t { ID_MASK = 0 , ID_RANGE = 1 }
 CAN 过滤器模式 / CAN filter mode. More...
 
using Callback = LibXR::Callback<const ClassicPack&>
 回调类型 / Callback type.
 

Public Member Functions

 FDCAN ()=default
 构造函数 / Constructor.
 
virtual ~FDCAN ()=default
 虚析构函数 / Virtual destructor.
 
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.
 
virtual ErrorCode AddMessage (const FDPack &pack)=0
 添加 FD CAN 消息 / Add FD CAN message.
 
virtual ErrorCode AddMessage (const ClassicPack &pack)=0
 添加经典 CAN 消息 / Add classic CAN message.
 
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.
 
- Public Member Functions inherited from LibXR::CAN
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).
 
 CAN ()=default
 构造函数 / Constructor.
 
virtual ~CAN ()=default
 虚析构函数 / Virtual destructor.
 
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.
 

Protected Member Functions

void OnMessage (const FDPack &pack, bool in_isr)
 分发接收到的 FD CAN 帧。 Dispatch a received FD CAN frame.
 
void OnMessage (const ClassicPack &pack, bool in_isr)
 分发接收到的经典 CAN 帧。 Dispatch a received classic CAN frame.
 
- Protected Member Functions inherited from LibXR::CAN
void OnMessage (const ClassicPack &pack, bool in_isr)
 分发接收到的经典 CAN 帧。 Dispatch a received classic CAN frame.
 

Additional Inherited Members

- Static Public Member Functions inherited from LibXR::CAN
static constexpr uint32_t FromErrorID (ErrorID e) noexcept
 将 ErrorID 转为 id / Convert ErrorID to ClassicPack::id.
 
static constexpr bool IsErrorId (uint32_t id) noexcept
 判断 id 是否处于错误 ID 空间 / Check if id is in error ID space.
 
static constexpr ErrorID ToErrorID (uint32_t id) noexcept
 将 id 解释为 ErrorID / Interpret id as ErrorID.
 
- Static Public Attributes inherited from LibXR::CAN
static LIBXR_PACKED_END constexpr uint32_t CAN_ERROR_ID_PREFIX = 0xFFFF0000u
 错误 ID 前缀 / Error ID prefix.
 

Detailed Description

FDCAN 通信抽象类,扩展支持 CAN FD 帧。 Abstract class for FDCAN communication with CAN FD frame support.

Definition at line 247 of file can.hpp.

Member Typedef Documentation

◆ CallbackFD

FD 帧回调类型 / Callback type for FD frames.

Definition at line 279 of file can.hpp.

Member Enumeration Documentation

◆ FilterMode

enum class LibXR::CAN::FilterMode : uint8_t
strong

CAN 过滤器模式 / CAN filter mode.

Definition at line 187 of file can.hpp.

188 {
189 ID_MASK = 0,
191 ID_RANGE = 1
193 };

Member Function Documentation

◆ AddMessage() [1/2]

virtual ErrorCode LibXR::CAN::AddMessage ( const ClassicPack & pack)
virtual

添加经典 CAN 消息 / Add classic CAN message.

Parameters
pack经典 CAN 帧 / Classic CAN frame.
Returns
ErrorCode 操作结果 / Error code.

Implements LibXR::CAN.

Reimplemented in LibXR::STM32CANFD.

◆ AddMessage() [2/2]

virtual ErrorCode LibXR::FDCAN::AddMessage ( const FDPack & pack)
pure virtual

添加 FD CAN 消息 / Add FD CAN message.

Parameters
packFD CAN 帧 / FD CAN frame.
Returns
ErrorCode 操作结果 / Error code.

Implemented in LibXR::STM32CANFD.

◆ OnMessage() [1/2]

void CAN::OnMessage ( const ClassicPack & pack,
bool in_isr )
protected

分发接收到的经典 CAN 帧。 Dispatch a received classic CAN frame.

Parameters
pack接收到的帧 / Received frame.
in_isr是否在中断上下文中 / True if called in ISR context.

Definition at line 235 of file can.cpp.

19{
20 ASSERT(pack.type < Type::TYPE_NUM);
21 subscriber_list_[static_cast<uint8_t>(pack.type)].Foreach<Filter>(
22 [&](Filter& node)
23 {
24 switch (node.mode)
25 {
26 case FilterMode::ID_MASK:
27 if ((pack.id & node.start_id_mask) == node.end_id_mask)
28 {
29 node.cb.Run(in_isr, pack);
30 }
31 break;
32 case FilterMode::ID_RANGE:
33 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_mask)
34 {
35 node.cb.Run(in_isr, pack);
36 }
37 break;
38 }
39
40 return ErrorCode::OK;
41 });
42}
@ TYPE_NUM
类型数量上界 / Number of frame types.
@ OK
操作成功 / Operation successful

◆ OnMessage() [2/2]

void FDCAN::OnMessage ( const FDPack & pack,
bool in_isr )
protected

分发接收到的 FD CAN 帧。 Dispatch a received FD CAN frame.

Parameters
pack接收到的 FD 帧 / Received FD frame.
in_isr是否在中断上下文中 / True if called in ISR context.

Definition at line 54 of file can.cpp.

55{
56 // FD 帧没有远程帧,订阅表只有 STANDARD 和 EXTENDED 两项。
57 // FD frames have no remote form; the subscriber table holds only STANDARD and EXTENDED.
58 ASSERT(pack.type < Type::REMOTE_STANDARD);
59 subscriber_list_fd_[static_cast<uint8_t>(pack.type)].Foreach<Filter>(
60 [&](Filter& node)
61 {
62 switch (node.mode)
63 {
64 case FilterMode::ID_MASK:
65 if ((pack.id & node.start_id_mask) == node.end_id_mask)
66 {
67 node.cb.Run(in_isr, pack);
68 }
69 break;
70 case FilterMode::ID_RANGE:
71 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_mask)
72 {
73 node.cb.Run(in_isr, pack);
74 }
75 break;
76 }
77
78 return ErrorCode::OK;
79 });
80}
@ REMOTE_STANDARD
标准远程帧 / Standard remote frame.

◆ Register() [1/2]

void CAN::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.

Parameters
cb回调函数 / Callback function.
type帧类型 / Frame type.
mode过滤器模式 / Filter mode.
start_id_mask起始 ID 或掩码 / Start ID or mask.
end_id_mask结束 ID 或匹配值 / End ID or match value.

Definition at line 218 of file can.cpp.

10{
11 ASSERT(type < Type::TYPE_NUM);
12
13 auto node = new (std::align_val_t(LibXR::CONCURRENCY_ALIGNMENT))
14 LockFreeList::Node<Filter>(Filter{mode, start_id_mask, end_id_mask, type, cb});
15 subscriber_list_[static_cast<uint8_t>(type)].Add(*node);
16}
数据节点模板,继承自 BaseNode,用于存储具体数据类型。 Template data node that inherits from BaseNode to store specific data...
constexpr size_t CONCURRENCY_ALIGNMENT
并发结构对齐粒度(用于降低多核伪共享) / Alignment policy used by concurrency-oriented structures
Definition libxr_def.hpp:61

◆ Register() [2/2]

void FDCAN::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.

Parameters
cb回调函数 / Callback function.
type帧类型 / Frame type.
mode过滤器模式 / Filter mode.
start_id_mask起始 ID 或掩码 / Start ID or mask.
end_id_mask结束 ID 或匹配值 / End ID or match value.

Definition at line 44 of file can.cpp.

46{
47 ASSERT(type < Type::REMOTE_STANDARD);
48
49 auto node = new (std::align_val_t(LibXR::CONCURRENCY_ALIGNMENT))
50 LockFreeList::Node<Filter>(Filter{mode, start_id_mask, end_id_mask, type, cb});
51 subscriber_list_fd_[static_cast<uint8_t>(type)].Add(*node);
52}

◆ SetConfig() [1/2]

virtual ErrorCode LibXR::FDCAN::SetConfig ( const CAN::Configuration & cfg)
overridepure virtual

设置经典 CAN 配置。 Set classic CAN configuration.

作为 FDCAN 的兼容接口,具体实现可仅使用仲裁相位配置。

Parameters
cfgCAN 配置 / CAN configuration.
Returns
ErrorCode 操作结果 / Error code.

Implements LibXR::CAN.

Implemented in LibXR::STM32CANFD.

◆ SetConfig() [2/2]

virtual ErrorCode LibXR::FDCAN::SetConfig ( const FDCAN::Configuration & cfg)
pure virtual

设置 FDCAN 配置。 Set FDCAN configuration.

Parameters
cfgFDCAN 配置 / FDCAN configuration.
Returns
ErrorCode 操作结果 / Error code.

Implemented in LibXR::STM32CANFD.


The documentation for this class was generated from the following files: