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#include "spi.hpp"
6#include "ti_msp_dl_config.h"
7
8namespace LibXR
9{
10
11class MSPM0SPI : public SPI
12{
13 public:
14 struct Resources
15 {
16 SPI_Regs* instance;
17 IRQn_Type irqn;
18 uint32_t clock_freq;
19 uint8_t index;
20 uint8_t dma_rx_channel;
21 uint8_t dma_tx_channel;
22 };
23
24 MSPM0SPI(Resources res, RawData dma_rx_buffer, RawData dma_tx_buffer,
25 uint32_t dma_enable_min_size = 3,
27 SPI::Prescaler::DIV_4, false});
28
29 ErrorCode ReadAndWrite(RawData read_data, ConstRawData write_data, OperationRW& op,
30 bool in_isr = false) override;
31
32 ErrorCode SetConfig(SPI::Configuration config) override;
33
34 ErrorCode MemRead(uint16_t reg, RawData read_data, OperationRW& op,
35 bool in_isr = false) override;
36
37 ErrorCode MemWrite(uint16_t reg, ConstRawData write_data, OperationRW& op,
38 bool in_isr = false) override;
39
40 uint32_t GetMaxBusSpeed() const override;
41
42 Prescaler GetMaxPrescaler() const override;
43
44 ErrorCode Transfer(size_t size, OperationRW& op, bool in_isr = false) override;
45
46 static void OnInterrupt(uint8_t index);
47
48 static constexpr uint8_t ResolveIndex(IRQn_Type irqn)
49 {
50 switch (irqn)
51 {
52#if defined(SPI0_BASE)
53 case SPI0_INT_IRQn:
54 return 0;
55#endif
56#if defined(SPI1_BASE)
57 case SPI1_INT_IRQn:
58 return 1;
59#endif
60 default:
61 return INVALID_INSTANCE_INDEX;
62 }
63 }
64
65 private:
66 enum class DmaMode : uint8_t
67 {
68 DUPLEX,
69 RX_ONLY,
70 TX_ONLY
71 };
72
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;
76
77 ErrorCode PollingTransfer(uint8_t* rx, const uint8_t* tx, uint32_t len);
78
79 ErrorCode CompleteDmaOperation(OperationRW& op, bool in_isr);
80
81 void StartDmaDuplex(uint32_t count);
82
83 void StartDmaRxOnly(uint32_t offset, uint32_t count);
84
85 void StartDmaTxOnly(uint32_t count);
86
87 void StopDma();
88
89 void HandleInterrupt();
90
91 bool DmaBusy() const;
92
93 Resources res_;
94 uint32_t dma_enable_min_size_;
95 OperationRW rw_op_;
96 volatile ErrorCode dma_result_ = ErrorCode::OK;
97 RawData read_buff_;
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;
104
105 static MSPM0SPI* instance_map_[MAX_SPI_INSTANCES];
106};
107
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)
118
119} // namespace LibXR
常量原始数据封装类。 A class for encapsulating constant raw data.
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.
原始数据封装类。 A class for encapsulating raw data.
串行外设接口(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