libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
mspm0_spi.hpp
1#pragma once
2
3#include <ti/driverlib/dl_dma.h>
4#include <ti/driverlib/dl_spi.h>
5
6#include "spi.hpp"
7#include "ti_msp_dl_config.h"
8
9namespace LibXR
10{
11
12class MSPM0SPI : public SPI
13{
14 public:
15 struct Resources
16 {
17 SPI_Regs* instance;
18 IRQn_Type irqn;
19 uint32_t clock_freq;
20 uint8_t index;
21 uint8_t dma_rx_channel;
22 uint8_t dma_tx_channel;
23 };
24
25 MSPM0SPI(Resources res, RawData dma_rx_buffer, RawData dma_tx_buffer,
26 uint32_t dma_enable_min_size = 3,
28 SPI::Prescaler::DIV_4, false});
29
30 ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW& op,
31 bool in_isr = false) override;
32
33 ErrorCode SetConfig(SPI::Configuration config) override;
34
35 ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW& op,
36 bool in_isr = false) override;
37
38 ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW& op,
39 bool in_isr = false) override;
40
41 uint32_t GetMaxBusSpeed() const override;
42
43 Prescaler GetMaxPrescaler() const override;
44
45 ErrorCode Transfer(size_t size, OperationRW& op, bool in_isr = false) override;
46
47 static void OnInterrupt(uint8_t index);
48
49 static constexpr uint8_t ResolveIndex(IRQn_Type irqn)
50 {
51 switch (irqn)
52 {
53#if defined(SPI0_BASE)
54 case SPI0_INT_IRQn:
55 return 0;
56#endif
57#if defined(SPI1_BASE)
58 case SPI1_INT_IRQn:
59 return 1;
60#endif
61#if defined(SPI2_BASE)
62 case SPI2_INT_IRQn:
63 return 2;
64#endif
65 default:
66 return INVALID_INSTANCE_INDEX;
67 }
68 }
69
70 private:
71 enum class DmaMode : uint8_t
72 {
73 DUPLEX,
74 RX_ONLY,
75 TX_ONLY
76 };
77
78#if defined(SPI2_BASE)
79 static constexpr uint8_t MAX_SPI_INSTANCES = 3;
80#elif defined(SPI1_BASE)
81 static constexpr uint8_t MAX_SPI_INSTANCES = 2;
82#else
83 static constexpr uint8_t MAX_SPI_INSTANCES = 1;
84#endif
85 static constexpr uint8_t INVALID_INSTANCE_INDEX = 0xFF;
86 static constexpr uint32_t RX_ONLY_REPEAT_TX_MAX_FRAMES = 256U;
87
88 ErrorCode PollingTransfer(uint8_t* rx, const uint8_t* tx, uint32_t len);
89
90 ErrorCode CompleteDmaOperation(OperationRW& op, bool in_isr);
91
92 void StartDmaDuplex(uint32_t count);
93
94 void StartDmaRxOnly(uint32_t offset, uint32_t count);
95
96 void StartDmaTxOnly(uint32_t count);
97
98 void StopDma();
99
100 void HandleInterrupt();
101
102 bool DmaBusy() const;
103
104 Resources res_;
105 uint32_t dma_enable_min_size_;
106 OperationRW rw_op_;
107 volatile ErrorCode dma_result_ = ErrorCode::OK;
108 RawData read_buff_;
109 bool mem_read_ = false;
110 DmaMode dma_mode_ = DmaMode::DUPLEX;
111 uint32_t masked_interrupts_for_tx_only_ = 0;
112 uint32_t rx_only_offset_ = 0;
113 uint32_t rx_only_remaining_ = 0;
114 volatile bool busy_ = false;
115
116 static MSPM0SPI* instance_map_[MAX_SPI_INSTANCES];
117};
118
119#define MSPM0_SPI_INIT(name, dma_rx_name, dma_tx_name, rx_buffer_addr, rx_buffer_size, \
120 tx_buffer_addr, tx_buffer_size, dma_min_size) \
121 ::LibXR::MSPM0SPI::Resources{name##_INST, \
122 name##_INST_INT_IRQN, \
123 static_cast<uint32_t>(CPUCLK_FREQ), \
124 ::LibXR::MSPM0SPI::ResolveIndex(name##_INST_INT_IRQN), \
125 static_cast<uint8_t>(dma_rx_name##_CHAN_ID), \
126 static_cast<uint8_t>(dma_tx_name##_CHAN_ID)}, \
127 ::LibXR::RawData{(rx_buffer_addr), (rx_buffer_size)}, \
128 ::LibXR::RawData{(tx_buffer_addr), (tx_buffer_size)}, (dma_min_size)
129
130} // namespace LibXR
只读原始数据视图 / Immutable raw data view
uint32_t GetMaxBusSpeed() const override
获取 SPI 设备的最大时钟速度。Gets the maximum clock speed of the SPI device.
Definition mspm0_spi.cpp:76
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.
Definition mspm0_spi.cpp:43
Prescaler GetMaxPrescaler() const override
获取 SPI 设备的最大分频系数。Gets the maximum prescaler of the SPI device.
Definition mspm0_spi.cpp:78
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).
Definition spi.hpp:14
@ 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.
Definition spi.hpp:63
@ LOW
时钟空闲时为低电平。Clock idle low.
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
@ OK
操作成功 | Operation successful
存储 SPI 配置参数的结构体。Structure for storing SPI configuration parameters.
Definition spi.hpp:85