/** * @brief Reads block(s) from a specified address in an SD card, in DMA mode. * @param pData: Pointer to the buffer that will contain the data to transmit * @param ReadAddr: Address from where data is to be read * @param NumOfBlocks: Number of SD blocks to read * @retval SD status */ uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks) { HAL_StatusTypeDef sd_state = HAL_OK; /* Invalidate the dma tx handle*/ uSdHandle.hdmatx = NULL; /* Prepare the dma channel for a read operation */ sd_state = SD_DMAConfigRx(&uSdHandle); if (sd_state == HAL_OK) { /* Read block(s) in DMA transfer mode */ sd_state = HAL_SD_ReadBlocks_DMA(&uSdHandle, (uint8_t *)pData, ReadAddr, NumOfBlocks); } if (sd_state == HAL_OK) { return MSD_OK; } else { return MSD_ERROR; } }
/** * @brief Reads block(s) from a specified address in an SD card, in DMA mode. * @param pData: Pointer to the buffer that will contain the data to transmit * @param ReadAddr: Address from where data is to be read * @param BlockSize: SD card data block size, that should be 512 * @param NumOfBlocks: Number of SD blocks to read * @retval SD status */ uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks) { uint8_t state = MSD_OK; /* Invalidate the dma tx handle*/ uSdHandle.hdmatx = NULL; /* Prepare the dma channel for a read operation */ state = ((SD_DMAConfigRx(&uSdHandle) == SD_OK) ? MSD_OK : MSD_ERROR); if(state == MSD_OK) { /* Read block(s) in DMA transfer mode */ state = ((HAL_SD_ReadBlocks_DMA(&uSdHandle, pData, ReadAddr, BlockSize, NumOfBlocks) == SD_OK) ? MSD_OK : MSD_ERROR); /* Wait until transfer is complete */ if(state == MSD_OK) { state = ((HAL_SD_CheckReadOperation(&uSdHandle, (uint32_t)SD_DATATIMEOUT) == SD_OK) ? MSD_OK : MSD_ERROR); } } return state; }