使用官网上的例程发现原文件中SD_Init函数中 errorstatus = SD_SetDeviceMode( SD_POLLING_MODE );
本来是处于非DMA模式,若想使用DMA模式需要将这句话改为errorstatus = SD_SetDeviceMode( SD_DMA_MODE );吗?但是再进行初始化时初始化失败,请问一下是我忽略了哪里吗,前面我看原文件中已经打开了DMA时钟了
使用官网上的例程发现原文件中SD_Init函数中 errorstatus = SD_SetDeviceMode( SD_POLLING_MODE );
本来是处于非DMA模式,若想使用DMA模式需要将这句话改为errorstatus = SD_SetDeviceMode( SD_DMA_MODE );吗?但是再进行初始化时初始化失败,请问一下是我忽略了哪里吗,前面我看原文件中已经打开了DMA时钟了
SD_Error SD_Init( void )
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
u8 clkdiv = 0;
SD_Error errorstatus = SD_OK;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE );
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_SDIO | RCC_AHBPeriph_DMA2, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOD, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init( GPIOD, &GPIO_InitStructure );
SDIO_DeInit();
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
errorstatus = SD_PowerON();
if( errorstatus == SD_OK )
{
errorstatus = SD_InitializeCards();
}
if( errorstatus == SD_OK )
{
errorstatus = SD_GetCardInfo( &SDCardInfo );
}
if( errorstatus == SD_OK )
{
errorstatus = SD_SelectDeselect( ( u32 )( SDCardInfo.RCA << 16 ) );
}
if( errorstatus == SD_OK )
{
errorstatus = SD_EnableWideBusOperation( 1 );
}
if( ( errorstatus == SD_OK ) || ( SDIO_MULTIMEDIA_CARD == CardType ) )
{
if( SDCardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1 || SDCardInfo.CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0 )
{
clkdiv = SDIO_TRANSFER_CLK_DIV + 6;
}
else
{
clkdiv = SDIO_TRANSFER_CLK_DIV + 1;
}
SDIO_Clock_Set( clkdiv );
errorstatus = SD_SetDeviceMode( SD_DMA_MODE );
}
return errorstatus;
}
附上现在SD_Init的代码,请问一下哪里有问题
您好,
目前SDIO例程中使用DMA模式时需要对库进行修改,具体为SD_ReadBlock、SD_ReadMultiBlocks、SD_WriteBlock、SD_WriteMultiBlocks四个函数中使能DMA后再添加使能通道,在下个版本中已对该问题进行了修复。
您好,官方有已经修改好的版本吗,可以发给我一份吗,邮箱个人信息保护,已隐藏
CH32V307 能 在MDK(keil) 平台开发发吗
CH32V307 能 在MDK(keil) 平台开发发吗
您好,
如果在使用SDIO接口的过程中,遇到DMA模式无法正常工作的情况,可以尝试下载附件中的库进行替换,修复上述已知问题。
目前V307不支持使用keil,推荐使用MounRiver进行开发,下载链接:http://www.mounriver.com/download
您好,在同时使用DMA模式下的SDIO和以太网时遇到了问题,现在怀疑是由于我在修改SDIO库时不太准确,还是想问一下有SDIO DMA模式下的例程吗
您好,
SDIO在使用DMA模式时,仅需要在初始化函数中配置即可,在使用读写函数操作时,会自动开启DMA模式进行数据传输,因此没有所谓DMA模式的例程,您可以直接使用SDIO的例程进行测试。