我有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 位宽总线
我还将应用程序的堆和堆栈大小扩展到 2048。 我从控制器技术使用的自定义 file_handling.c 文件中使用的 ff.c 中的 f_mount() 找到的响应,它仅返回 FR_NOT_READY
我还注意到 main.c 中使用的 MX_SDIO_SD_Init() 没有像其他外围 MX_init 函数那样调用任何 HAL_SD_Init() 函数。
如果有人成功安装了卡,请分享你的代码,如果可能的话帮助我找出错误
我目前也遇到同样的问题。如果您使用调试器深入挖掘源代码,您可能会看到文件
$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 板进行开发。
最近,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,但还没有收到回复。 :(
我有相同的 F407VET6 设备。它没有实现 10 K 上拉电阻。
gpio初始化必须使用软件上拉。
您还必须更改 hsd.Init.BusWide = SDIO_BUS_WIDE_4B;至 1B。
这样做之后。它有效。