/** * @brief Gets the current SD card data status. * @param None * @retval Data transfer state. */ uint8_t BSP_SD_GetCardState(void) { HAL_SD_CardStateTypedef card_state; card_state = HAL_SD_GetCardState(&uSdHandle); if (card_state == HAL_SD_CARD_TRANSFER) { return (SD_TRANSFER_OK); } else if ((card_state == HAL_SD_CARD_SENDING) || (card_state == HAL_SD_CARD_RECEIVING) || (card_state == HAL_SD_CARD_PROGRAMMING)) { return (SD_TRANSFER_BUSY); } else { return (SD_TRANSFER_ERROR); } }
STATIC HAL_StatusTypeDef sdcard_wait_finished(SD_HandleTypeDef *sd, uint32_t timeout) { // Wait for HAL driver to be ready (eg for DMA to finish) uint32_t start = HAL_GetTick(); for (;;) { // Do an atomic check of the state; WFI will exit even if IRQs are disabled uint32_t irq_state = disable_irq(); if (sd->State != HAL_SD_STATE_BUSY) { enable_irq(irq_state); break; } __WFI(); enable_irq(irq_state); if (HAL_GetTick() - start >= timeout) { return HAL_TIMEOUT; } } // Wait for SD card to complete the operation for (;;) { HAL_SD_CardStateTypedef state = HAL_SD_GetCardState(sd); if (state == HAL_SD_CARD_TRANSFER) { return HAL_OK; } if (!(state == HAL_SD_CARD_SENDING || state == HAL_SD_CARD_RECEIVING || state == HAL_SD_CARD_PROGRAMMING)) { return HAL_ERROR; } if (HAL_GetTick() - start >= timeout) { return HAL_TIMEOUT; } __WFI(); } return HAL_OK; }