You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TM4C129XNCZAD MCU单SD卡双FAT分区写入访问问题咨询

单SD卡双FAT分区访问方案

结论:可以访问单SD卡内的两个FAT分区,需修正挂载逻辑与文件操作中的路径指定


1. 挂载逻辑修正

当前代码两次调用SDSPI_open时错误指定了第二个分区的设备索引,同一个SD卡对应唯一的SPI设备(即Board_SDSPI0),不同分区对应不同驱动器号。正确挂载方式应为针对同一SPI设备,挂载两个不同驱动器号(0和1)分别对应两个分区:

EIO_vmturnSDCardPowerON();
UTIL_vNonOSDelayMiliSeconds(200);/* 确保SD卡复位完成 */

/* 初始化SDSPI参数 */
SDSPI_Params_init(&objstrsdspiParameters);

/* 挂载第一个分区(驱动器0) */
objsdspiHandle = SDSPI_open(Board_SDSPI0, 0, &objstrsdspiParameters);
if(objsdspiHandle == STD_NULL)
{
    FSHELL_vmLogError0(&objstrFSHELLModuleInfoType, "无法挂载SD卡分区0");
}
else
{
    FSHELL_vmLogActivity1(&objstrFSHELLModuleInfoType, "SD卡分区已挂载 驱动器:%u", 0);
    bSdMountState = STD_TRUE;
}

/* 挂载第二个分区(驱动器1) */
objsdspiHandle = SDSPI_open(Board_SDSPI0, 1, &objstrsdspiParameters);
if(objsdspiHandle == STD_NULL)
{
    FSHELL_vmLogError0(&objstrFSHELLModuleInfoType, "无法挂载SD卡分区1");
}
else
{
    FSHELL_vmLogActivity1(&objstrFSHELLModuleInfoType, "SD卡分区已挂载 驱动器:%u", 1);
    bSdMountState = STD_TRUE;
}

2. 文件操作逻辑修正

当前创建目录时未指定驱动器号,默认操作第一个分区,导致第二个分区的/ProgBlocks目录不存在,进而fopen失败。需为每个分区单独指定路径完成目录创建与文件操作:

#include <stdio.h>

void your_function_name() {
    ...
    INT8S *ps8ProgFilePath = "fat:0:/ProgBlocks/Blocks.txt";
    INT8S *ps8ProgFilePath_1 = "fat:1:/ProgBlocks/Blocks.txt";
    FRESULT objFRESULT = FR_DISK_ERR;
    FILE *pSourceFile;
    ...

    // 为第一个分区创建目录并操作文件
    objFRESULT = f_mkdir("fat:0:/ProgBlocks");
    if((objFRESULT == FR_OK)||(objFRESULT == FR_EXIST)) 
    {
        pSourceFile = fopen((const INT8S*)ps8ProgFilePath, "a");
        if(pSourceFile == STD_NULL)
        {
            SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" 无法创建", (INT32U)ps8ProgFilePath);
        }
        else
        {
            u32NumBytesWritten = fwrite((INT8S*)ps8Data,1,(MAX_BLOCK_ID_STRING+(u32BlockLen*3)),pSourceFile);
            if (u32NumBytesWritten != (MAX_BLOCK_ID_STRING+(u32BlockLen*3)))
            {
                SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" 写入块出错", (INT32U)ps8ProgFilePath);
            }
            if(fclose(pSourceFile) != 0)
            {
                SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" 无法关闭", (INT32U)ps8ProgFilePath);
            }
        }
    }

    // 为第二个分区创建目录并操作文件
    objFRESULT = f_mkdir("fat:1:/ProgBlocks");
    if((objFRESULT == FR_OK)||(objFRESULT == FR_EXIST)) 
    {
        pSourceFile = fopen((const INT8S*)ps8ProgFilePath_1, "a");
        if(pSourceFile == STD_NULL)
        {
            SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" 无法创建", (INT32U)ps8ProgFilePath_1);
        }
        else
        {
            u32NumBytesWritten = fwrite((INT8S*)ps8Data,1,(MAX_BLOCK_ID_STRING+(u32BlockLen*3)),pSourceFile);
            if (u32NumBytesWritten != (MAX_BLOCK_ID_STRING+(u32BlockLen*3)))
            {
                SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" 写入块出错", (INT32U)ps8ProgFilePath_1);
            }
            if(fclose(pSourceFile) != 0)
            {
                SCFGM_vmLogError1(&objstrSCFGMModuleInfoType, "\"%s\" 无法关闭", (INT32U)ps8ProgFilePath_1);
            }
        }
    }
    ....
}

3. 额外注意事项

  • 确认SD卡分区表正确,两个FAT分区已被正确格式化(可通过PC端工具验证分区的文件系统类型与可访问性)。
  • 检查TM4C129的SPI3引脚配置,确保SD卡通信稳定。
  • 若使用TI封装的FatFs,需确认配置中启用多驱动器支持:检查ffconf.h中的_VOLUMES宏是否设置为≥2。

内容的提问来源于stack exchange,提问作者Hazem Khaled

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:25:21