OpenEdv-开源电子网

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

FATFS移植求助

[复制链接]

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
发表于 2015-5-31 08:43:56 | 显示全部楼层 |阅读模式
5金钱
请教,我的FATFS代码有什么问题,就是读不出文件里面的内容,我在电脑上文件里面存的内容是“this is a test”。LCD显示内容如下,程序如下,请指教。
SD card OK!
file system OK!
open ok
read ok
ab乱码乱码


程序如下:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h" 
#include "lcd.h"
#include "mmc_sd.h"
//#include "FAT.h"
//#include "text.h"
//#include "fat.h"
//#include "fontupd.h"
//#include "sysfile.h"
#include "spi.h"
//#include "jpegbmp.h"
#include "ff.h"
#include "diskio.h"
#include "string.h"
//#include "cc936.c"
//#include "ccsbcs.c"
//Mini STM32开发板范例代码1
//跑马灯实验   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com  
//u8 buf[512];//SD卡数据缓存区
/* file objects */
FATFS fs123; /* Work area (file system object) for logical drives */
FRESULT res; 
UINT br, bw;             /* File R/W count */
FIL fnew123;
BYTE buffer123[512]={0};        /* file copy buffer */
BYTE textFileBuffer[] = "Welcome to use Wildfire iso stm32 Development Board today is a good day";

int main(void)
{
    
 
     
     BYTE i;
u8 abcd;
     
   
 
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,9600); //串口初始化为9600
LED_Init();   //初始化与LED连接的硬件接口
KEY_Init();          //初始化与按键连接的硬件接口
    

//i= SD_Init();

LCD_Init();       //初始化液晶屏
// SPI_Flash_Init();   //SPI FLASH使能


i=disk_initialize(0);
if(i!=0)
LCD_ShowString(0,20,"SD card error!");//SD卡初始化失败
else
LCD_ShowString(0,20,"SD card OK!");//SD卡初始化OK
 
    buffer123[0]='a';
buffer123[1]='b';

/* Register work area for each volume (Always succeeds regardless of disk status) */
res=f_mount(&fs123,"qiu",0);
if(res!=0)
LCD_ShowString(0,40,"file system error!");//文件系统加载失败
else
LCD_ShowString(0,40,"file system OK!");//文件系统加载OK

// f_mkdir("sub");

// if ( res == FR_OK )
// {
// LCD_ShowString(0,60,"make ok");
// }
// else  { 
// abcd=res;
// LCD_ShowNum(0,80,abcd,5,16); }

// f_mkdir("sub/sub1");

/* function disk_initialize() has been called in f_open */
 
/* Create new file on the drive 0 */
 
res = f_open(&fnew123, "0:/test.txt", FA_OPEN_EXISTING | FA_READ);//f_open(&fnew123, "0:/test.txt", FA_CREATE_ALWAYS | FA_WRITE );
abcd=res; 
if ( res == FR_OK )
{
LCD_ShowString(0,60,"open ok");
res = f_read(&fnew123, buffer123, 12, &br);//f_write(&fnew123, textFileBuffer, sizeof(textFileBuffer), &bw);
if ( res == FR_OK ) 
 {LCD_ShowString(0,80,"read ok");
 for(i=0;i<8;i++)
  {  
   LCD_ShowChar(i*6,100,buffer123);
  }
 
 }
else  { 
abcd=res;
LCD_ShowNum(0,80,abcd,5,16); }
f_close(&fnew123);         
}
else LCD_ShowNum(0,60,abcd,5,16);//LCD_ShowString(0,60,"open error");

//res = f_open(&fnew123, "0:newfile1.txt", FA_OPEN_EXISTING | FA_READ);  
//res = f_read(&fnew123, buffer, sizeof(buffer), &br); 




//f_close(&fnew123);                                      
 
    

while(1);  
  
   
 
}

最佳答案

查看完整内容[请看2#楼]

回复【11楼】正点原子: --------------------------------- 我搞定了,我用MINI板的试验程序移植到小苗板上,成功了
玩好四轴
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
 楼主| 发表于 2015-5-31 08:43:57 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我搞定了,我用MINI板的试验程序移植到小苗板上,成功了
玩好四轴
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-31 19:25:08 | 显示全部楼层
是ANSI编码么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
 楼主| 发表于 2015-5-31 19:41:47 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
932,936试了都不行
玩好四轴
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-31 19:46:00 | 显示全部楼层
仿真看下吧。看看是什么数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
 楼主| 发表于 2015-5-31 20:20:02 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
仿真时,跟踪到f_read函数时,btr参数进来时一直是0X200,执行到if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */这句时,btr变为0,然后就不执行for循环了。

FRESULT f_read (
FIL* fp,  /* ointer to the file object */
void* buff, /* ointer to data buffer */
UINT btr, /* Number of bytes to read */
UINT* br /* ointer to number of bytes read */
)
{
FRESULT res;
DWORD clst, sect, remain;
UINT rcnt, cc;
BYTE csect, *rbuff = (BYTE*)buff;


*br = 0; /* Clear read byte counter */

res = validate(fp); /* Check validity */
if (res != FR_OK) LEAVE_FF(fp->fs, res);
if (fp->err) /* Check error */
LEAVE_FF(fp->fs, (FRESULT)fp->err);
if (!(fp->flag & FA_READ))  /* Check access mode */
LEAVE_FF(fp->fs, FR_DENIED);
remain = fp->fsize - fp->fptr;
if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */

for ( ;  btr; /* Repeat until all data read */
rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) {
if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */
csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */
if (!csect) { /* On the cluster boundary? */
if (fp->fptr == 0) { /* On the top of the file? */
clst = fp->sclust; /* Follow from the origin */
} else { /* Middle or end of the file */
#if _USE_FASTSEEK
if (fp->cltbl)
clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */
else
#endif
clst = get_fat(fp->fs, fp->clust); /* Follow cluster chain on the FAT */
}
if (clst < 2) ABORT(fp->fs, FR_INT_ERR);
if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR);
fp->clust = clst; /* Update current cluster */
}
sect = clust2sect(fp->fs, fp->clust); /* Get current sector */
if (!sect) ABORT(fp->fs, FR_INT_ERR);
sect += csect;
cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */
if (cc) { /* Read maximum contiguous sectors directly */
if (csect + cc > fp->fs->csize) /* Clip at cluster boundary */
cc = fp->fs->csize - csect;
if (disk_read(fp->fs->drv, rbuff, sect, cc) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
#if !_FS_READONLY && _FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */
#if _FS_TINY
if (fp->fs->wflag && fp->fs->winsect - sect < cc)
mem_cpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs));
#else
if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc)
mem_cpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs));
#endif
#endif
rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */
continue;
}
#if !_FS_TINY
if (fp->dsect != sect) { /* Load data sector if not in cache */
#if !_FS_READONLY
if (fp->flag & FA__DIRTY) { /* Write-back dirty sector cache */
if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
fp->flag &= ~FA__DIRTY;
}
#endif
if (disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) /* Fill sector cache */
ABORT(fp->fs, FR_DISK_ERR);
}
#endif
fp->dsect = sect;
}
rcnt = SS(fp->fs) - ((UINT)fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */
if (rcnt > btr) rcnt = btr;
#if _FS_TINY
if (move_window(fp->fs, fp->dsect) != FR_OK) /* Move sector window */
ABORT(fp->fs, FR_DISK_ERR);
mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* ick partial sector */
#else
mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* ick partial sector */
#endif
}

LEAVE_FF(fp->fs, FR_OK);
}
玩好四轴
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-1 00:24:53 | 显示全部楼层
说明remain为0了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
 楼主| 发表于 2015-6-1 19:12:03 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
关键我就是想问remain为何为0,我没给他赋值,并且我是第一次读文件啊
玩好四轴
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-1 21:45:58 | 显示全部楼层
回复【7楼】qiujiafu:
---------------------------------
这我就不知道你了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
 楼主| 发表于 2015-6-1 22:56:13 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
我还有一个问题请教,为什么我的SD卡必须格式化成FAT16,上面的那些现象才能出来,如果格式化成FAT默认,哪么f_open返回的错误就是1,我查了一下是磁盘错误,这是为什么?
还有就是 fp->fsize , fp->fptr;这两个参数是在哪个函数里给赋值的,我用watch观察一直是0X0000000.但是从我主程序看的话f_mount,f_open返回值都是FR_OK,说明成功的啊。
玩好四轴
回复

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-5-31
在线时间
7 小时
 楼主| 发表于 2015-6-2 22:06:23 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,帮忙啊
玩好四轴
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-3 23:30:21 | 显示全部楼层
回复【9楼】qiujiafu:
---------------------------------
fatfs核心代码,我也没有研究,你慢慢查下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 15:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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