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
19class CH32SPI : public SPI
20{
21 public:
25 CH32SPI(ch32_spi_id_t id, RawData dma_rx, RawData dma_tx, GPIO_TypeDef* sck_port,
26 uint16_t sck_pin, GPIO_TypeDef* miso_port, uint16_t miso_pin,
27 GPIO_TypeDef* mosi_port, uint16_t mosi_pin, uint32_t pin_remap = 0,
28 bool master_mode = true, bool firstbit_msb = true,
29 uint16_t prescaler = SPI_BaudRatePrescaler_64, uint32_t dma_enable_min_size = 3,
31
33 ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW& op,
34 bool in_isr) override;
35 ErrorCode SetConfig(SPI::Configuration config) override;
36 ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW& op,
37 bool in_isr) override;
38 ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW& op,
39 bool in_isr) override;
40
41 ErrorCode Transfer(size_t size, OperationRW& op, bool in_isr) override;
42 uint32_t GetMaxBusSpeed() const override;
43 SPI::Prescaler GetMaxPrescaler() const override;
44
46 void RxDmaIRQHandler();
47 void TxDmaIRQHandler();
48
50 ErrorCode PollingTransfer(uint8_t* rx, const uint8_t* tx, uint32_t len);
51
52 static CH32SPI* map_[CH32_SPI_NUMBER];
53
54 private:
55 inline bool DmaBusy() const
56 {
57 return (dma_rx_channel_->CNTR != 0) || (dma_tx_channel_->CNTR != 0) || busy_;
58 }
59
60 void StartDmaDuplex(uint32_t count);
61 void StopDma();
62
63 void PrepareTxBuffer(ConstRawData write_data, uint32_t need_len, uint32_t prefix = 0,
64 uint8_t dummy = 0x00);
65
66 static SPI::Prescaler MapCH32PrescalerToEnum(uint16_t p);
67 static bool MapEnumToCH32Prescaler(SPI::Prescaler p, uint16_t& out);
68
69 public:
70 SPI_TypeDef* instance_;
71 DMA_Channel_TypeDef* dma_rx_channel_;
72 DMA_Channel_TypeDef* dma_tx_channel_;
73 ch32_spi_id_t id_;
74 uint32_t dma_enable_min_size_;
75
78 RawData read_buff_;
79 bool mem_read_ = false;
80 bool busy_ = false;
81
83 uint16_t mode_;
84 uint16_t datasize_;
85 uint16_t firstbit_;
86 uint16_t prescaler_;
87 uint16_t nss_ = SPI_NSS_Soft;
88
90 GPIO_TypeDef* sck_port_;
91 uint16_t sck_pin_;
92 GPIO_TypeDef* miso_port_;
93 uint16_t miso_pin_;
94 GPIO_TypeDef* mosi_port_;
95 uint16_t mosi_pin_;
96};
97
98} // namespace LibXR
CH32 SPI 驱动实现 / CH32 SPI driver implementation.
Definition ch32_spi.hpp:20
void RxDmaIRQHandler()
DMA 中断回调 / DMA interrupt callbacks.
Definition ch32_spi.cpp:549
ErrorCode PollingTransfer(uint8_t *rx, const uint8_t *tx, uint32_t len)
轮询传输辅助函数 / Polling transfer helper
Definition ch32_spi.cpp:268
OperationRW rw_op_
运行时状态 / Runtime state
Definition ch32_spi.hpp:77
ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW &op, bool in_isr) override
从 SPI 设备的寄存器读取数据。 Reads data from a specific register of the SPI device.
Definition ch32_spi.cpp:371
ErrorCode SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
Definition ch32_spi.cpp:232
SPI::Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
Definition ch32_spi.cpp:666
ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op, bool in_isr) override
SPI 接口实现 / SPI interface overrides.
Definition ch32_spi.cpp:289
ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW &op, bool in_isr) override
向 SPI 设备的寄存器写入数据。 Writes data to a specific register of the SPI device.
Definition ch32_spi.cpp:437
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
Definition ch32_spi.cpp:649
uint16_t mode_
SPI 寄存器配置缓存 / Cached SPI register configuration.
Definition ch32_spi.hpp:83
uint16_t prescaler_
SPI_BaudRatePrescaler_x.
Definition ch32_spi.hpp:86
uint16_t datasize_
SPI_DataSize_8b by default.
Definition ch32_spi.hpp:84
uint16_t firstbit_
SPI_FirstBit_MSB / SPI_FirstBit_LSB.
Definition ch32_spi.hpp:85
CH32SPI(ch32_spi_id_t id, RawData dma_rx, RawData dma_tx, GPIO_TypeDef *sck_port, uint16_t sck_pin, GPIO_TypeDef *miso_port, uint16_t miso_pin, GPIO_TypeDef *mosi_port, uint16_t mosi_pin, uint32_t pin_remap=0, bool master_mode=true, bool firstbit_msb=true, uint16_t prescaler=SPI_BaudRatePrescaler_64, uint32_t dma_enable_min_size=3, SPI::Configuration config={SPI::ClockPolarity::LOW, SPI::ClockPhase::EDGE_1})
构造 SPI 对象 / Construct SPI object
Definition ch32_spi.cpp:62
ErrorCode Transfer(size_t size, OperationRW &op, bool in_isr) override
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
Definition ch32_spi.cpp:596
GPIO_TypeDef * sck_port_
GPIO 配置 / GPIO configuration.
Definition ch32_spi.hpp:90
常量原始数据封装类。 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 命名空间
Definition ch32_can.hpp:14
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.
Definition spi.hpp:85