3#include <ti/driverlib/dl_dma.h>
4#include <ti/driverlib/dl_spi.h>
7#include "ti_msp_dl_config.h"
30 uint8_t dma_rx_channel;
31 uint8_t dma_tx_channel;
35 uint32_t dma_enable_min_size = 3,
40 bool in_isr =
false)
override;
45 bool in_isr =
false)
override;
48 bool in_isr =
false)
override;
56 static void OnInterrupt(uint8_t index);
58 static constexpr uint8_t ResolveIndex(IRQn_Type irqn)
75 return INVALID_INSTANCE_INDEX;
80 enum class DmaMode : uint8_t
88 static constexpr uint8_t MAX_SPI_INSTANCES = 3;
89#elif defined(SPI1_BASE)
90 static constexpr uint8_t MAX_SPI_INSTANCES = 2;
92 static constexpr uint8_t MAX_SPI_INSTANCES = 1;
94 static constexpr uint8_t INVALID_INSTANCE_INDEX = 0xFF;
95 static constexpr uint32_t RX_ONLY_REPEAT_TX_MAX_FRAMES = 256U;
97 ErrorCode PollingTransfer(uint8_t* rx,
const uint8_t* tx, uint32_t len);
101 void StartDmaDuplex(uint32_t count);
103 void StartDmaRxOnly(uint32_t offset, uint32_t count);
105 void StartDmaTxOnly(uint32_t count);
109 void HandleInterrupt();
111 bool DmaBusy()
const;
114 uint32_t dma_enable_min_size_;
118 bool mem_read_ =
false;
119 DmaMode dma_mode_ = DmaMode::DUPLEX;
120 uint32_t masked_interrupts_for_tx_only_ = 0;
121 uint32_t rx_only_offset_ = 0;
122 uint32_t rx_only_remaining_ = 0;
123 volatile bool busy_ =
false;
125 static MSPM0SPI* instance_map_[MAX_SPI_INSTANCES];
136#define MSPM0_SPI_INIT(name, clock_hz, dma_rx_name, dma_tx_name, rx_buffer_addr, \
137 rx_buffer_size, tx_buffer_addr, tx_buffer_size, dma_min_size) \
138 ::LibXR::MSPM0SPI::Resources{name##_INST, \
139 name##_INST_INT_IRQN, \
140 static_cast<uint32_t>(clock_hz), \
141 ::LibXR::MSPM0SPI::ResolveIndex(name##_INST_INT_IRQN), \
142 static_cast<uint8_t>(dma_rx_name##_CHAN_ID), \
143 static_cast<uint8_t>(dma_tx_name##_CHAN_ID)}, \
144 ::LibXR::RawData{(rx_buffer_addr), (rx_buffer_size)}, \
145 ::LibXR::RawData{(tx_buffer_addr), (tx_buffer_size)}, (dma_min_size)
只读原始数据视图 / Immutable raw data view
MSPM0 SPI 控制器 / MSPM0 SPI controller.
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.
可写原始数据视图 / Mutable raw data view
串行外设接口(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.
LibXR 命名空间 / LibXR namespace.
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ OK
操作成功 / Operation successful
存储 SPI 配置参数的结构体。 Structure for storing SPI configuration parameters.