libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
esp_spi.hpp
1#pragma once
2
3#include "esp_def.hpp"
4
5#include <atomic>
6#include <cstddef>
7#include <cstdint>
8
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"
14#include "spi.hpp"
15
16namespace LibXR
17{
18
19class ESP32SPI : public SPI
20{
21 public:
23 spi_host_device_t host, int sclk_pin, int miso_pin, int mosi_pin, RawData dma_rx,
24 RawData dma_tx,
25 SPI::Configuration config = {
29 false,
30 },
31 uint32_t dma_enable_min_size = 3U, bool enable_dma = true);
32
33
34 ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW& op,
35 bool in_isr = false) override;
36
37 ErrorCode SetConfig(SPI::Configuration config) override;
38
39 ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW& op,
40 bool in_isr = false) override;
41
42 ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW& op,
43 bool in_isr = false) override;
44
45 ErrorCode Transfer(size_t size, OperationRW& op, bool in_isr = false) override;
46
47 uint32_t GetMaxBusSpeed() const override;
48
49 Prescaler GetMaxPrescaler() const override;
50
51 RawData GetRxBuffer();
52
53 RawData GetTxBuffer();
54
55 private:
56 static constexpr size_t kMaxPollingTransferBytes = SOC_SPI_MAXIMUM_BUFFER_SIZE;
57 static constexpr size_t kMaxDmaTransferBytes = SPI_LL_DMA_MAX_BIT_LEN / 8U;
58
59 bool Acquire();
60
61 void Release();
62
63 ErrorCode InitializeHardware();
64
65
66 ErrorCode ConfigurePins();
67
68 ErrorCode ResolveClockSource(uint32_t& source_hz);
69
70 ErrorCode InstallInterrupt();
71
72
73 ErrorCode InitDmaBackend();
74
75
76 static void SpiIsrEntry(void* arg);
77
78 void HandleInterrupt();
79
80 void FinishAsync(bool in_isr, ErrorCode ec);
81
82 bool CanUseDma(size_t size) const;
83
84 ErrorCode EnsureReadyAndAcquire();
85
86 static ErrorCode FinalizeSyncResult(OperationRW& op, bool in_isr, ErrorCode ec);
87
88 static ErrorCode CompleteZeroSize(OperationRW& op, bool in_isr);
89
90 ErrorCode ReturnAsyncStartResult(ErrorCode ec, bool started);
91
92 ErrorCode StartAsyncTransfer(const uint8_t* tx, uint8_t* rx, size_t size, bool enable_rx,
93 RawData read_back, bool mem_read, OperationRW& op,
94 bool& started);
95
96 void ConfigureTransferRegisters(size_t size);
97
98 ErrorCode ExecuteChunk(const uint8_t* tx, uint8_t* rx, size_t size, bool enable_rx);
99
100 ErrorCode ExecuteTransfer(const uint8_t* tx, uint8_t* rx, size_t size, bool enable_rx);
101
102 bool UseLocalDoubleBuffer() const;
103
104 void SwitchBufferLocal();
105
106 spi_host_device_t host_;
107 spi_dev_t* hw_ = nullptr;
108 int sclk_pin_;
109 int miso_pin_;
110 int mosi_pin_;
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};
132 OperationRW rw_op_;
133};
134
135} // namespace LibXR
常量原始数据封装类。 A class for encapsulating constant raw data.
Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
Definition esp_spi.cpp:929
ErrorCode Transfer(size_t size, OperationRW &op, bool in_isr=false) override
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
Definition esp_spi.cpp:889
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.
Definition esp_spi.cpp:849
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.
Definition esp_spi.cpp:804
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
Definition esp_spi.cpp:927
ErrorCode SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
Definition esp_spi.cpp:452
ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op, bool in_isr=false) override
进行 SPI 读写操作。Performs SPI read and write operations.
Definition esp_spi.cpp:751
原始数据封装类。 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.
@ DIV_8
分频系数为 8。Division factor is 8.
@ LOW
时钟空闲时为低电平。Clock idle low.
LibXR 命名空间
Definition ch32_can.hpp:14
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.
Definition spi.hpp:85