STM32F1: Fix SDIO read errors (#18228)
This commit is contained in:
		| @@ -101,8 +101,24 @@ bool SDIO_ReadBlock_DMA(uint32_t blockAddress, uint8_t *data) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) {} | ||||
|   while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) { /* wait */ } | ||||
|    | ||||
|   //If there were SDIO errors, do not wait DMA. | ||||
|   if (SDIO->STA & SDIO_STA_TRX_ERROR_FLAGS) { | ||||
|     SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); | ||||
|     dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); | ||||
|     return false; | ||||
| 	} | ||||
|  | ||||
|   //Wait for DMA transaction to complete | ||||
|   while ((DMA2_BASE->ISR & (DMA_ISR_TEIF4|DMA_ISR_TCIF4)) == 0 ) { /* wait */ } | ||||
|  | ||||
|   if (DMA2_BASE->ISR & DMA_ISR_TEIF4) { | ||||
|     dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); | ||||
|     SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); | ||||
|     return false; | ||||
|   } | ||||
|    | ||||
|   dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); | ||||
|  | ||||
|   if (SDIO->STA & SDIO_STA_RXDAVL) { | ||||
| @@ -146,7 +162,7 @@ bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) { | ||||
|  | ||||
|   sdio_setup_transfer(SDIO_DATA_TIMEOUT * (F_CPU / 1000U), 512U, SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN); | ||||
|  | ||||
|   while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) {} | ||||
|   while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) { /* wait */ } | ||||
|  | ||||
|   dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user