取消初始化 FatFS 并安装另一个 SD 卡

问题描述

我一直在尝试挂载 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 卡交换之间重新通电一样。

解决方法

定义 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 ) ;
}