@@ -80,14 +80,30 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
80
80
MBED_ASSERT (obj -> spi != (SPIName )NC );
81
81
82
82
// Enable SPI clock
83
+ if (obj -> spi == SPI_1 ) {
84
+ __HAL_RCC_SPI1_CLK_ENABLE ();
85
+ }
86
+
83
87
if (obj -> spi == SPI_2 ) {
84
88
__HAL_RCC_SPI2_CLK_ENABLE ();
85
89
}
86
90
91
+ if (obj -> spi == SPI_3 ) {
92
+ __HAL_RCC_SPI3_CLK_ENABLE ();
93
+ }
94
+
95
+ if (obj -> spi == SPI_4 ) {
96
+ __HAL_RCC_SPI4_CLK_ENABLE ();
97
+ }
98
+
87
99
if (obj -> spi == SPI_5 ) {
88
100
__HAL_RCC_SPI5_CLK_ENABLE ();
89
101
}
90
102
103
+ if (obj -> spi == SPI_6 ) {
104
+ __HAL_RCC_SPI6_CLK_ENABLE ();
105
+ }
106
+
91
107
// Configure the SPI pins
92
108
pinmap_pinout (mosi , PinMap_SPI_MOSI );
93
109
pinmap_pinout (miso , PinMap_SPI_MISO );
@@ -116,18 +132,42 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
116
132
void spi_free (spi_t * obj )
117
133
{
118
134
// Reset SPI and disable clock
135
+ if (obj -> spi == SPI_1 ) {
136
+ __HAL_RCC_SPI1_FORCE_RESET ();
137
+ __HAL_RCC_SPI1_RELEASE_RESET ();
138
+ __HAL_RCC_SPI1_CLK_DISABLE ();
139
+ }
140
+
119
141
if (obj -> spi == SPI_2 ) {
120
142
__HAL_RCC_SPI2_FORCE_RESET ();
121
143
__HAL_RCC_SPI2_RELEASE_RESET ();
122
144
__HAL_RCC_SPI2_CLK_DISABLE ();
123
145
}
124
146
147
+ if (obj -> spi == SPI_3 ) {
148
+ __HAL_RCC_SPI3_FORCE_RESET ();
149
+ __HAL_RCC_SPI3_RELEASE_RESET ();
150
+ __HAL_RCC_SPI3_CLK_DISABLE ();
151
+ }
152
+
153
+ if (obj -> spi == SPI_4 ) {
154
+ __HAL_RCC_SPI4_FORCE_RESET ();
155
+ __HAL_RCC_SPI4_RELEASE_RESET ();
156
+ __HAL_RCC_SPI4_CLK_DISABLE ();
157
+ }
158
+
125
159
if (obj -> spi == SPI_5 ) {
126
160
__HAL_RCC_SPI5_FORCE_RESET ();
127
161
__HAL_RCC_SPI5_RELEASE_RESET ();
128
162
__HAL_RCC_SPI5_CLK_DISABLE ();
129
163
}
130
164
165
+ if (obj -> spi == SPI_6 ) {
166
+ __HAL_RCC_SPI6_FORCE_RESET ();
167
+ __HAL_RCC_SPI6_RELEASE_RESET ();
168
+ __HAL_RCC_SPI6_CLK_DISABLE ();
169
+ }
170
+
131
171
// Configure GPIOs
132
172
pin_function (obj -> pin_miso , STM_PIN_DATA (STM_MODE_INPUT , GPIO_NOPULL , 0 ));
133
173
pin_function (obj -> pin_mosi , STM_PIN_DATA (STM_MODE_INPUT , GPIO_NOPULL , 0 ));
@@ -175,9 +215,33 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
175
215
void spi_frequency (spi_t * obj , int hz )
176
216
{
177
217
// The frequencies are obtained with:
178
- // - SPI2 clock = 54 MHz (APB1 clock)
179
- // - SPI5 clock = 108 MHz (APB2 clock)
180
- if (obj -> spi == SPI_2 ) {
218
+ // - SPI2/SPI3 clock = 54 MHz (APB1 clock)
219
+ // - SPI1/SPI4/SPI5/SPI6 clocks = 108 MHz (APB2 clock)
220
+ switch (obj -> spi ) {
221
+ case SPI_1 :
222
+ case SPI_4 :
223
+ case SPI_5 :
224
+ case SPI_6 :
225
+ if (hz < 800000 ) {
226
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_256 ; // 422 kHz
227
+ } else if ((hz >= 800000 ) && (hz < 1000000 )) {
228
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_128 ; // 844 kHz
229
+ } else if ((hz >= 1000000 ) && (hz < 3000000 )) {
230
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_64 ; // 1.69 MHz
231
+ } else if ((hz >= 3000000 ) && (hz < 6000000 )) {
232
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_32 ; // 3.38 MHz
233
+ } else if ((hz >= 6000000 ) && (hz < 12000000 )) {
234
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_16 ; // 6.75 MHz
235
+ } else if ((hz >= 12000000 ) && (hz < 24000000 )) {
236
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_8 ; // 13.5 MHz
237
+ } else if ((hz >= 24000000 ) && (hz < 54000000 )) {
238
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_4 ; // 27 MHz
239
+ } else { // >= 54000000
240
+ obj -> br_presc = SPI_BAUDRATEPRESCALER_2 ; // 54 MHz
241
+ }
242
+ break ;
243
+ case SPI_2 :
244
+ case SPI_3 :
181
245
if (hz < 400000 ) {
182
246
obj -> br_presc = SPI_BAUDRATEPRESCALER_256 ; // 211 kHz
183
247
} else if ((hz >= 400000 ) && (hz < 800000 )) {
@@ -195,27 +259,11 @@ void spi_frequency(spi_t *obj, int hz)
195
259
} else { // >= 24000000
196
260
obj -> br_presc = SPI_BAUDRATEPRESCALER_2 ; // 27 MHz
197
261
}
198
- } else if (obj -> spi == SPI_5 ) {
199
- if (hz < 800000 ) {
200
- obj -> br_presc = SPI_BAUDRATEPRESCALER_256 ; // 422 kHz
201
- } else if ((hz >= 800000 ) && (hz < 1000000 )) {
202
- obj -> br_presc = SPI_BAUDRATEPRESCALER_128 ; // 844 kHz
203
- } else if ((hz >= 1000000 ) && (hz < 3000000 )) {
204
- obj -> br_presc = SPI_BAUDRATEPRESCALER_64 ; // 1.69 MHz
205
- } else if ((hz >= 3000000 ) && (hz < 6000000 )) {
206
- obj -> br_presc = SPI_BAUDRATEPRESCALER_32 ; // 3.38 MHz
207
- } else if ((hz >= 6000000 ) && (hz < 12000000 )) {
208
- obj -> br_presc = SPI_BAUDRATEPRESCALER_16 ; // 6.75 MHz
209
- } else if ((hz >= 12000000 ) && (hz < 24000000 )) {
210
- obj -> br_presc = SPI_BAUDRATEPRESCALER_8 ; // 13.5 MHz
211
- } else if ((hz >= 24000000 ) && (hz < 54000000 )) {
212
- obj -> br_presc = SPI_BAUDRATEPRESCALER_4 ; // 27 MHz
213
- } else { // >= 54000000
214
- obj -> br_presc = SPI_BAUDRATEPRESCALER_2 ; // 54 MHz
215
- }
216
- } else {
262
+ break ;
263
+ default :
217
264
return ;
218
265
}
266
+
219
267
init_spi (obj );
220
268
}
221
269
0 commit comments