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
相关产品推荐
相关产品推荐

