3#include <ti/driverlib/dl_dma.h>
4#include <ti/driverlib/dl_spi.h>
6#include "ti_msp_dl_config.h"
20 uint8_t dma_rx_channel;
21 uint8_t dma_tx_channel;
25 uint32_t dma_enable_min_size = 3,
30 bool in_isr =
false)
override;
35 bool in_isr =
false)
override;
38 bool in_isr =
false)
override;
46 static void OnInterrupt(uint8_t index);
48 static constexpr uint8_t ResolveIndex(IRQn_Type irqn)
61 return INVALID_INSTANCE_INDEX;
66 enum class DmaMode : uint8_t
73 static constexpr uint8_t MAX_SPI_INSTANCES = 2;
74 static constexpr uint8_t INVALID_INSTANCE_INDEX = 0xFF;
75 static constexpr uint32_t RX_ONLY_REPEAT_TX_MAX_FRAMES = 256U;
77 ErrorCode PollingTransfer(uint8_t* rx,
const uint8_t* tx, uint32_t len);
81 void StartDmaDuplex(uint32_t count);
83 void StartDmaRxOnly(uint32_t offset, uint32_t count);
85 void StartDmaTxOnly(uint32_t count);
89 void HandleInterrupt();
94 uint32_t dma_enable_min_size_;
98 bool mem_read_ =
false;
99 DmaMode dma_mode_ = DmaMode::DUPLEX;
100 uint32_t masked_interrupts_for_tx_only_ = 0;
101 uint32_t rx_only_offset_ = 0;
102 uint32_t rx_only_remaining_ = 0;
103 volatile bool busy_ =
false;
105 static MSPM0SPI* instance_map_[MAX_SPI_INSTANCES];
108#define MSPM0_SPI_INIT(name, dma_rx_name, dma_tx_name, rx_buffer_addr, rx_buffer_size, \
109 tx_buffer_addr, tx_buffer_size, dma_min_size) \
110 ::LibXR::MSPM0SPI::Resources{name##_INST, \
111 name##_INST_INT_IRQN, \
112 static_cast<uint32_t>(CPUCLK_FREQ), \
113 ::LibXR::MSPM0SPI::ResolveIndex(name##_INST_INT_IRQN), \
114 static_cast<uint8_t>(dma_rx_name##_CHAN_ID), \
115 static_cast<uint8_t>(dma_tx_name##_CHAN_ID)}, \
116 ::LibXR::RawData{(rx_buffer_addr), (rx_buffer_size)}, \
117 ::LibXR::RawData{(tx_buffer_addr), (tx_buffer_size)}, (dma_min_size)
常量原始数据封装类。 A class for encapsulating constant raw data.
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed 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 SetConfig(SPI::Configuration config) override
设置 SPI 配置参数。Sets SPI configuration parameters.
Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
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 ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW &op, bool in_isr=false) override
进行 SPI 读写操作。Performs SPI read and write operations.
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.
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(SPI)抽象类。Abstract class for Serial Peripheral Interface (SPI).
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
@ DIV_4
分频系数为 4。Division factor is 4.
WriteOperation OperationRW
定义读写操作类型的别名。Defines an alias for the read/write operation type.
@ LOW
时钟空闲时为低电平。Clock idle low.
@ OK
操作成功 | Operation successful
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.