libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
ch32_can.hpp
1#pragma once
2
3#include <atomic>
4#include <cstdint>
5#include <cstring>
6
7#include "can.hpp"
8#include "ch32_can_def.hpp"
9#include "slot_pool.hpp"
10
11#include DEF2STR(LIBXR_CH32_CONFIG_FILE)
12
13namespace LibXR
14{
23class CH32CAN : public CAN
24{
25 public:
33 explicit CH32CAN(ch32_can_id_t id, uint32_t queue_size);
34 ~CH32CAN() override = default;
35
40
44 ErrorCode SetConfig(const CAN::Configuration& cfg) override;
45
49 uint32_t GetClockFreq() const override;
50
54 ErrorCode AddMessage(const ClassicPack& pack) override;
55
59 ErrorCode GetErrorState(CAN::ErrorState& state) const override;
60
64 void ProcessRxInterrupt();
65
69 void ProcessTxInterrupt();
70
75
77 static CH32CAN* map[CH32_CAN_NUMBER]; // NOLINT
78
79 private:
80 static inline void BuildTxMsg(const ClassicPack& p, CanTxMsg& m);
81
82 void EnableIRQs();
83 void DisableIRQs();
84
85 void TxService();
86
87 private:
88 CAN_TypeDef* instance_{nullptr};
89 ch32_can_id_t id_{CH32_CAN_ID_ERROR};
90
91 uint8_t fifo_{0};
92 uint8_t filter_bank_{0};
93
95 SlotPool<ClassicPack> tx_queue_;
97 bool tx_retry_valid_{false};
99 ClassicPack tx_retry_pack_{};
100
101 std::atomic<uint32_t> tx_lock_{0};
102 std::atomic<uint32_t> tx_pend_{0};
103
105 CAN::Configuration cfg_cache_{};
106
108 CanRxMsg rx_msg_{};
109 CanTxMsg tx_msg_{};
110};
111} // namespace LibXR
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
CH32 CAN 驱动实现 / CH32 CAN driver implementation.
Definition ch32_can.hpp:24
CH32CAN(ch32_can_id_t id, uint32_t queue_size)
构造 CAN 驱动对象 / Construct CAN driver object
Definition ch32_can.cpp:128
ErrorCode SetConfig(const CAN::Configuration &cfg) override
设置 CAN 配置 / Set CAN configuration
Definition ch32_can.cpp:364
void ProcessTxInterrupt()
处理发送中断 / Handle TX interrupt
Definition ch32_can.cpp:587
void ProcessErrorInterrupt()
处理错误中断 / Handle error interrupt
Definition ch32_can.cpp:663
ErrorCode AddMessage(const ClassicPack &pack) override
发送消息入队 / Enqueue TX message
Definition ch32_can.cpp:571
void ProcessRxInterrupt()
处理接收中断 / Handle RX interrupt
Definition ch32_can.cpp:605
ErrorCode Init()
初始化过滤器和中断路由 / Initialize filters and IRQ routing
Definition ch32_can.cpp:184
ErrorCode GetErrorState(CAN::ErrorState &state) const override
获取总线错误状态 / Get bus error state
Definition ch32_can.cpp:758
uint32_t GetClockFreq() const override
获取 CAN 时钟频率 / Get CAN clock frequency
Definition ch32_can.cpp:485
static CH32CAN * map[CH32_CAN_NUMBER]
中断分发表 / IRQ dispatch map
Definition ch32_can.hpp:77
LibXR 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
定长槽池:任务与中断共享的小容量消息槽 / Fixed-size slot pool for small task/interrupt shared message slots.
经典 CAN 帧数据结构 / Classic CAN frame structure.
Definition can.hpp:129
CAN 配置参数 / CAN configuration parameters.
Definition can.hpp:62
CAN 当前错误状态快照(来自硬件计数器/状态机)。 Snapshot of current CAN controller error state (from HW counters/state).
Definition can.hpp:88