OpenEdv-开源电子网

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

用FatFs在空白SD卡上创建的第一个文件,写入内容总是错的。

[复制链接]

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
发表于 2017-9-25 10:50:19 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 xuande 于 2017-9-25 11:22 编辑

FatFs 实验,空白 SD 卡,先 f_mount ,再 f_open 创建一个空文件,再 f_lseek 指针后移,然后 f_write 写入新内容,f_close 结束。
单独这么一段测试程序,过程如下图,用仿真器操作,进入 main 以后先人工修改文件名,建立一个文件;之后用 reset 再重复建立文件:

int main(void)
{
u32        i, j, k, l;
SD_Error         SDstatus = SD_OK;
FRESULT        SDresult;
FATFS            FileSystem;
FIL                File;
/*--------------------------------------------*/
SDstatus = SD_Init();                                        // SD 卡初始化。
if        ( SDstatus == SD_OK )
        {
        i = 0;                                                     //临时标志。
        SDresult = f_mount( &FileSystem, "", 0 );                                                           //封装 FatFs 文件系统。
        if        ( SDresult != FR_OK )        {        i = 0xFF;        }
        SDresult = f_open( &File, R_tmp, FA_WRITE | FA_OPEN_ALWAYS );                        //建立文件,文件名在 R_tmp[] 中。
        if        ( SDresult != FR_OK )        {        i = 0xFF;        }
        SDresult = f_lseek( &File, 512 );                                                                        //移动文件读/写指针。
        if        ( SDresult != FR_OK )        {        i = 0xFF;        }

        if        ( i != 0 )        {        i = 0xFF;        }                                                        //创建文件出错,怎么处理?

        //测试例子
        for        ( j=0; j<0xFF; j++ )        R_tmp[ j ] = j;                                                 //准备测试数据。
        SDresult = f_write ( &File, R_tmp, 0xFF, &j );
        SDresult = f_close( &File );

        if        ( ( i == 0xFF ) || ( SDresult != FR_OK ) )         i = 0xFF;
        }

while( 1 );


现在问题是:
因为写数据的指针已经移到后面了,那么前面的内容应当自动、全部填充为一样的数据;
但是,只要是空白卡上建立的第一个文件,前面内容肯定不一致,0 数据中夹了一串字符 a,很莫名其妙;
而第二、第三就正常,全部为 0( NULL)。
如下图:

11.png

困扰几天了。

最佳答案

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

文件系统第一次使用时需要先格式化
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-9-25 10:50:20 | 显示全部楼层
文件系统第一次使用时需要先格式化
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-9-25 10:54:30 | 显示全部楼层
本帖最后由 xuande 于 2017-9-25 10:56 编辑

有意思的是,
那串字符 a 确实是十多天以前的一个实验,在已有文件的固定位置写入固定数量的字符 a。
但那个实验的现场早就变了,板子断电过无数次,程序也改动了无数次,SD卡也格式化、清空过无数次,怎么还能保留下效果呢?

各位帮看看。 @正点原子      @八度空间    @zuozhongkai


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-9-25 11:02:38 | 显示全部楼层

目前这个问题倒也能接受,
因为实际应用里,肯定要回头重新写这段数据,只要覆盖就可以了。
但是心里很不踏实。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-10-17 01:09:03 | 显示全部楼层
xuande 发表于 2017-9-25 10:54
有意思的是,
那串字符 a 确实是十多天以前的一个实验,在已有文件的固定位置写入固定数量的字符 a。
但 ...

SD卡的格式化,并不会把存储的数据全部清掉,而是清掉文件系统部分的东西。
所以数据恢复软件,才可以恢复数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-10-17 22:04:46 | 显示全部楼层
正点原子 发表于 2017-10-17 01:09
SD卡的格式化,并不会把存储的数据全部清掉,而是清掉文件系统部分的东西。
所以数据恢复软件,才可以恢 ...


明白了。多谢!

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-10-18 00:05:33 | 显示全部楼层
xuande 发表于 2017-10-17 22:04
明白了。多谢!

数据存储的问题呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-10-18 11:38:20 | 显示全部楼层
lanlzp 发表于 2017-9-25 10:50
文件系统第一次使用时需要先格式化


分全给你,鼓励答题!

回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-10-18 11:38:46 | 显示全部楼层
正点原子 发表于 2017-10-18 00:05
数据存储的问题呢?


存储是成功的。

回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-11-9
在线时间
10 小时
发表于 2017-11-9 09:34:36 | 显示全部楼层
楼主解决了吗,我在f_open就发生了错误
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-11-9 10:14:15 | 显示全部楼层
Lonely丿Fish 发表于 2017-11-9 09:34
楼主解决了吗,我在f_open就发生了错误


查查返回数值的意思。

回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-11-9
在线时间
10 小时
发表于 2017-11-9 13:57:44 | 显示全部楼层
返回数值是FF,提示是发生其他错误。他不想什么CRC错误,数据接收错误什么的,就给了提示是其他错误
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11533
金钱
11533
注册时间
2014-4-1
在线时间
1313 小时
 楼主| 发表于 2017-11-9 14:07:26 | 显示全部楼层
Lonely丿Fish 发表于 2017-11-9 13:57
返回数值是FF,提示是发生其他错误。他不想什么CRC错误,数据接收错误什么的,就给了提示是其他错误


想办法再深入一下。
还有更详细的提示,比如Disk error,invalid之类。
然后再查原因。

回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2017-11-9
在线时间
10 小时
发表于 2017-11-9 14:32:11 | 显示全部楼层
f_open后显示Disk error,然后我才深入,发现在disk_read底层中,读单块的程序返回数值错误,正常应该是发送CMD17后返还0x00。初始化都是正常的,唯独读写出现问题。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 04:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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