3#include "double_buffer.hpp"
76 const uint8_t ORD =
static_cast<uint8_t
>(prescaler);
77 return (ORD <= 30) ? (1u << ORD) : 0u;
111 : rx_buffer_(rx_buffer),
112 tx_buffer_(tx_buffer),
113 double_buffer_rx_(rx_buffer),
114 double_buffer_tx_(tx_buffer)
179 if (DIV == 0u || SRC == 0u)
204 if (target_max_bus_speed && target_min_bus_speed &&
205 target_min_bus_speed > target_max_bus_speed)
207 uint32_t t = target_min_bus_speed;
208 target_min_bus_speed = target_max_bus_speed;
209 target_max_bus_speed = t;
223 const uint32_t F = SRC / DIV;
224 if (target_max_bus_speed && F > target_max_bus_speed)
228 if (target_min_bus_speed && F < target_min_bus_speed)
237 for (uint8_t i = 0; i <= MAX_IDX; ++i)
248 for (
int i =
static_cast<int>(MAX_IDX); i >= 0; --i)
262 if (target_min_bus_speed && F_FASTEST < target_min_bus_speed)
266 if (target_max_bus_speed && F_SLOWEST > target_max_bus_speed)
273 for (uint8_t i = 0; i <= MAX_IDX; ++i)
277 if (!target_max_bus_speed || F <= target_max_bus_speed)
286 for (
int i =
static_cast<int>(MAX_IDX); i >= 0; --i)
290 if (!target_min_bus_speed || F >= target_min_bus_speed)
338 double_buffer_rx_.
Switch();
339 double_buffer_tx_.
Switch();
399 Configuration config_;
400 RawData rx_buffer_, tx_buffer_;
常量原始数据封装类。 A class for encapsulating constant raw data.
双缓冲区管理类 / Double buffer manager class
void SetActiveLength(size_t length)
设置当前活动缓冲区的数据长度 Sets the size of the active buffer
size_t Size() const
获取每个缓冲区的大小(单位:字节) Gets the size of each buffer in bytes
uint8_t * ActiveBuffer() const
获取当前正在使用的缓冲区指针 Returns the currently active buffer
size_t GetActiveLength() const
获取当前活动缓冲区中准备好的数据长度 Gets the size of valid data in active buffer
void Switch()
切换到备用缓冲区(若其有效) Switches to the pending buffer if it's valid
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(SPI)抽象类。Abstract class for Serial Peripheral Interface (SPI).
ClockPhase
定义 SPI 时钟相位。Defines the SPI clock phase.
@ EDGE_2
在第二个时钟边沿采样数据。Data sampled on the second clock edge.
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
@ DIV_8192
分频系数为 8192。Division factor is 8192.
@ DIV_16
分频系数为 16。Division factor is 16.
@ DIV_2
分频系数为 2。Division factor is 2.
@ DIV_4096
分频系数为 4096。Division factor is 4096.
@ DIV_64
分频系数为 64。Division factor is 64.
@ DIV_16384
分频系数为 16384。Division factor is 16384.
@ DIV_1
分频系数为 1。Division factor is 1.
@ DIV_2048
分频系数为 2048。Division factor is 2048.
@ UNKNOWN
未知分频系数。Unknown prescaler.
@ DIV_32768
分频系数为 32768。Division factor is 32768.
@ DIV_65536
分频系数为 65536。Division factor is 65536.
@ DIV_256
分频系数为 256。Division factor is 256.
@ DIV_128
分频系数为 128。Division factor is 128.
@ DIV_4
分频系数为 4。Division factor is 4.
@ DIV_32
分频系数为 32。Division factor is 32.
@ DIV_512
分频系数为 512。Division factor is 512.
@ DIV_8
分频系数为 8。Division factor is 8.
@ DIV_1024
分频系数为 1024。Division factor is 1024.
RawData GetRxBuffer()
获取接收数据的缓冲区。Gets the buffer for storing received data.
virtual ErrorCode Transfer(size_t size, OperationRW &op)=0
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
static constexpr uint32_t PrescalerToDiv(Prescaler prescaler)
将分频系数转换为除数。Converts a prescaler to a divisor.
virtual Prescaler GetMaxPrescaler() const =0
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
virtual ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW &op)=0
向 SPI 设备的寄存器写入数据。 Writes data to a specific register of the SPI device.
virtual ErrorCode SetConfig(Configuration config)=0
设置 SPI 配置参数。Sets SPI configuration parameters.
bool IsDoubleBuffer() const
检查是否使用双缓冲区。Checks if double buffering is enabled.
virtual ErrorCode Write(ConstRawData write_data, OperationRW &op)
进行 SPI 写入操作。Performs SPI write operation.
uint32_t GetBusSpeed() const
获取 SPI 设备的当前总线速度。Gets the current bus speed of the SPI device.
virtual ErrorCode Read(RawData read_data, OperationRW &op)
进行 SPI 读取操作。Performs SPI read operation.
Prescaler CalcPrescaler(uint32_t target_max_bus_speed, uint32_t target_min_bus_speed, bool increase)
计算 SPI 分频系数。Calculates the SPI prescaler.
virtual ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW &op)=0
从 SPI 设备的寄存器读取数据。 Reads data from a specific register of the SPI device.
SPI(RawData rx_buffer, RawData tx_buffer)
构造函数。Constructor.
virtual uint32_t GetMaxBusSpeed() const =0
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
void SetActiveLength(size_t len)
设置缓冲区的有效数据长度。Sets the length of valid data in the buffer.
virtual ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op)=0
进行 SPI 读写操作。Performs SPI read and write operations.
void SwitchBuffer()
切换缓冲区。Switches the buffer.
RawData GetTxBuffer()
获取发送数据的缓冲区。Gets the buffer for storing data to be sent.
size_t GetActiveLength() const
获取缓冲区的有效数据长度。Gets the length of valid data in the buffer.
ClockPolarity
定义 SPI 时钟极性。Defines the SPI clock polarity.
@ LOW
时钟空闲时为低电平。Clock idle low.
@ HIGH
时钟空闲时为高电平。Clock idle high.
Configuration & GetConfig()
获取 SPI 配置参数。Gets the SPI configuration parameters.
Operation< ErrorCode > WriteOperation
Write operation type.
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.
bool double_buffer
是否使用双缓冲区。Whether to use double buffer.
ClockPhase clock_phase
SPI 时钟相位。SPI clock phase.
Prescaler prescaler
SPI 分频系数。SPI prescaler.
ClockPolarity clock_polarity
SPI 时钟极性。SPI clock polarity.
存储 SPI 读写操作信息的结构体。Structure for storing SPI read/write operation information.
OperationRW op
读写操作类型。Type of read/write operation.
ConstRawData write_data
待写入的数据缓冲区。Buffer for data to be written.
RawData read_data
读取的数据缓冲区。Buffer for storing read data.