mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: targets/TARGET_STM/qspi_api.c
- Revision:
- 189:f392fc9709a3
- Parent:
- 188:bcfe06ba3d64
--- a/targets/TARGET_STM/qspi_api.c Thu Nov 08 11:46:34 2018 +0000 +++ b/targets/TARGET_STM/qspi_api.c Wed Feb 20 22:31:08 2019 +0000 @@ -38,7 +38,7 @@ /* hence 2^(31+1), then FLASH_SIZE_DEFAULT = 1<<31 */ #define QSPI_FLASH_SIZE_DEFAULT 0x80000000 -void qspi_prepare_command(const qspi_command_t *command, QSPI_CommandTypeDef *st_command) +void qspi_prepare_command(const qspi_command_t *command, QSPI_CommandTypeDef *st_command) { // TODO: shift these around to get more dynamic mapping switch (command->instruction.bus_width) { @@ -57,7 +57,7 @@ } st_command->Instruction = command->instruction.value; - st_command->DummyCycles = command->dummy_count, + st_command->DummyCycles = command->dummy_count; // these are target specific settings, use default values st_command->SIOOMode = QSPI_SIOO_INST_EVERY_CMD; st_command->DdrMode = QSPI_DDR_MODE_DISABLE; @@ -134,7 +134,7 @@ qspi_status_t qspi_init(qspi_t *obj, PinName io0, PinName io1, PinName io2, PinName io3, PinName sclk, PinName ssel, uint32_t hz, uint8_t mode) { // Enable interface clock for QSPI - __HAL_RCC_QSPI_CLK_ENABLE(); + __HAL_RCC_QSPI_CLK_ENABLE(); // Reset QSPI __HAL_RCC_QSPI_FORCE_RESET(); @@ -170,7 +170,7 @@ QSPIName qspi_data_third = (QSPIName)pinmap_merge(qspiclkname, qspisselname); if (qspi_data_first != qspi_data_second || qspi_data_second != qspi_data_third || - qspi_data_first != qspi_data_third) { + qspi_data_first != qspi_data_third) { return QSPI_STATUS_INVALID_PARAMETER; } @@ -192,16 +192,12 @@ obj->ssel = ssel; pinmap_pinout(ssel, PinMap_QSPI_SSEL); - if (HAL_QSPI_Init(&obj->handle) != HAL_OK) { - return QSPI_STATUS_ERROR; - } - qspi_frequency(obj, hz); - return QSPI_STATUS_OK; + return qspi_frequency(obj, hz); } qspi_status_t qspi_free(qspi_t *obj) { - if(HAL_QSPI_DeInit(&obj->handle) != HAL_OK) { + if (HAL_QSPI_DeInit(&obj->handle) != HAL_OK) { return QSPI_STATUS_ERROR; } @@ -228,18 +224,28 @@ { 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; - if (div > 256 || div < 1) { - status = QSPI_STATUS_INVALID_PARAMETER; - return status; + if (div > 255) { + div = 255; + } 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) { status = QSPI_STATUS_ERROR; } + return status; } @@ -253,11 +259,10 @@ if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { status = QSPI_STATUS_ERROR; - return status; - } - - if (HAL_QSPI_Transmit(&obj->handle, (uint8_t *)data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { - status = QSPI_STATUS_ERROR; + } else { + if (HAL_QSPI_Transmit(&obj->handle, (uint8_t *)data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { + status = QSPI_STATUS_ERROR; + } } return status; @@ -273,11 +278,10 @@ if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { status = QSPI_STATUS_ERROR; - return status; - } - - if (HAL_QSPI_Receive(&obj->handle, data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { - status = QSPI_STATUS_ERROR; + } else { + if (HAL_QSPI_Receive(&obj->handle, data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { + status = QSPI_STATUS_ERROR; + } } return status; @@ -293,7 +297,7 @@ qspi_prepare_command(command, &st_command); st_command.NbData = 1; - st_command.DataMode = QSPI_DATA_NONE; /* Instruction only */ + st_command.DataMode = QSPI_DATA_NONE; /* Instruction only */ if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { status = QSPI_STATUS_ERROR; return status;