Stm32f407VET6 Black Board 中 SDIO 外设的 SD 卡问题

问题描述 投票:0回答:3

我有Stm32f407VET6黑板,无法连接MicroSD卡。我使用板载 SD 插槽和 PNY 的 32GB 微型 SD 卡。该卡没问题,并且已经格式化为 FAT32。 f_mount() 函数仅返回 FR_NOT_READY。安装格式化不起作用。

我一直在关注控制器技术和 SDIO 的评论,它似乎对我不起作用。

IDE:Cube IDE 1.12.1 板子:Stm32f407VET6黑板 驱动程序版本:f4 1.27.1 SDIO 模式:SD 4 位宽总线

时钟设置 SDIO设置, FATFS 设置, 主.c 文件

我还将应用程序的堆和堆栈大小扩展到 2048。 我从控制器技术使用的自定义 file_handling.c 文件中使用的 ff.c 中的 f_mount() 找到的响应,它仅返回 FR_NOT_READY

我还注意到 main.c 中使用的 MX_SDIO_SD_Init() 没有像其他外围 MX_init 函数那样调用任何 HAL_SD_Init() 函数。

如果有人成功安装了卡,请分享你的代码,如果可能的话帮助我找出错误

stm32 sd-card stm32f4 stm32cubeide stm32-hal
3个回答
1
投票

我目前也遇到同样的问题。如果您使用调试器深入挖掘源代码,您可能会看到文件

$Project/Middlewares/ThirdParty/FatFS/src/diskio.c
。在这个文件中,函数
DSTATUS disk_initialize(BYTE pdrv)
被调用。在这个函数内部,另一个函数将被调用,它是
stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
(函数指针),在我的例子中指向文件
DSTATUS USER_initialize (pdrv)
或类似文件中的函数
user_diskio.c
。最新函数的内容不完整,并且始终返回
STA_NOINIT
(= 0x01),这会导致 f_mount() = not Ready 错误,因为您必须在此处添加自己的内容。我目前正忙于它,在一个早期的项目中,我使用带有 SPI 接口的 µSD 卡完成了这项工作,经过数小时的尝试和错误后,它仍然可以工作。

如何使用驱动程序的一些信息可以在驱动程序文件的开头找到,例如

stm32f4xx_hal_sd.c
sd_diskio.c
。在
STM32Cube_FW_F4_V1.27.*.zip/Drivers/STM32F4_HAL_Driver/Src
中搜索它。

另请查看固件包中的

STM32Cube_FW_F4_V1.27.*.zip/Projects/STM32F446ZE-Nucleo/Demonstration/sd_diskio.c
以获取您必须执行的操作的示例。希望有帮助。

PS:我使用 STM32F4-DISCOVERY 板进行开发。


0
投票

最近,CubeIDE 中针对 SD 设备自动生成的代码出现了错误。

/**
  * @brief SDIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_SDIO_SD_Init(void)
{

  /* USER CODE BEGIN SDIO_Init 0 */

  /* USER CODE END SDIO_Init 0 */

  /* USER CODE BEGIN SDIO_Init 1 */

  /* USER CODE END SDIO_Init 1 */
  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_4B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 2;
  /* USER CODE BEGIN SDIO_Init 2 */

  // change buswide setting
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;

  /* USER CODE END SDIO_Init 2 */

}

SDIO 的 BusWide 初始化设置必须设置为 SDIO_BUS_WIDE_1B,以便正确执行初始化序列以及随后 SDIO 正常工作。

它出现在CubeIDE的很多版本中,无论是什么包,在什么情况下出现似乎是一个谜。我已经联系了ST,但还没有收到回复。 :(


0
投票

我有相同的 F407VET6 设备。它没有实现 10 K 上拉电阻。

gpio初始化必须使用软件上拉。

您还必须更改 hsd.Init.BusWide = SDIO_BUS_WIDE_4B;至 1B。

这样做之后。它有效。

© www.soinside.com 2019 - 2024. All rights reserved.