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