野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23424|回复: 1

rtthread sd卡挂载文件系统失败 FR_NOT_ENABLED

[复制链接]
发表于 2021-4-9 14:06:08 | 显示全部楼层 |阅读模式
rtthread系统在stm32f1上运行正常,sd卡设备注册成功,尝试读写正常,但是挂载文件系统失败,dfs_mount 结果显示FORMAT ERROR
尝试mkfs -t elm sd0 结果显示error -12 FR_NOT_ENABLED
目前想到的是官方例程里SD卡是以HOST设备注册创建的,但是官方对于HOST设备好像没有什么文档说明
不知道这个HOST设备步骤是否必须,因为如果不用操作系统的话,驱动完成后直接f_mount就可以了
有没有大佬有过相关经验,能帮忙看看可能是什么原因的
  1. struct rt_device my_sdcard;

  2. rt_err_t rt_sdcard_init(rt_device_t dev)
  3. {
  4.     /* DMA controller clock enable */
  5.   __HAL_RCC_DMA2_CLK_ENABLE();

  6.   /* DMA interrupt init */
  7.   /* DMA2_Channel4_5_IRQn interrupt configuration */
  8.   HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 1, 0);
  9.   HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);
  10.    
  11.   hsd.Instance                                     = SDIO;
  12.   hsd.Init.ClockEdge                         = SDIO_CLOCK_EDGE_RISING;
  13.   hsd.Init.ClockBypass                     = SDIO_CLOCK_BYPASS_DISABLE;
  14.   hsd.Init.ClockPowerSave             = SDIO_CLOCK_POWER_SAVE_DISABLE;
  15.   hsd.Init.BusWide                             = SDIO_BUS_WIDE_1B;
  16.   hsd.Init.HardwareFlowControl     = SDIO_HARDWARE_FLOW_CONTROL_ENABLE;
  17.   hsd.Init.ClockDiv                         = SDIO_TRANSFER_CLK_DIV;
  18.    
  19.   if (HAL_SD_Init(&hsd) != HAL_OK)
  20.   {
  21.     Error_Handler();
  22.   }
  23.   if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)
  24.   {
  25.     Error_Handler();
  26.   }        
  27.    
  28.     return RT_EOK;
  29. }

  30. rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag)
  31. {
  32.     return rt_sdcard_init(dev);
  33. }

  34. rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t sector, void *buffer,  rt_size_t size)
  35. {
  36.     rt_base_t level = 0, status = 0, timeout = 0xff;
  37.     level = rt_hw_interrupt_disable();
  38.    
  39.     status = HAL_SD_ReadBlocks_DMA(&hsd, buffer, sector, size);

  40.     while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
  41.     {
  42.         if(timeout-- == 0)
  43.         {
  44.             status = RT_ERROR;
  45.             
  46.             rt_hw_interrupt_enable(level);
  47.             return status;
  48.         }
  49.     }
  50.    
  51.     rt_hw_interrupt_enable(level);
  52.    
  53.     return RT_EOK;
  54. }

  55. rt_size_t rt_sdcard_write(rt_device_t dev, rt_off_t sector, const void *buffer,  rt_size_t size)
  56. {
  57.     rt_base_t level = 0, status = 0, timeout = 0xff;
  58.     level = rt_hw_interrupt_disable();

  59.     status = HAL_SD_WriteBlocks_IT(&hsd, (uint8_t *)buffer, sector, size);

  60.     while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER)
  61.     {
  62.         if(timeout-- == 0)
  63.         {
  64.             status = RT_ERROR;
  65.             
  66.             rt_hw_interrupt_enable(level);
  67.             return status;
  68.         }
  69.     }
  70.    
  71.     rt_hw_interrupt_enable(level);   
  72.     return RT_EOK;
  73. }

  74. void rt_hw_sdcard_init(void)
  75. {
  76.     my_sdcard.type = RT_Device_Class_Block;
  77.    
  78.     my_sdcard.init             = rt_sdcard_init;
  79.     my_sdcard.open             = rt_sdcard_open;
  80.     my_sdcard.read             = rt_sdcard_read;
  81.     my_sdcard.write         = rt_sdcard_write;

  82.    
  83.     rt_device_register(&my_sdcard, "sd0",
  84.                                          RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE | RT_DEVICE_FLAG_DMA_RX);
  85.    
  86.     rt_device_open(&my_sdcard, RT_DEVICE_FLAG_RDWR);
  87. }
  88. INIT_APP_EXPORT(rt_hw_sdcard_init);
复制代码
野火论坛202104091401416754..png
野火论坛202104091401532304..png
回复

使用道具 举报

发表于 2021-9-17 14:53:43 | 显示全部楼层
你好,请问现在你这个问题解决了吗,我也遇到这个问题了

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-3 16:00 , Processed in 0.040414 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表