STM32 QSPI: frequency calculation update

pull/9208/head
jeromecoutant 2018-11-27 18:10:10 +01:00 committed by Cruz Monrreal II
parent 2514a71abf
commit 5a27a9a699
1 changed files with 25 additions and 18 deletions

View File

@ -192,11 +192,7 @@ qspi_status_t qspi_init(qspi_t *obj, PinName io0, PinName io1, PinName io2, PinN
obj->ssel = ssel; obj->ssel = ssel;
pinmap_pinout(ssel, PinMap_QSPI_SSEL); pinmap_pinout(ssel, PinMap_QSPI_SSEL);
if (HAL_QSPI_Init(&obj->handle) != HAL_OK) { return qspi_frequency(obj, hz);
return QSPI_STATUS_ERROR;
}
qspi_frequency(obj, hz);
return QSPI_STATUS_OK;
} }
qspi_status_t qspi_free(qspi_t *obj) qspi_status_t qspi_free(qspi_t *obj)
@ -228,18 +224,29 @@ qspi_status_t qspi_frequency(qspi_t *obj, int hz)
{ {
qspi_status_t status = QSPI_STATUS_OK; qspi_status_t status = QSPI_STATUS_OK;
// HCLK drives QSPI /* HCLK drives QSPI. QSPI clock depends on prescaler value:
* 0: Freq = HCLK
* 1: Freq = HCLK/2
* ...
* 255: Freq = HCLK/256 (minimum value)
*/
int div = HAL_RCC_GetHCLKFreq() / hz; int div = HAL_RCC_GetHCLKFreq() / hz;
if (div > 256 || div < 1) { if (div > 255) {
status = QSPI_STATUS_INVALID_PARAMETER; div = 255;
return status; }
else {
if ((HAL_RCC_GetHCLKFreq() % hz) == 0) {
div = div - 1;
}
} }
obj->handle.Init.ClockPrescaler = div - 1; obj->handle.Init.ClockPrescaler = div;
if (HAL_QSPI_Init(&obj->handle) != HAL_OK) { if (HAL_QSPI_Init(&obj->handle) != HAL_OK) {
status = QSPI_STATUS_ERROR; status = QSPI_STATUS_ERROR;
} }
return status; return status;
} }
@ -253,11 +260,11 @@ qspi_status_t qspi_write(qspi_t *obj, const qspi_command_t *command, const void
if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
status = QSPI_STATUS_ERROR; status = QSPI_STATUS_ERROR;
return status;
} }
else {
if (HAL_QSPI_Transmit(&obj->handle, (uint8_t *)data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { if (HAL_QSPI_Transmit(&obj->handle, (uint8_t *)data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
status = QSPI_STATUS_ERROR; status = QSPI_STATUS_ERROR;
}
} }
return status; return status;
@ -273,11 +280,11 @@ qspi_status_t qspi_read(qspi_t *obj, const qspi_command_t *command, void *data,
if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
status = QSPI_STATUS_ERROR; status = QSPI_STATUS_ERROR;
return status;
} }
else {
if (HAL_QSPI_Receive(&obj->handle, data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { if (HAL_QSPI_Receive(&obj->handle, data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
status = QSPI_STATUS_ERROR; status = QSPI_STATUS_ERROR;
}
} }
return status; return status;