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

Deinitialising FatFS and mounting another SD card

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

我正在执行以下步骤

使用f_close关闭所有打开的文件。通过安装 NULL 驱动器卸载驱动器 f_mount(0, "", 0);。然后我打电话给 FATFS_UnLinkDriver。我的主要问题似乎是在所有这些步骤之后 disk.is_initilized 仍然 returns 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;
}

因此,我正在使用的SPI initilising 代码不会为第二张SD 卡调用。我可以通过手动调用 SPI 初始化来解决这个问题,但我想知道我是否遗漏了取消初始化的任何步骤。理想情况下,我想 return 所有 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 ) ;
}