libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
ch32_spi.hpp
1#pragma once
2
3#include "libxr.hpp"
4#include DEF2STR(LIBXR_CH32_CONFIG_FILE)
5
6#include <cstring>
7
8#include "ch32_spi_def.hpp"
9#include "libxr_def.hpp"
10#include "libxr_rw.hpp"
11#include "spi.hpp"
12
13namespace LibXR
14{
15
16class CH32SPI : public SPI
17{
18 public:
19 CH32SPI(ch32_spi_id_t id, RawData dma_rx, RawData dma_tx, GPIO_TypeDef* sck_port,
20 uint16_t sck_pin, GPIO_TypeDef* miso_port, uint16_t miso_pin,
21 GPIO_TypeDef* mosi_port, uint16_t mosi_pin, uint32_t pin_remap = 0,
22 bool master_mode = true, bool firstbit_msb = true,
23 uint16_t prescaler = SPI_BaudRatePrescaler_64, uint32_t dma_enable_min_size = 3,
25
26 // === SPI 基类必需接口 ===
27 ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data,
28 OperationRW& op) override;
29 ErrorCode SetConfig(SPI::Configuration config) override;
30 ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW& op) override;
31 ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW& op) override;
32
33 ErrorCode Transfer(size_t size, OperationRW& op) override;
34 uint32_t GetMaxBusSpeed() const override;
35 SPI::Prescaler GetMaxPrescaler() const override;
36
37 // 中断回调
38 void RxDmaIRQHandler();
39 void TxDmaIRQHandler();
40
41 // 低级轮询传输(内部使用)
42 ErrorCode PollingTransfer(uint8_t* rx, const uint8_t* tx, uint32_t len);
43
44 static CH32SPI* map[CH32_SPI_NUMBER];
45
46 private:
47 inline bool DmaBusy() const
48 {
49 return (dma_rx_channel_->CNTR != 0) || (dma_tx_channel_->CNTR != 0) || busy_;
50 }
51
52 void StartDmaDuplex(uint32_t count);
53 void StopDma();
54
55 void PrepareTxBuffer(ConstRawData write_data, uint32_t need_len, uint32_t prefix = 0,
56 uint8_t dummy = 0x00);
57
58 static SPI::Prescaler MapCH32PrescalerToEnum(uint16_t p);
59 static bool MapEnumToCH32Prescaler(SPI::Prescaler p, uint16_t& out);
60
61 public:
62 SPI_TypeDef* instance_;
63 DMA_Channel_TypeDef* dma_rx_channel_;
64 DMA_Channel_TypeDef* dma_tx_channel_;
65 ch32_spi_id_t id_;
66 uint32_t dma_enable_min_size_;
67
68 // 运行时缓存 / 状态
69 OperationRW rw_op_;
70 RawData read_buff_;
71 bool mem_read_ = false;
72 bool busy_ = false;
73
74 // SPI 配置缓存
75 uint16_t mode_; // SPI_Mode_Master / Slave
76 uint16_t datasize_; // 默认 SPI_DataSize_8b
77 uint16_t firstbit_; // SPI_FirstBit_MSB/LSB
78 uint16_t prescaler_; // SPI_BaudRatePrescaler_x
79 uint16_t nss_ = SPI_NSS_Soft;
80
81 // GPIO
82 GPIO_TypeDef* sck_port_;
83 uint16_t sck_pin_;
84 GPIO_TypeDef* miso_port_;
85 uint16_t miso_pin_;
86 GPIO_TypeDef* mosi_port_;
87 uint16_t mosi_pin_;
88};
89
90} // namespace LibXR
ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW &op) override
向 SPI 设备的寄存器写入数据。 Writes data to a specific register of the SPI device.
Definition ch32_spi.cpp:414
ErrorCode SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
Definition ch32_spi.cpp:231
ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op) override
进行 SPI 读写操作。Performs SPI read and write operations.
Definition ch32_spi.cpp:285
SPI::Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
Definition ch32_spi.cpp:620
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
Definition ch32_spi.cpp:603
ErrorCode Transfer(size_t size, OperationRW &op) override
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
Definition ch32_spi.cpp:558
ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW &op) override
从 SPI 设备的寄存器读取数据。 Reads data from a specific register of the SPI device.
Definition ch32_spi.cpp:356
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(SPI)抽象类。Abstract class for Serial Peripheral Interface (SPI).
Definition spi.hpp:14
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
@ LOW
时钟空闲时为低电平。Clock idle low.
LibXR 命名空间
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.
Definition spi.hpp:85