OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3464|回复: 0

精英板SPI_FLASH移植FATFS文件系统无法在同一个文件写入新行(无法继续写入内容)

[复制链接]

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-12-21
在线时间
9 小时
发表于 2022-3-4 22:45:54 | 显示全部楼层 |阅读模式
15金钱
新人求助!!!谢谢各位啦


近期在移植FATFS文件系统时,格式化SPI_FLASH,也就是精英板上的W25Q128,挂载文件系统成功,格式化成功,新建并打开文件成功,先向该文件里写入了一段内容,之后读取文件内容,关闭文件,确保写入内容保存成功。之后再次打开该文件,尝试在该文件后继续写入新的内容(保留原来的内容),但是问题发生了,执行f_read,只能从串口返回第一次写入的内容,之后写入的内容无法返回。

此图为串口输出情况

此图为串口输出情况
此图为串口输出情况

main.c内容如下


//************************************************************//

// main.c 开始



#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
//#include "./led/bsp_led.h"
#include "./flash/bsp_spi_flash.h"
#include "ff.h"                       


FATFS fsObject;
FIL fp;
const char wData[]="T温度数据采集\n";  //第一次写入的数据
const char next_data[]="H湿度数据采集\n"; //第二次写入的数据
char rData[4096]=""; //f_read工作空间(缓存读取数据)4096字节,应该足够了


UINT bw;//写入了多少个字节
UINT br;//读出了多少个字节


void check(FRESULT res) //判断文件操作是否成功
{
        if(res != FR_OK)
        {
                printf("失败(res = %d)",res);
        }
        else
        {
                printf("成功");
        }
}


/*
* 函数名:main
* 描述  :主函数
* 输入  :无
* 输出  :无
*/
int main(void)
{        
        FRESULT res;

        /* 配置串口为:115200 8-N-1 */
        USART_Config();
        printf("\n这是一个FATFS文件系统移植实验");
       
       
        //挂载文件系统
        res = f_mount(&fsObject,"1:",1);
        if(res != FR_OK)
        {
                printf("\n挂载文件系统失败(res = %d)",res);
               
                //格式化文件系统
                if(res == FR_NO_FILESYSTEM)
                {
                        printf("\n检查不到文件系统,正在格式化");
                        res = f_mkfs("1:",0,0);
                        printf("\n格式化");
                        check(res);
                }
        }
        else
        {
                printf("\n挂载文件系统成功");
        }
       
        // 这个是为了测试,每次删除上一次建立的 test.txt文件,从新开始写入数据
        res = f_unlink("1:test.txt");
        printf("\n删除文件");
        check(res);       
       
       
        // 写入第一次数据
        res = f_open(&fp,"1:test.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
        printf("\n打开文件");
        check(res);
        if(res == FR_OK)
        {
                res = f_write(&fp,wData,sizeof(wData),&bw);
               
                if(res == FR_OK) printf ("\n成功写入 %d 字节",bw);               
                else printf("\n写入失败!!!");
        }
        f_close(&fp);
       
        // 读取第一次数据
        res = f_open(&fp,"1:test.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
        printf("\n打开文件");
        check(res);
        f_lseek(&fp,0);
        res = f_read(&fp,rData,f_size(&fp),&br);
        printf("\n读取文件");
        check(res);
        printf("\n文件内容:%s\n读取 %d 字节",rData,br); // 内容正常

        //定位到文件末尾的指针
        f_lseek(&fp,f_size(&fp));
        printf("\n定位文件指针");
        check(res);
        f_printf(&fp,next_data);
        printf("\n写入新行");
        check(res);       
        f_close(&fp);
       
        res = f_open(&fp,"1:test.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE);
        printf("\n打开文件");
        check(res);
        f_lseek(&fp,0);
        res = f_read(&fp,rData,f_size(&fp),&br);
        printf("\n读取文件");
        check(res);
        printf("\n文件内容:%s\n读取 %d 字节",rData,br);
       
        f_close(&fp);
        //格式化后要取消挂载
        res = f_mount(NULL,"1:",1);
        printf("\n取消挂载");
        check(res);
       
       
        while(1);  
}


//************************************************************//
// main.c 结束

说明:看读取的字节数应该是对的,但是串口返还的数据确实只有第一次写入的内容,之前使用f_write尝试过,也是同样的现象,现在改成了f_printf来写入新行内容
(程序使用的野火的程序,移植他们串行flash程序至原子的开发板(精英板))
希望有大佬可以帮忙看看,指点一下,现在不知道该怎么办了

W25Q128硬件驱动程序应该没问题,之前测试过,裸机读写一下寄存器,擦除扇区,都是正常的


附件:具体的工程源码

硬件是原子的精英板











FATFS_SPI_FLASH.zip

6.7 MB, 下载次数: 33

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 03:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表