9#include "driver/gpio.h"
10#include "esp_intr_alloc.h"
11#include "hal/spi_ll.h"
12#include "hal/spi_types.h"
13#include "soc/soc_caps.h"
23 spi_host_device_t host,
int sclk_pin,
int miso_pin,
int mosi_pin,
RawData dma_rx,
31 uint32_t dma_enable_min_size = 3U,
bool enable_dma =
true);
35 bool in_isr =
false)
override;
40 bool in_isr =
false)
override;
43 bool in_isr =
false)
override;
56 static constexpr size_t kMaxPollingTransferBytes = SOC_SPI_MAXIMUM_BUFFER_SIZE;
57 static constexpr size_t kMaxDmaTransferBytes = SPI_LL_DMA_MAX_BIT_LEN / 8U;
63 ErrorCode InitializeHardware();
66 ErrorCode ConfigurePins();
68 ErrorCode ResolveClockSource(uint32_t& source_hz);
70 ErrorCode InstallInterrupt();
73 ErrorCode InitDmaBackend();
76 static void SpiIsrEntry(
void* arg);
78 void HandleInterrupt();
80 void FinishAsync(
bool in_isr, ErrorCode ec);
82 bool CanUseDma(
size_t size)
const;
84 ErrorCode EnsureReadyAndAcquire();
86 static ErrorCode FinalizeSyncResult(
OperationRW& op,
bool in_isr, ErrorCode ec);
88 static ErrorCode CompleteZeroSize(
OperationRW& op,
bool in_isr);
90 ErrorCode ReturnAsyncStartResult(ErrorCode ec,
bool started);
92 ErrorCode StartAsyncTransfer(
const uint8_t* tx, uint8_t* rx,
size_t size,
bool enable_rx,
96 void ConfigureTransferRegisters(
size_t size);
98 ErrorCode ExecuteChunk(
const uint8_t* tx, uint8_t* rx,
size_t size,
bool enable_rx);
100 ErrorCode ExecuteTransfer(
const uint8_t* tx, uint8_t* rx,
size_t size,
bool enable_rx);
102 bool UseLocalDoubleBuffer()
const;
104 void SwitchBufferLocal();
106 spi_host_device_t host_;
107 spi_dev_t* hw_ =
nullptr;
111 uint32_t source_clock_hz_ = 0;
112 std::atomic<bool> busy_{
false};
113 bool initialized_ =
false;
114 uint32_t dma_enable_min_size_ = 3U;
115 bool dma_requested_ =
true;
116 RawData dma_rx_raw_ = {
nullptr, 0};
117 RawData dma_tx_raw_ = {
nullptr, 0};
118 size_t dbuf_rx_block_size_ = 0;
119 size_t dbuf_tx_block_size_ = 0;
120 uint8_t dbuf_active_block_ = 0;
121 bool dbuf_enabled_ =
false;
122 intr_handle_t intr_handle_ =
nullptr;
123 bool intr_installed_ =
false;
124 bool dma_enabled_ =
false;
125 void* dma_ctx_ =
nullptr;
126 size_t dma_max_transfer_bytes_ = 0;
127 bool async_running_ =
false;
128 size_t async_dma_size_ = 0;
129 bool async_dma_rx_enabled_ =
false;
130 bool mem_read_ =
false;
131 RawData read_back_ = {
nullptr, 0};
常量原始数据封装类。 A class for encapsulating constant raw data.
Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
ErrorCode Transfer(size_t size, OperationRW &op, bool in_isr=false) override
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW &op, bool in_isr=false) override
向 SPI 设备的寄存器写入数据。 Writes data to a specific register of the SPI device.
ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW &op, bool in_isr=false) override
从 SPI 设备的寄存器读取数据。 Reads data from a specific register of the SPI device.
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
ErrorCode SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op, bool in_isr=false) override
进行 SPI 读写操作。Performs SPI read and write operations.
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(SPI)抽象类。Abstract class for Serial Peripheral Interface (SPI).
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
@ DIV_8
分频系数为 8。Division factor is 8.
@ LOW
时钟空闲时为低电平。Clock idle low.
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.