|
|
问题解决了,应该是SD卡的原因,换了一个就好了 |
|
从你描述的现象来看,两个问题很可能都指向 FATFS 文件系统层与底层 SD 驱动之间的缓冲区管理或缓存(cache)同步问题,而不是单纯的栈溢出。 问题一:System/Font/GB2312.txt 读取全 0x20,且文件损坏 可能原因 1. 路径解析 / LFN 缓冲区问题(最可能) 当 _USE_LFN = 2 时,FATFS 使用 静态缓冲区 存放长文件名。如果你的代码中同时打开了多个文件,或者在进行长文件名解析时没有正确管理这个静态缓冲区,可能导致路径解析出错。 但更关键的是:System/Font/ 这个子目录的目录项读取可能出错。如果目录项读取时使用了错误的簇号或偏移,读到的数据就会是垃圾数据(0x20 是空格,说明读到了目录项的空闲区域)。 2. 目录缓存(cache)不同步 FATFS 在读取目录时会有缓存。如果你之前对该目录做过写操作(比如创建 Font 目录或写入 GB2312.txt),但缓存没有正确 flush,后续读取就会读到旧数据或空数据。 3. 文件写入时簇链断裂 如果你写入 GB2312.txt 时,FAT 表更新不完整(比如写 FAT 表时出错),文件系统认为该文件有内容,但实际簇链指向了空区域。读取时就会读到 0x20(空闲簇的默认值)。 问题二:写文件后立即重启导致 SD 卡初始化失败 可能原因 1. 写缓存未落盘(最可能) FATFS 默认有写缓存(FF_FS_TINY 或扇区缓冲)。执行 f_write 后,数据可能还在缓存中,没有真正写入 SD 卡。此时断电或复位,SD 卡上的 FAT 表或目录项处于不一致状态。下次上电时,SD 卡初始化时可能因为卡内状态异常导致初始化失败。 2. 底层驱动未等待 SD 卡进入空闲状态 写操作完成后立即复位,如果底层 SPI/SDIO 驱动还在传输数据,复位信号可能打断传输,导致 SD 卡内部状态机混乱。下次初始化时卡无法正确响应命令。 3. SD 卡电源/复位时序问题 复位时 SD 卡供电瞬间跌落,卡内逻辑未完全复位。拔插后重新上电,卡才能正确初始化。 |