STM32F767Zi HAL库SDMMC使用DMA方式写入数据异常
本帖最后由 caojin85cn 于 2018-2-20 21:46 编辑环境:WIN7 64bit + MDK5.20
硬件:stm32F7 Nucleo (F767Zi)
STM32F7xx_DFP版本2.9.0(目前最新的)
SDMMC配置参数
SDHandle_SDMMC.Instance = SDMMC2;
SDHandle_SDMMC.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
SDHandle_SDMMC.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
SDHandle_SDMMC.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
SDHandle_SDMMC.Init.BusWide = SDMMC_BUS_WIDE_1B;
SDHandle_SDMMC.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;
SDHandle_SDMMC.Init.ClockDiv = 10; //4MhzSDMMC中断
HAL_NVIC_SetPriority(SDMMC2_IRQn, 3, 1);
HAL_NVIC_EnableIRQ(SDMMC2_IRQn);
DMA中断HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
目前的问题是
使用HAL库提供的函数:HAL_SD_WriteBlocks_DMA
直接写一个块或者多个块,函数返回值正常,也可以进入DMA传输完成中断,DMA也未报错
但是后续在读取数据时发现之前写入的数据全部都是0
而如果调用非DMA方式写入函数:HAL_SD_WriteBlocks 做同样的写入操作,则结果正常,后续读取数据也是和写入的一致
简单来说,就是通过DMA方式写入SD卡的数据全都是0
还求各位给点意见,可能是什么地方的问题?如何定位?
最近发现2.9.0版本的HAL库在SDMMC方面有一些Bug,会不会导致这个结果?
补充:DMA的读取结果是正常的
DMA配置参数
hdma_sdmmc.Instance = DMA2_Stream5;
hdma_sdmmc.Init.Channel = DMA_CHANNEL_11;
hdma_sdmmc.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_sdmmc.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdmmc.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdmmc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdmmc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdmmc.Init.Mode = DMA_SxCR_PFCTRL;
hdma_sdmmc.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_sdmmc.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_sdmmc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_sdmmc.Init.MemBurst = DMA_MBURST_INC4;
hdma_sdmmc.Init.PeriphBurst = DMA_PBURST_INC4;
本帖最后由 caojin85cn 于 2018-2-20 21:45 编辑
SD卡是Lexar 16G Class6 这个问题应该和SD卡无关,试过sony和kingston一样的结果
SDMMC1和SDMMC2都试过,结果一样
DMA2 Channel4 Stream3 Stream6
DMA2 Channel11 Stream0 Stream5
都试过,也是一样的结果
已解决,Cache数据一致性问题 老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA之后然后顺便把while(BSP_SD_GetCardState()!= MSD_OK)注释了,f_open就返回说没有文件系统了,有点费解 DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
uint32_t timeout = 100000;
if((unsigned int)buff % 4)
{
buff = buff;
}
if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
(uint32_t) (sector),
count) == MSD_OK)
{
// while(BSP_SD_GetCardState()!= MSD_OK)
// {
// if (timeout-- == 0)
// {
// return RES_ERROR;
// }
// }
res = RES_OK;
}
return res;
}
hlb007 发表于 2018-3-6 17:21
老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA ...
我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以了
你这个看起来是文件系统相关的,需要具体看一下文件系统对DMA读写的要求了 caojin85cn 发表于 2018-6-28 17:37
我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以 ...
请问下,楼主这个 cache是怎么一回事,怎么做同步呢,我的好像也是读写错误,需要加入延时才能成功。
页:
[1]