4#include DEF2STR(LIBXR_CH32_CONFIG_FILE)
8#include "ch32_spi_def.hpp"
9#include "libxr_def.hpp"
10#include "libxr_rw.hpp"
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,
34 bool in_isr)
override;
37 bool in_isr)
override;
39 bool in_isr)
override;
47 void TxDmaIRQHandler();
50 ErrorCode
PollingTransfer(uint8_t* rx,
const uint8_t* tx, uint32_t len);
52 static CH32SPI* map_[CH32_SPI_NUMBER];
55 inline bool DmaBusy()
const
57 return (dma_rx_channel_->CNTR != 0) || (dma_tx_channel_->CNTR != 0) || busy_;
60 void StartDmaDuplex(uint32_t count);
63 void PrepareTxBuffer(
ConstRawData write_data, uint32_t need_len, uint32_t prefix = 0,
64 uint8_t dummy = 0x00);
67 static bool MapEnumToCH32Prescaler(
SPI::Prescaler p, uint16_t& out);
70 SPI_TypeDef* instance_;
71 DMA_Channel_TypeDef* dma_rx_channel_;
72 DMA_Channel_TypeDef* dma_tx_channel_;
74 uint32_t dma_enable_min_size_;
79 bool mem_read_ =
false;
87 uint16_t nss_ = SPI_NSS_Soft;
92 GPIO_TypeDef* miso_port_;
94 GPIO_TypeDef* mosi_port_;
CH32 SPI 驱动实现 / CH32 SPI driver implementation.
void RxDmaIRQHandler()
DMA 中断回调 / DMA interrupt callbacks.
ErrorCode PollingTransfer(uint8_t *rx, const uint8_t *tx, uint32_t len)
轮询传输辅助函数 / Polling transfer helper
OperationRW rw_op_
运行时状态 / Runtime state
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.
ErrorCode SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
SPI::Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op, bool in_isr) override
SPI 接口实现 / SPI interface overrides.
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.
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
uint16_t mode_
SPI 寄存器配置缓存 / Cached SPI register configuration.
uint16_t prescaler_
SPI_BaudRatePrescaler_x.
uint16_t datasize_
SPI_DataSize_8b by default.
uint16_t firstbit_
SPI_FirstBit_MSB / SPI_FirstBit_LSB.
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
ErrorCode Transfer(size_t size, OperationRW &op, bool in_isr) override
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
GPIO_TypeDef * sck_port_
GPIO 配置 / GPIO configuration.
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(SPI)抽象类。Abstract class for Serial Peripheral Interface (SPI).
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
@ LOW
时钟空闲时为低电平。Clock idle low.
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.