0

我一直在尝试挂载 SD 卡,将一些数据写入一些文件,然后卸载 SD 卡。安装一个单独的文件并写入更多文件(这是通过多路复用器和两个独立但相同的 SD 卡模块完成的)。我正在使用 STM32F3 和 SPI 接口,我可以毫无问题地挂载和写入文件,但我正在努力正确取消初始化 SD 卡之间的所有 FatFs 变量。

我正在采取以下步骤

用于f_close关闭所有打开的文件。通过安装 NULL 驱动器来卸载驱动器f_mount(0, "", 0);。然后我打电话FATFS_UnLinkDriver。我的主要问题似乎是在所有这些步骤之后disk.is_initilized仍然返回 1。

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;
}

因此,第二张 SD 卡不会调用我正在使用的 SPI 初始化代码。我可以通过手动调用 SPI 初始化来解决这个问题,但我想知道我是否遗漏了取消初始化的任何步骤。理想情况下,我想将所有 FatFS 堆栈恢复到默认状态,就好像微控制器在 SD 卡交换之间循环通电一样。

4

1 回答 1

1

定义的媒体访问接口disk_initialise()没有设想您可能物理更改硬件接口。disk.is_initialized[pdrv]是否只是为了阻止不必要的硬件重新初始化,并且是单向开关。

您可以通过重置来强制重新初始化disk.is_initialized[pdrv] to 0

DSTATUS disk_deinitialize (
    BYTE pdrv               /* Physical drive nmuber to identify the drive */
)
{
  disk.is_initialized[pdrv] == 0 ;
  return RES_OK ;
}

此后调用disk_initialize()将执行初始化。

或者你可以有一个重新初始化函数:

DSTATUS disk_reinitialize (
    BYTE pdrv               /* Physical drive nmuber to identify the drive */
)
{
  disk.is_initialized[pdrv] == 0 ;
  return disk_reinitialize( pdrv ) ;
}
于 2021-07-01T11:01:22.787 回答