硬件平台
CPU: K64
OS : Mqx
SDK :KSDK_1.2.0
Flash:SPI flash AT25DF641A 8M
移植准备
1. FATFS源代码的获取,可以到官网下载最新版本
http://elm-chan.org/fsw/ff/00index_e.html
FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。
2. 解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用文档和说明,以后在文件编程的时候可以查看该文档。另一个是src文件夹,里面就是我们所要的源文件。
3. 建立一个IAR工程,加入SPIflash驱动
移植步骤
1. 将ff.c ff.h disco.c disco.h ffconf.h interger.h 添加到工程中去
2. 修改ffconfig.c的相关配置,特别要注意的是_MAX_SS的设置,flash最大扇区4096
3. 修改disco.c flash驱动接口,sector大小为4096
4. 修改disk_ioctl()函数GET_SECTOR_COUNT, GET_SECTOR_SIZE, GET_BLOCK_SIZE,参数错误,后面格式化不成功
Flash驱动接口的编写
该项目SDK自带SPI的底层,所以只需要在disco.c中封装相应的接口函数,如果有时间精力可以自己尝试去写。
测试文件系统
1. 挂载
2. 格式化
3. 读写
int test_spifatfs(void)
{
FATFS fs;
FIL fl;
FRESULT res;
unsigned int r,w;
//for mount
printf("Mount a equipment: ");
res=f_mount(0,&fs);
if(!res)
printf("Mount equipment success,f_mount=%x ",res);
else
printf("Mount equipment error,f_mount=%x ",res);
//for format
printf("Format a equipment: ");
res=f_mkfs(0,1,2048);
if(!res)
printf("Format equipment success,f_mkfs=%x ",res);
else
printf("Format equipment error,f_mkfs=%x ",res);
//for write
printf("Write a file: ");
res=f_open(&fl,"/test2.dat",FA_CREATE_ALWAYS | FA_WRITE);
if(!res)
printf("Create file success,f_open=%x ",res);
else
printf("Create file error,f_open=%x ",res);
for(w=0; w
{
TxBuffer[w] = w;
}
res=f_write(&fl,TxBuffer,PAGE_SIZE,&w);
if(!res)
printf("Write file success,f_write=%x ",res);
else
printf("Write file error,f_write=%x ",res);
f_close(&fl);
printf("Write finish! ");
//for read
printf("Read a file: ");
res=f_open(&fl,"/test2.dat",FA_OPEN_EXISTING| FA_READ);
if(!res)
printf("Open file success,f_open=%x ",res);
else
printf("Open file error,f_open=%x ",res);
for(r=0; r
{
RxBuffer[r] = 0xff;
}
res=f_read(&fl,RxBuffer,PAGE_SIZE,&r);
if(!res)
printf("Read file success, f_read=%x ",res);
else
printf("Read file error, f_read=%x ",res);
printf("Data is: ");
for(r=0; r
{
printf("0x%x ",RxBuffer[r]);
}
f_close(&fl);
printf(" Read finish! ");
//for umount
printf("Umount a equipment: ");
res = f_mount(0,NULL);
if(!res)
printf("Umount equipmentsuccess! ");
else
printf("Umount equipmenterror! ");
return 0;
}
遇到的问题
1. 代码调试中函数未定义
可能是ffconfig.c 中预定义不对
2. 格式化不成功
Flash的sector等相关参数不正确
3. 格式化成功后读写出现错误
可能是你_MAX_SS设置不正确,根本就没有正确格式化,才导致读写错误
后期学习
1. 如何将文件系统加入命令行
2. 深入学习fat的扇区