18 dma_buff_rx_(dma_rx),
19 dma_buff_tx_(dma_tx),
20 instance_(CH32_SPI_GetInstanceID(id)),
21 dma_rx_channel_(CH32_SPI_RX_DMA_CHANNEL_MAP[id]),
22 dma_tx_channel_(CH32_SPI_TX_DMA_CHANNEL_MAP[id]),
23 id_(id),
24 dma_enable_min_size_(dma_enable_min_size),
25 mode_(master_mode ? SPI_Mode_Master : SPI_Mode_Slave),
26 datasize_(SPI_DataSize_8b),
27 firstbit_(firstbit_msb ? SPI_FirstBit_MSB : SPI_FirstBit_LSB),
28 prescaler_(prescaler),
29 sck_port_(sck_port),
30 sck_pin_(sck_pin),
31 miso_port_(miso_port),
32 miso_pin_(miso_pin),
33 mosi_port_(mosi_port),
34 mosi_pin_(mosi_pin)
35{
36 ASSERT(instance_ != nullptr);
37 ASSERT(dma_buff_tx_.
size_ >= 1);
38
39 ASSERT(dma_buff_rx_.
size_ >= 1);
40
41 map[id] = this;
42
43
44 if (CH32_SPI_APB_MAP[id] == 1)
45 {
46 RCC_APB1PeriphClockCmd(CH32_SPI_RCC_PERIPH_MAP[id], ENABLE);
47 }
48 else if (CH32_SPI_APB_MAP[id] == 2)
49 {
50 RCC_APB2PeriphClockCmd(CH32_SPI_RCC_PERIPH_MAP[id], ENABLE);
51 }
52 else
53 {
54 ASSERT(false);
55 }
56 RCC_AHBPeriphClockCmd(CH32_SPI_RCC_PERIPH_MAP_DMA[id], ENABLE);
57
58
59 {
60 GPIO_InitTypeDef gpio = {};
61 gpio.GPIO_Speed = GPIO_Speed_50MHz;
62
63
64 RCC_APB2PeriphClockCmd(CH32GetGPIOPeriph(sck_port_), ENABLE);
65 if (mode_ == SPI_Mode_Master)
66 {
67 gpio.GPIO_Pin = sck_pin_;
68 gpio.GPIO_Mode = GPIO_Mode_AF_PP;
69 }
70 else
71 {
72 gpio.GPIO_Pin = sck_pin_;
73 gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
74 }
75 GPIO_Init(sck_port_, &gpio);
76
77
78 RCC_APB2PeriphClockCmd(CH32GetGPIOPeriph(miso_port_), ENABLE);
79 if (mode_ == SPI_Mode_Master)
80 {
81 gpio.GPIO_Pin = miso_pin_;
82 gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
83 }
84 else
85 {
86 gpio.GPIO_Pin = miso_pin_;
87 gpio.GPIO_Mode = GPIO_Mode_AF_PP;
88 }
89 GPIO_Init(miso_port_, &gpio);
90
91
92 RCC_APB2PeriphClockCmd(CH32GetGPIOPeriph(mosi_port_), ENABLE);
93 if (mode_ == SPI_Mode_Master)
94 {
95 gpio.GPIO_Pin = mosi_pin_;
96 gpio.GPIO_Mode = GPIO_Mode_AF_PP;
97 }
98 else
99 {
100 gpio.GPIO_Pin = mosi_pin_;
101 gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
102 }
103 GPIO_Init(mosi_port_, &gpio);
104
105 if (pin_remap != 0)
106 {
107 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
108 GPIO_PinRemapConfig(pin_remap, ENABLE);
109 }
110 }
111
112
113 {
114 SPI_InitTypeDef init = {};
115 init.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
116 init.SPI_Mode = mode_;
117 init.SPI_DataSize = datasize_;
118 init.SPI_CPOL =
120 init.SPI_CPHA =
122 init.SPI_NSS = nss_;
123 init.SPI_BaudRatePrescaler = prescaler_;
124 init.SPI_FirstBit = firstbit_;
125 init.SPI_CRCPolynomial = 7;
126
127 SPI_Init(instance_, &init);
128 SPI_Cmd(instance_, ENABLE);
129 }
130
131
132 {
133
134 {
135 ch32_dma_callback_t cb = [](void *arg)
136 {
reinterpret_cast<CH32SPI *
>(arg)->RxDmaIRQHandler(); };
137 CH32_DMA_RegisterCallback(CH32_DMA_GetID(dma_rx_channel_), cb, this);
138
139 DMA_InitTypeDef di = {};
140 DMA_DeInit(dma_rx_channel_);
141 di.DMA_PeripheralBaseAddr = (uint32_t)&instance_->DATAR;
142 di.DMA_MemoryBaseAddr = (uint32_t)dma_buff_rx_.
addr_;
143 di.DMA_DIR = DMA_DIR_PeripheralSRC;
144 di.DMA_BufferSize = 0;
145 di.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
146 di.DMA_MemoryInc = DMA_MemoryInc_Enable;
147 di.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
148 di.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
149 di.DMA_Mode = DMA_Mode_Normal;
150 di.DMA_Priority = DMA_Priority_High;
151 di.DMA_M2M = DMA_M2M_Disable;
152 DMA_Init(dma_rx_channel_, &di);
153 DMA_ITConfig(dma_rx_channel_, DMA_IT_TC, ENABLE);
154 NVIC_EnableIRQ(CH32_DMA_IRQ_MAP[CH32_DMA_GetID(dma_rx_channel_)]);
155 }
156
157 {
158 ch32_dma_callback_t cb = [](void *arg)
159 {
reinterpret_cast<CH32SPI *
>(arg)->TxDmaIRQHandler(); };
160 CH32_DMA_RegisterCallback(CH32_DMA_GetID(dma_tx_channel_), cb, this);
161
162 DMA_InitTypeDef di = {};
163 DMA_DeInit(dma_tx_channel_);
164 di.DMA_PeripheralBaseAddr = (uint32_t)&instance_->DATAR;
165 di.DMA_MemoryBaseAddr = 0;
166 di.DMA_DIR = DMA_DIR_PeripheralDST;
167 di.DMA_BufferSize = 0;
168 di.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
169 di.DMA_MemoryInc = DMA_MemoryInc_Enable;
170 di.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
171 di.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
172 di.DMA_Mode = DMA_Mode_Normal;
173 di.DMA_Priority = DMA_Priority_VeryHigh;
174 di.DMA_M2M = DMA_M2M_Disable;
175 DMA_Init(dma_tx_channel_, &di);
176 DMA_ITConfig(dma_tx_channel_, DMA_IT_TC, ENABLE);
177 NVIC_EnableIRQ(CH32_DMA_IRQ_MAP[CH32_DMA_GetID(dma_tx_channel_)]);
178 }
179 }
180}
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
@ EDGE_1
在第一个时钟边沿采样数据。Data sampled on the first clock edge.
SPI()
默认构造函数。Default constructor.
@ LOW
时钟空闲时为低电平。Clock idle low.
ClockPhase clock_phase
SPI 时钟相位。SPI clock phase.
ClockPolarity clock_polarity
SPI 时钟极性。SPI clock polarity.