使用官網(wǎng)上的例程發(fā)現(xiàn)原文件中SD_Init函數(shù)中?errorstatus = SD_SetDeviceMode( SD_POLLING_MODE );
本來是處于非DMA模式,若想使用DMA模式需要將這句話改為errorstatus = SD_SetDeviceMode( SD_DMA_MODE );嗎?但是再進(jìn)行初始化時(shí)初始化失敗,請(qǐng)問一下是我忽略了哪里嗎,前面我看原文件中已經(jīng)打開了DMA時(shí)鐘了
使用官網(wǎng)上的例程發(fā)現(xiàn)原文件中SD_Init函數(shù)中?errorstatus = SD_SetDeviceMode( SD_POLLING_MODE );
本來是處于非DMA模式,若想使用DMA模式需要將這句話改為errorstatus = SD_SetDeviceMode( SD_DMA_MODE );嗎?但是再進(jìn)行初始化時(shí)初始化失敗,請(qǐng)問一下是我忽略了哪里嗎,前面我看原文件中已經(jīng)打開了DMA時(shí)鐘了
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;
}
附上現(xiàn)在SD_Init的代碼,請(qǐng)問一下哪里有問題
您好,
????????目前SDIO例程中使用DMA模式時(shí)需要對(duì)庫進(jìn)行修改,具體為SD_ReadBlock、SD_ReadMultiBlocks、SD_WriteBlock、SD_WriteMultiBlocks四個(gè)函數(shù)中使能DMA后再添加使能通道,在下個(gè)版本中已對(duì)該問題進(jìn)行了修復(fù)。
您好,官方有已經(jīng)修改好的版本嗎,可以發(fā)給我一份嗎,郵箱個(gè)人信息保護(hù),已隱藏
?CH32V307 能? 在MDK(keil) 平臺(tái)開發(fā)發(fā)嗎
?CH32V307 能? 在MDK(keil) 平臺(tái)開發(fā)發(fā)嗎
您好,
????????如果在使用SDIO接口的過程中,遇到DMA模式無法正常工作的情況,可以嘗試下載附件中的庫進(jìn)行替換,修復(fù)上述已知問題。
????????目前V307不支持使用keil,推薦使用MounRiver進(jìn)行開發(fā),下載鏈接:http://www.mounriver.com/download
您好,在同時(shí)使用DMA模式下的SDIO和以太網(wǎng)時(shí)遇到了問題,現(xiàn)在懷疑是由于我在修改SDIO庫時(shí)不太準(zhǔn)確,還是想問一下有SDIO DMA模式下的例程嗎
您好,
????????SDIO在使用DMA模式時(shí),僅需要在初始化函數(shù)中配置即可,在使用讀寫函數(shù)操作時(shí),會(huì)自動(dòng)開啟DMA模式進(jìn)行數(shù)據(jù)傳輸,因此沒有所謂DMA模式的例程,您可以直接使用SDIO的例程進(jìn)行測(cè)試。