初级会员

- 积分
- 52
- 金钱
- 52
- 注册时间
- 2015-6-20
- 在线时间
- 10 小时
|
10金钱
本帖最后由 MCU爆炸者 于 2017-5-19 09:45 编辑
不知道诸位有不有遇到这样的情况,SDIO+DMA读数据(只读一个块)的时候会丢失一部分数据,SD卡设的4线模式,丢失的数据总是在头和尾,我看了手册DMA的部分,使用DMA FIFO的情况很多时候要半字或者全字对对齐,索性我就8字节对齐了,贴了部分代码上来
[mw_shl_code=c,true]__align(8) vu8 Array[512];
HAL_SD_ReadBlocks_DMA(&SD_Handle, (u8*)Array, 40, 1);[/mw_shl_code]
我看了看HAL_SD_ReadBlocks_DMA这个函数的内容,DMA是字模式的
[mw_shl_code=applescript,true]HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)
{
......
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4);
......
}[/mw_shl_code]
我的DMA配置是这样的
[mw_shl_code=applescript,true] __HAL_LINKDMA(&SD_Handle,hdmarx,SD_DMA);
SD_Handle.hdmarx->Instance = DMA2_Stream3;
SD_Handle.hdmarx->Init.Channel = DMA_CHANNEL_4;
SD_Handle.hdmarx->Init.Direction = DMA_PERIPH_TO_MEMORY;
SD_Handle.hdmarx->Init.FIFOMode = DMA_FIFOMODE_ENABLE;
SD_Handle.hdmarx->Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
SD_Handle.hdmarx->Init.Mode = DMA_PFCTRL;
SD_Handle.hdmarx->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
SD_Handle.hdmarx->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
SD_Handle.hdmarx->Init.PeriphBurst = DMA_PBURST_INC4;
SD_Handle.hdmarx->Init.MemBurst = DMA_MBURST_INC4;
SD_Handle.hdmarx->Init.PeriphInc = DMA_PINC_DISABLE;
SD_Handle.hdmarx->Init.MemInc = DMA_MINC_ENABLE;
SD_Handle.hdmarx->Init.Priority = DMA_PRIORITY_VERY_HIGH;
HAL_DMA_Init(SD_Handle.hdmarx);[/mw_shl_code]
如果哪里有问题,还望大佬指出..
DMA方式读出来的数据
使用polling模式读出来的数据又是对的...
[mw_shl_code=c,true]HAL_SD_ReadBlocks(&SD_Handle, (u8*)Array, 40, 1, 10000);[/mw_shl_code]
而且更神奇的是使用不同的长度对齐(2的整数倍)的时候会出现不同的程度的丢失,头尾都会有部分丢失,比如我设置4字节对齐,头尾就各丢十多个字节,然后不弄了。第二天起床的时候有可能它丢失的字节数就不一样了...简直神奇.. 我开SDIO的中断检查标志位的时候也没发现问题,只有DATAEND数据传输结束位会被拉起,没有出现错误标志, 我去其他电子论坛转悠了一圈,发现有人在用L4的时候也出现了同样的情况,F4则没事(原子F429的板子我有,尝试过,正常的)。这个问题好像普遍就集中在F7和L系列的库上面,不知道大佬们们有什么好点的建议没有... 板子是F746的Discovery板..
|
-
-
|