libxr  1.0
Want to be the best embedded framework
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 "queue.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
97 bool tx_retry_valid_{false};
100
101 std::atomic<uint32_t> tx_lock_{0};
102 std::atomic<uint32_t> tx_pend_{0};
103
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:352
void ProcessTxInterrupt()
处理发送中断 / Handle TX interrupt
Definition ch32_can.cpp:579
void ProcessErrorInterrupt()
处理错误中断 / Handle error interrupt
Definition ch32_can.cpp:655
MPMCQueue< ClassicPack > tx_queue_
发送软件队列。 TX software queue.
Definition ch32_can.hpp:95
CAN::Configuration cfg_cache_
缓存配置(用于保留原值语义) / Cached configuration for keep-previous semantics
Definition ch32_can.hpp:105
ErrorCode AddMessage(const ClassicPack &pack) override
发送消息入队 / Enqueue TX message
Definition ch32_can.cpp:563
void ProcessRxInterrupt()
处理接收中断 / Handle RX interrupt
Definition ch32_can.cpp:597
ErrorCode Init()
初始化过滤器和中断路由 / Initialize filters and IRQ routing
Definition ch32_can.cpp:180
ErrorCode GetErrorState(CAN::ErrorState &state) const override
获取总线错误状态 / Get bus error state
Definition ch32_can.cpp:750
uint32_t GetClockFreq() const override
获取 CAN 时钟频率 / Get CAN clock frequency
Definition ch32_can.cpp:477
bool tx_retry_valid_
待重试帧有效标记。 Pending retry frame flag.
Definition ch32_can.hpp:97
static CH32CAN * map[CH32_CAN_NUMBER]
中断分发表 / IRQ dispatch map
Definition ch32_can.hpp:77
ClassicPack tx_retry_pack_
待重试帧。 Pending retry frame.
Definition ch32_can.hpp:99
CanRxMsg rx_msg_
中断上下文收发缓冲 / RX/TX buffers in IRQ context
Definition ch32_can.hpp:108
带固定 payload 类型的有界 MPMC 队列。
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
经典 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