SDMMC DMA FATFS读取SD卡

2019-07-20 01:44发布

u8 SD_Init(void)
{
    u8 SD_Error;
   
   //³õʼ»¯Ê±µÄʱÖÓ²»ÄÜ´óÓÚ400KHZ
    SDCARD_Handler.Instance = SDMMC1;
    SDCARD_Handler.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;          //ÉÏÉýÑØ     
    SDCARD_Handler.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;     //²»Ê¹ÓÃbypassģʽ£¬Ö±½ÓÓÃHCLK½øÐзÖƵµÃµ½SDIO_CK
    SDCARD_Handler.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;    //¿ÕÏÐʱ²»¹Ø±ÕʱÖÓµçÔ´
    SDCARD_Handler.Init.BusWide = SDMMC_BUS_WIDE_1B;                        //1λÊý¾ÝÏß
    SDCARD_Handler.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;//¹Ø±ÕÓ²¼þÁ÷¿Ø
    SDCARD_Handler.Init.ClockDiv = 4;//SD´«ÊäʱÖÓƵÂÊ×î´ó25MHZ SDMMC_INIT_CLK_DIV SDMMC_TRANSFER_CLK_DIV
   SD_Error = HAL_SD_Init(&SDCARD_Handler);
   //printf(" HAL_SD_Init:%d",SD_Error);
   if(SD_Error != HAL_OK) return 1;
  
    SD_Error = HAL_SD_ConfigWideBusOperation(&SDCARD_Handler,SDMMC_BUS_WIDE_4B);//ʹÄÜ¿í×ÜÏßģʽ
    //printf(" HAL_SD_ConfigWideBusOperation:%d",SD_Error);
    if(SD_Error != HAL_OK) return 2;
   
   SD_Error = SD_GetCardInfo(&SDCardInfo);
   //printf(" SD_GetCardInfo:%d",SD_Error);
    if(SD_Error != HAL_OK) return 3;
   
    return 0;
}
//SDMMCµ×²ãÇý¶¯£¬Ê±ÖÓʹÄÜ£¬Òý½ÅÅäÖã¬DMAÅäÖÃ
//´Ëº¯Êý»á±»HAL_SD_Init()µ÷ÓÃ
//hsd:SD¿¨¾ä±ú
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_SDMMC1_CLK_ENABLE();//ʹÄÜSDMMCʱÖÓ
    __HAL_RCC_DMA2_CLK_ENABLE();    //ʹÄÜDMA2ʱÖÓ
    __HAL_RCC_GPIOC_CLK_ENABLE();   //ʹÄÜGPIOCʱÖÓ
    __HAL_RCC_GPIOD_CLK_ENABLE();   //ʹÄÜGPIODʱÖÓ
   
   //PC8,9,10,11,12
    GPIO_Initure.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
    GPIO_Initure.Mode = GPIO_MODE_AF_PP;      //ÍÆÍ츴ÓÃ
    GPIO_Initure.Pull = GPIO_PULLUP;          //ÉÏÀ
    GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     //¸ßËÙ
    GPIO_Initure.Alternate = GPIO_AF12_SDMMC1;//GPIO_AF12_SDIO;  //¸´ÓÃΪSDIO
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);     //³õʼ»¯
    //PD2
   GPIO_Initure.Pin = GPIO_PIN_2;
    GPIO_Initure.Mode = GPIO_MODE_AF_PP;
    GPIO_Initure.Pull = GPIO_PULLUP;
    GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_Initure.Alternate = GPIO_AF12_SDMMC1;           
    HAL_GPIO_Init(GPIOD,&GPIO_Initure);     //³õʼ»¯

#if (SD_DMA_MODE == 1)                        //ʹÓÃDMAģʽ
    HAL_NVIC_SetPriority(DMA2_Channel4_IRQn, 2, 0);  //·¢ËÍDMAÖжÏÓÅÏȼ¶
    HAL_NVIC_EnableIRQ(DMA2_Channel4_IRQn);
  
    HAL_NVIC_SetPriority(DMA2_Channel5_IRQn, 2, 0);  //½ÓÊÕDMAÖжÏÓÅÏȼ¶
    HAL_NVIC_EnableIRQ(DMA2_Channel5_IRQn);
  HAL_NVIC_SetPriority(SDMMC1_IRQn,1,0);  //ÅäÖÃSDMMC1Öжϣ¬ÇÀÕ¼ÓÅÏȼ¶2£¬×ÓÓÅÏȼ¶0
    HAL_NVIC_EnableIRQ(SDMMC1_IRQn);        //ʹÄÜSDMMC1ÖжÏ
  
    SDRxDMAHandler.Instance=DMA2_Channel4;
    SDRxDMAHandler.Init.Request=DMA_REQUEST_7;
    SDRxDMAHandler.Init.Direction=DMA_PERIPH_TO_MEMORY;
    SDRxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;
    SDRxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;
    SDRxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
    SDRxDMAHandler.Init.MemDataAlignment=DMA_PDATAALIGN_BYTE;// DMA_MDATAALIGN_BYTE  DMA_MDATAALIGN_WORD
    SDRxDMAHandler.Init.Mode = DMA_NORMAL;//DMA_NORMAL;DMA_CIRCULAR
    SDRxDMAHandler.Init.Priority = DMA_PRIORITY_LOW;
    HAL_DMA_Init(&SDRxDMAHandler);   
    __HAL_LINKDMA(hsd, hdmarx, SDRxDMAHandler); //½«½ÓÊÕDMAºÍSD¿¨µÄ·¢ËÍDMAÁ¬½ÓÆðÀ´   
    SDTxDMAHandler.Instance=DMA2_Channel5;
    SDTxDMAHandler.Init.Request=DMA_REQUEST_7;
    SDTxDMAHandler.Init.Direction=DMA_MEMORY_TO_PERIPH;
    SDTxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;
    SDTxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;
    SDTxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
    SDTxDMAHandler.Init.MemDataAlignment=DMA_PDATAALIGN_BYTE;
    SDTxDMAHandler.Init.Mode=DMA_NORMAL;
    SDTxDMAHandler.Init.Priority=DMA_PRIORITY_LOW;
    HAL_DMA_Init(&SDTxDMAHandler);  
    __HAL_LINKDMA(hsd, hdmatx, SDTxDMAHandler);//½«·¢ËÍDMAºÍSD¿¨µÄ·¢ËÍDMAÁ¬½ÓÆðÀ´   
#endif
}
//µÃµ½¿¨ÐÅÏ¢
//cardinfo:¿¨ÐÅÏ¢´æ´¢Çø
//·µ»ØÖµ:´íÎó״̬
u8 SD_GetCardInfo(HAL_SD_CardInfoTypeDef *cardinfo)
{
    u8 sta;
    sta = HAL_SD_GetCardInfo(&SDCARD_Handler,cardinfo);
    return sta;
}
#if (SD_DMA_MODE == 1)        //DMAģʽ
/**
  * @brief Configure the DMA to receive data from the SD card
  * @retval
  *  HAL_ERROR or HAL_OK
  */
HAL_StatusTypeDef SD_DMAConfigRx(SD_HandleTypeDef *hsd)
{
  HAL_StatusTypeDef status = HAL_ERROR;
  
  /* Configure DMA Rx parameters */
  SDRxDMAHandler.Instance = DMA2_Channel4;
SDRxDMAHandler.Init.Request = DMA_REQUEST_7;
SDRxDMAHandler.Init.Direction = DMA_PERIPH_TO_MEMORY;
SDRxDMAHandler.Init.PeriphInc = DMA_PINC_DISABLE;
SDRxDMAHandler.Init.MemInc = DMA_MINC_ENABLE;
SDRxDMAHandler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
SDRxDMAHandler.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE;
SDRxDMAHandler.Init.Mode = DMA_NORMAL;
  SDRxDMAHandler.Init.Priority = DMA_PRIORITY_LOW;
  /* Associate the DMA handle */
  __HAL_LINKDMA(hsd,hdmarx,SDRxDMAHandler);
  /* Stop any ongoing transfer and reset the state*/
  HAL_DMA_Abort(&SDRxDMAHandler);
  
  /* Deinitialize the Channel for new transfer */
  HAL_DMA_DeInit(&SDTxDMAHandler);//????!!!DeInit???????!!!
  /* Configure the DMA Channel */
  status = HAL_DMA_Init(&SDRxDMAHandler);
   
  return (status);
}
/**
  * @brief Configure the DMA to transmit data to the SD card
  * @retval
  *  HAL_ERROR or HAL_OK
  */
HAL_StatusTypeDef SD_DMAConfigTx(SD_HandleTypeDef *hsd)
{
  HAL_StatusTypeDef status;
  
  /* SDMMC1_TX Init */
SDTxDMAHandler.Instance = DMA2_Channel5;
SDTxDMAHandler.Init.Request = DMA_REQUEST_7;
SDTxDMAHandler.Init.Direction = DMA_MEMORY_TO_PERIPH;
SDTxDMAHandler.Init.PeriphInc = DMA_PINC_DISABLE;
SDTxDMAHandler.Init.MemInc = DMA_MINC_ENABLE;
SDTxDMAHandler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
SDTxDMAHandler.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE;
SDTxDMAHandler.Init.Mode = DMA_NORMAL;//??NORMAL??????,???
SDTxDMAHandler.Init.Priority = DMA_PRIORITY_LOW;
  /* Associate the DMA handle */
  __HAL_LINKDMA(hsd, hdmatx, SDTxDMAHandler);
  
  /* Stop any ongoing transfer and reset the state*/
  HAL_DMA_Abort(&SDTxDMAHandler);
  
  /* Deinitialize the Channel for new transfer */
  HAL_DMA_DeInit(&SDRxDMAHandler);  //????!!!DeInit???????!!!
  
  /* Configure the DMA Channel */
  status = HAL_DMA_Init(&SDTxDMAHandler);
  return (status);
}
//ͨ¹ýDMA¶ÁÈ¡SD¿¨Ò»¸öÉÈÇø
//buf:¶ÁÊý¾Ý»º´æÇø
//sector:ÉÈÇøµØÖ·
//blocksize:ÉÈÇø´óС(Ò»°ã¶¼ÊÇ512×Ö½Ú)
//cnt:ÉÈÇø¸öÊý
//·µ»ØÖµ:´íÎó״̬;0,Õý³£;ÆäËû,´íÎó´úÂë;
u8 SD_ReadBlocks_DMA(uint8_t *buf,uint64_t sector,uint32_t cnt)
{
    u8 sd_state = HAL_OK;

  if(SD_DMAConfigRx(&SDCARD_Handler) != HAL_OK)
  {
    return HAL_ERROR;
  }
    if(HAL_SD_ReadBlocks_DMA(&SDCARD_Handler,buf,sector,cnt) != HAL_OK)//¶ÁÈ¡³É¹¦
    {
    sd_state = HAL_ERROR;
    }
    return sd_state;
}
//дSD¿¨
//buf:дÊý¾Ý»º´æÇø
//sector:ÉÈÇøµØÖ·
//blocksize:ÉÈÇø´óС(Ò»°ã¶¼ÊÇ512×Ö½Ú)
//cnt:ÉÈÇø¸öÊý
//·µ»ØÖµ:´íÎó״̬;0,Õý³£;ÆäËû,´íÎó´úÂë;
u8 SD_WriteBlocks_DMA(uint8_t *buf,uint64_t sector,uint32_t cnt)
{
    u8 sd_state = HAL_OK;

  if(SD_DMAConfigTx(&SDCARD_Handler) != HAL_OK)
  {
    return HAL_ERROR;
  }
    if(HAL_SD_WriteBlocks_DMA(&SDCARD_Handler,buf,sector,cnt) != HAL_OK)//д³É¹¦
    {     
       sd_state = HAL_ERROR;
    }
    return sd_state;
}
//¶ÁSD¿¨
//buf:¶ÁÊý¾Ý»º´æÇø
//sector:ÉÈÇøµØÖ·
//cnt:ÉÈÇø¸öÊý
//·µ»ØÖµ:´íÎó״̬;0,Õý³£;ÆäËû,´íÎó´úÂë;
u8 SD_ReadDisk(u8* buf,u32 sector,u32 cnt)
{
    u8 sta=HAL_OK;
    long long lsector=sector;
    u8 n;
    //if(SDCardInfo.CardType != CARD_SDSC)lsector<<=9;
    if((u32)buf%4!=0)
    {
        for(n=0;n<cnt;n++)
        {
            //sta=SD_ReadBlocks_DMA((uint8_t*)SDIO_DATA_BUFFER,lsector+512*n,1);
      sta=SD_ReadBlocks_DMA(SDIO_DATA_BUFFER,lsector+n,1);
            memcpy(buf,SDIO_DATA_BUFFER,512);
            buf+=512;
        }
    }else
    {
        sta=SD_ReadBlocks_DMA(buf,lsector, cnt);
    }
    return sta;
}  
//&ETH;&acute;SD&iquest;¨
//buf:&ETH;&acute;&Ecirc;&yacute;&frac34;&Yacute;&raquo;&ordm;&acute;&aelig;&Ccedil;&oslash;
//sector:&Eacute;&Egrave;&Ccedil;&oslash;&micro;&Oslash;&Ouml;·
//cnt:&Eacute;&Egrave;&Ccedil;&oslash;&cedil;&ouml;&Ecirc;&yacute;
//·&micro;&raquo;&Oslash;&Ouml;&micro;:&acute;í&Icirc;ó×&acute;&Igrave;&not;;0,&Otilde;&yacute;&sup3;&pound;;&AElig;&auml;&Euml;&ucirc;,&acute;í&Icirc;ó&acute;ú&Acirc;&euml;;
u8 SD_WriteDisk(u8 *buf,u32 sector,u32 cnt)
{   
    u8 sta=HAL_OK;
    long long lsector=sector;
    u8 n;
    //if(SDCardInfo.CardType != CARD_SDSC)lsector<<=9;
    if((u32)buf%4!=0)
    {
        for(n=0;n<cnt;n++)
        {
            //sta=SD_WriteBlocks_DMA((uint8_t*)SDIO_DATA_BUFFER,lsector+512*n,1);//&micro;&yen;&cedil;&ouml;sector&micro;&Auml;&ETH;&acute;&sup2;&Ugrave;×÷
      sta=SD_WriteBlocks_DMA(SDIO_DATA_BUFFER,lsector+n,1);//&micro;&yen;&cedil;&ouml;sector&micro;&Auml;&ETH;&acute;&sup2;&Ugrave;×÷
       memcpy(SDIO_DATA_BUFFER,buf,512);
            buf+=512;
        }
    }else
    {
        sta=SD_WriteBlocks_DMA(buf,lsector,cnt);//&para;à&cedil;&ouml;sector&micro;&Auml;&ETH;&acute;&sup2;&Ugrave;×
    }
    return sta;
}
//SDMMC1&Ouml;&ETH;&para;&Iuml;·&thorn;&Icirc;&ntilde;&ordm;&macr;&Ecirc;&yacute;
void SDMMC1_IRQHandler(void)
{
    HAL_SD_IRQHandler(&SDCARD_Handler);
}
void DMA2_Channel4_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&SDRxDMAHandler);
  //HAL_DMA_IRQHandler(SDCARD_Handler.hdmarx);
}
void DMA2_Channel5_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&SDTxDMAHandler);
  //HAL_DMA_IRQHandler(SDCARD_Handler.hdmatx);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
debug
1楼-- · 2019-07-20 04:26
static
BYTE check_fs (        /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4isk error */
        FATFS* fs,        /* File system object */
        DWORD sect        /* Sector# (lba) to check if it is an FAT boot record or not */
)
{

        fs->wflag = 0; fs->winsect = 0xFFFFFFFF;                /* Invaidate window */
        if (move_window(fs, sect) != FR_OK) return 4;        /* Load boot record */
  test = ld_word(&fs->win[BS_55AA]);
        if (ld_word(&fs->win[BS_55AA]) != 0xAA55) return 3;        /* Check boot record signature (always placed at offset 510 even if the sector size is >512) */

        test = ld_dword(&fs->win[BS_FilSysType]);
        if ((ld_dword(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) return 0;        /* Check "FAT" string */
        test = ld_dword(&fs->win[BS_FilSysType32]);
        if ((ld_dword(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) return 0;        /* Check "FAT" string */
#if _FS_EXFAT
        if (!mem_cmp(&fs->win[BS_OEMName], "EXFAT   ", 8)) return 1;
#endif
        return 2;
}
一直返回3,读取到的值为0

一周热门 更多>