取消初始化 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 ) ;
}
我一直在尝试挂载 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 ) ;
}