我在片子上,SDIO用4位总线、查询模式,12MHz时钟能读写SD卡了,但是在测试DMA模式时,在代码中跑得不见了。
在:SD_Error SD_ReadMultiBlocks(uint32_t addr, uint32_t *readbuff, uint16_t BlockSize, uint32_t NumberOfBlocks) 函数中的DMA这一节:
else if (DeviceMode == SD_DMA_MODE)
{
GPIO_SetBits ( GPIOA , GPIO_Pin_5 ); // by zxw
GPIO_ResetBits ( GPIOA , GPIO_Pin_6 ); // by zxw
GPIO_SetBits ( GPIOA , GPIO_Pin_7 ); // by zxw
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
SDIO_DMACmd(ENABLE);
DMA_RxConfiguration(readbuff, (NumberOfBlocks * BlockSize));
while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
{
// by zxw
GPIO_ResetBits ( GPIOA , GPIO_Pin_4 );
GPIO_SetBits ( GPIOA , GPIO_Pin_4 );
}
GPIO_SetBits ( GPIOA , GPIO_Pin_6 ); // by zxw
while ((TransferEnd == 0) && (TransferError == SD_OK))
{
GPIO_ResetBits ( GPIOA , GPIO_Pin_7 );
GPIO_SetBits ( GPIOA , GPIO_Pin_7 );
}
if (TransferError != SD_OK)
{
return(TransferError);
}
}
兰色部份跑得不见了。
这是这样观察的:
我定义了PA4、PA5、PA6、PA7为输出(我接有LED灯,IO为低时LED亮),在等待DMA状态时,PA4反复输出时钟,跳出DMA时,灭掉PA6接口上的灯。但结果是,PA4输出时钟400uS后,就停止了,但PA6的灯也没有灭,也就是程序跑得不见了,是怎么回事呢?
另外 ,使用该DMA模式需有那些地方要注意或调整,哦,对了,我用的3.0的库。谢谢 |