ch32v307 sdio的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后再添加使能通道,在下个版本中已对该问题进行了修复。

image.png





您好,官方有已经修改好的版本吗,可以发给我一份吗,邮箱个人信息保护,已隐藏



 CH32V307 能  在MDK(keil) 平台开发发吗


 CH32V307 能  在MDK(keil) 平台开发发吗


您好,


        如果在使用SDIO接口的过程中,遇到DMA模式无法正常工作的情况,可以尝试下载附件中的库进行替换,修复上述已知问题。


        目前V307不支持使用keil,推荐使用MounRiver进行开发,下载链接:http://www.mounriver.com/download


icon_rar.gifch32v30x_sdio.zip





您好,在同时使用DMA模式下的SDIO和以太网时遇到了问题,现在怀疑是由于我在修改SDIO库时不太准确,还是想问一下有SDIO DMA模式下的例程吗


您好,


        SDIO在使用DMA模式时,仅需要在初始化函数中配置即可,在使用读写函数操作时,会自动开启DMA模式进行数据传输,因此没有所谓DMA模式的例程,您可以直接使用SDIO的例程进行测试。





只有登录才能回复,可以选择微信账号登录