3#include "double_buffer.hpp"
76 const uint8_t ORD =
static_cast<uint8_t
>(prescaler);
77 return (ORD <= 30) ? (1u << ORD) : 0u;
112 : rx_buffer_(rx_buffer),
113 tx_buffer_(tx_buffer),
114 double_buffer_rx_(rx_buffer),
115 double_buffer_tx_(tx_buffer)
183 if (DIV == 0u || SRC == 0u)
208 if (target_max_bus_speed && target_min_bus_speed &&
209 target_min_bus_speed > target_max_bus_speed)
211 uint32_t t = target_min_bus_speed;
212 target_min_bus_speed = target_max_bus_speed;
213 target_max_bus_speed = t;
227 const uint32_t F = SRC / DIV;
228 if (target_max_bus_speed && F > target_max_bus_speed)
232 if (target_min_bus_speed && F < target_min_bus_speed)
241 for (uint8_t i = 0; i <= MAX_IDX; ++i)
252 for (
int i =
static_cast<int>(MAX_IDX); i >= 0; --i)
266 if (target_min_bus_speed && F_FASTEST < target_min_bus_speed)
270 if (target_max_bus_speed && F_SLOWEST > target_max_bus_speed)
277 for (uint8_t i = 0; i <= MAX_IDX; ++i)
281 if (!target_max_bus_speed || F <= target_max_bus_speed)
290 for (
int i =
static_cast<int>(MAX_IDX); i >= 0; --i)
294 if (!target_min_bus_speed || F >= target_min_bus_speed)
342 double_buffer_rx_.
Switch();
343 double_buffer_tx_.
Switch();
378 bool in_isr =
false) = 0;
391 bool in_isr =
false) = 0;
408 Configuration config_;
409 RawData rx_buffer_, tx_buffer_;
只读原始数据视图 / Immutable raw data view
双缓冲区管理类 / 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
可写原始数据视图 / Mutable raw data view
串行外设接口(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.
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 SetConfig(Configuration config)=0
设置 SPI 配置参数 / Sets SPI configuration parameters.
virtual ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW &op, bool in_isr=false)=0
从 SPI 设备的寄存器读取数据。 Reads data from a specific register of the SPI device.
virtual ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW &op, bool in_isr=false)=0
向 SPI 设备的寄存器写入数据。 Writes data to a specific register of the SPI device.
virtual ErrorCode Transfer(size_t size, OperationRW &op, bool in_isr=false)=0
进行一次SPI传输(使用当前缓冲区数据,零拷贝,支持双缓冲)。 Performs a SPI transfer (zero-copy, supports double buffering).
bool IsDoubleBuffer() const
检查是否使用双缓冲区 / Checks if double buffering is enabled.
virtual ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op, bool in_isr=false)=0
进行 SPI 读写操作 / Performs SPI read and write operations.
uint32_t GetBusSpeed() const
获取 SPI 设备的当前总线速度 / Gets the current bus speed of the SPI device.
Prescaler CalcPrescaler(uint32_t target_max_bus_speed, uint32_t target_min_bus_speed, bool increase)
计算 SPI 分频系数 / Calculates the SPI prescaler.
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 Write(ConstRawData write_data, OperationRW &op, bool in_isr=false)
进行 SPI 写入操作 / Performs SPI write operation.
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.
virtual ErrorCode Read(RawData read_data, OperationRW &op, bool in_isr=false)
进行 SPI 读取操作 / Performs SPI read operation.
Configuration & GetConfig()
获取 SPI 配置参数 / Gets the SPI configuration parameters.
LibXR 命名空间 / LibXR namespace.
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
Operation< ErrorCode > WriteOperation
写操作的完成通知描述符 / Write completion descriptor.
存储 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.