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 ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data,
27 OperationRW &op) override;
28 ErrorCode SetConfig(SPI::Configuration config) override;
29 ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW &op) override;
30 ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW &op) override;
31
32 void RxDmaIRQHandler();
33 void TxDmaIRQHandler();
34
35 ErrorCode PollingTransfer(uint8_t *rx, const uint8_t *tx, uint32_t len);
36
37 static CH32SPI *map[CH32_SPI_NUMBER];
38
39 private:
40 inline bool DmaBusy() const
41 {
42 return (dma_rx_channel_->CNTR != 0) || (dma_tx_channel_->CNTR != 0) || busy_;
43 }
44
45 void StartDmaDuplex(uint32_t count);
46 void StopDma();
47
48 void PrepareTxBuffer(ConstRawData write_data, uint32_t need_len, uint32_t prefix = 0,
49 uint8_t dummy = 0xFF);
50
51 public:
52 RawData dma_buff_rx_;
53 RawData dma_buff_tx_;
54 SPI_TypeDef *instance_;
55 DMA_Channel_TypeDef *dma_rx_channel_;
56 DMA_Channel_TypeDef *dma_tx_channel_;
57 ch32_spi_id_t id_;
58 uint32_t dma_enable_min_size_;
59
60 // 运行时缓存 / 状态
61 OperationRW rw_op_;
62 RawData read_buff_;
63 bool mem_read_ = false;
64 bool busy_ = false;
65
66 // SPI 配置缓存
67 uint16_t mode_; // SPI_Mode_Master / Slave
68 uint16_t datasize_; // 默认 SPI_DataSize_8b
69 uint16_t firstbit_; // SPI_FirstBit_MSB/LSB
70 uint16_t prescaler_; // SPI_BaudRatePrescaler_x
71 uint16_t nss_ = SPI_NSS_Soft;
72
73 // GPIO
74 GPIO_TypeDef *sck_port_;
75 uint16_t sck_pin_;
76 GPIO_TypeDef *miso_port_;
77 uint16_t miso_pin_;
78 GPIO_TypeDef *mosi_port_;
79 uint16_t mosi_pin_;
80};
81
82} // 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:356
ErrorCode SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
Definition ch32_spi.cpp:183
ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op) override
进行 SPI 读写操作。Performs SPI read and write operations.
Definition ch32_spi.cpp:225
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:298
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(SPI)抽象类。Abstract class for Serial Peripheral Interface (SPI).
Definition spi.hpp:13
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
@ LOW
时钟空闲时为低电平。Clock idle low.
LibXR 命名空间
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.
Definition spi.hpp:46