c - FATFS 无法初始化 SD 卡

标签 c sd-card stm32 stm32f4discovery fat32

所以我正在使用 STM32F407 并尝试使用 FATFS 写入 SD 卡。我使用 CubeMX 生成 FAT 层和 4 位 SDIO 配置软件的代码。我在main中添加了以下代码来测试代码是否有效。

UINT bw;

f_mount(&FatFs, "", 0);     /* Give a work area to the default drive */

/*           Create a file */
if(f_open(&Fil, "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS) == FR_OK) { 

   f_write(&Fil, "It works!\r\n", 11, &bw); /* Write data to the file */
   f_close(&Fil);                               /* Close the file */
   if (bw == 11) {      /* Lights green LED if data written well */
      //Celebrate
   }
}

但是我无法初始化SD卡。当我单步执行代码时,我到达磁盘初始化函数,该函数返回错误。由于我缺乏编写 C 的经验,我不确定以下函数如何工作以及它如何调用其他代码来初始化卡,因为我假设卡需要配置为 4 位模式。

/**
 * @brief  Initializes a Drive
 * @param  pdrv: Physical drive number (0..)
 * @retval DSTATUS: Operation status
*/
DSTATUS disk_initialize (
   BYTE pdrv                /* Physical drive nmuber to identify the drive */
)
{
   DSTATUS stat = RES_OK;

   if(disk.is_initialized[pdrv] == 0){ 
      disk.is_initialized[pdrv] = 1;
      stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);
   }
return stat;
}

此时,由于从未使 FAT 正常工作,我陷入了困境。我在适配器中使用 2GB 微型 SD 卡,并使用 FAT32 完全格式化。我正在使用 STM32F4 发现板。我已经彻底检查了 SD 卡到开发板的连接。我可以在我的逻辑分析仪上看到,当调用“disk_initialize”函数时,我确实获得了通信,但据我所知,它是一个半字节,并且没有任何内容发送回微 Controller 。有人可以帮助我建议要寻找什么吗?

谢谢

更新

好吧,现在很难看出出了什么问题。如果想要立即安装驱动器,或者不立即安装驱动器,那么我会在“disk_initialize”处收到错误消息。当单步执行时,我到达了该行:

stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);

然后它如何立即跳转到:

if((response_r1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD)
{
    return(SD_ILLEGAL_CMD);
}

然后返回此错误。

我会继续寻找,但感谢任何帮助。

最佳答案

我自己的主板也有同样的问题。在将 CubeMX 中的 SDIO 硬件的“SDIOCLK 时钟分频系数”参数从 0 设置为 4 后,我让它开始工作。

关于c - FATFS 无法初始化 SD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681083/

相关文章:

c - 应用程序是否可以从另一个应用程序获取窗口的所有权?

c - 在 C 副作用中存储指向局部变量地址的指针

android - "mnt/sdcard"总是 Android 中的外部存储吗?

android - 从 sdcard 获取 xml 文件到 android 应用程序?

带有 DMA 的 STM32F4 I2C 不起作用

c - Valgrind 错误

c++ - 在不同字节中写入位 c c++

android - 在 Android 中的 DCIM 文件夹下的 SD 卡上创建文件夹时出错

gcc - STM32 gcc (arm-none-eabi-gcc) 链接 printf 即使它没有被使用

c - stm32f4 CAN receiver_IT问题