新人求助!!!谢谢各位啦
近期在移植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硬件驱动程序应该没问题,之前测试过,裸机读写一下寄存器,擦除扇区,都是正常的
附件:具体的工程源码
硬件是原子的精英板
|