@@ -192,11 +192,7 @@ qspi_status_t qspi_init(qspi_t *obj, PinName io0, PinName io1, PinName io2, PinN
192
192
obj -> ssel = ssel ;
193
193
pinmap_pinout (ssel , PinMap_QSPI_SSEL );
194
194
195
- if (HAL_QSPI_Init (& obj -> handle ) != HAL_OK ) {
196
- return QSPI_STATUS_ERROR ;
197
- }
198
- qspi_frequency (obj , hz );
199
- return QSPI_STATUS_OK ;
195
+ return qspi_frequency (obj , hz );
200
196
}
201
197
202
198
qspi_status_t qspi_free (qspi_t * obj )
@@ -228,18 +224,29 @@ qspi_status_t qspi_frequency(qspi_t *obj, int hz)
228
224
{
229
225
qspi_status_t status = QSPI_STATUS_OK ;
230
226
231
- // HCLK drives QSPI
227
+ /* HCLK drives QSPI. QSPI clock depends on prescaler value:
228
+ * 0: Freq = HCLK
229
+ * 1: Freq = HCLK/2
230
+ * ...
231
+ * 255: Freq = HCLK/256 (minimum value)
232
+ */
233
+
232
234
int div = HAL_RCC_GetHCLKFreq () / hz ;
233
- if (div > 256 || div < 1 ) {
234
- status = QSPI_STATUS_INVALID_PARAMETER ;
235
- return status ;
235
+ if (div > 255 ) {
236
+ div = 255 ;
237
+ }
238
+ else {
239
+ if ((HAL_RCC_GetHCLKFreq () % hz ) == 0 ) {
240
+ div = div - 1 ;
241
+ }
236
242
}
237
243
238
- obj -> handle .Init .ClockPrescaler = div - 1 ;
244
+ obj -> handle .Init .ClockPrescaler = div ;
239
245
240
246
if (HAL_QSPI_Init (& obj -> handle ) != HAL_OK ) {
241
247
status = QSPI_STATUS_ERROR ;
242
248
}
249
+
243
250
return status ;
244
251
}
245
252
@@ -253,11 +260,11 @@ qspi_status_t qspi_write(qspi_t *obj, const qspi_command_t *command, const void
253
260
254
261
if (HAL_QSPI_Command (& obj -> handle , & st_command , HAL_QPSI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
255
262
status = QSPI_STATUS_ERROR ;
256
- return status ;
257
263
}
258
-
259
- if (HAL_QSPI_Transmit (& obj -> handle , (uint8_t * )data , HAL_QPSI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
260
- status = QSPI_STATUS_ERROR ;
264
+ else {
265
+ if (HAL_QSPI_Transmit (& obj -> handle , (uint8_t * )data , HAL_QPSI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
266
+ status = QSPI_STATUS_ERROR ;
267
+ }
261
268
}
262
269
263
270
return status ;
@@ -273,11 +280,11 @@ qspi_status_t qspi_read(qspi_t *obj, const qspi_command_t *command, void *data,
273
280
274
281
if (HAL_QSPI_Command (& obj -> handle , & st_command , HAL_QPSI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
275
282
status = QSPI_STATUS_ERROR ;
276
- return status ;
277
283
}
278
-
279
- if (HAL_QSPI_Receive (& obj -> handle , data , HAL_QPSI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
280
- status = QSPI_STATUS_ERROR ;
284
+ else {
285
+ if (HAL_QSPI_Receive (& obj -> handle , data , HAL_QPSI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
286
+ status = QSPI_STATUS_ERROR ;
287
+ }
281
288
}
282
289
283
290
return status ;
0 commit comments