野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30730|回复: 13

sd卡移植FATFs,程序卡死在f_mount()里面的fmt = check_fs(fs, bsect);

[复制链接]
发表于 2019-5-19 22:23:07 | 显示全部楼层 |阅读模式
本帖最后由 123nan 于 2019-5-19 22:32 编辑

我给sd卡移植FATFs,程序卡死在f_mount()里面的fmt = check_fs(fs, bsect);                                        /* Load sector 0 and check if it is an FAT boot sector as SFD */
,不知道如何解决,希望大佬解决一下。拜托了。萌新,发错地方了是F1-指南者里的问题。

FatFs.zip

1.14 MB, 下载次数: 36

回复

使用道具 举报

发表于 2019-5-20 09:02:47 | 显示全部楼层
直接用火哥的移植方式
回复 支持 反对

使用道具 举报

发表于 2019-5-20 09:32:15 | 显示全部楼层
我看了你的代码有两个疑问:
1、在diskio.c中,我不知到为啥disk_read和disk_write这两函数为啥在特定的情况下递归地调用自己,正常不会这么做     

      Snipaste_2019-05-20_09-28-04.png     Snipaste_2019-05-20_09-27-15.png

2、如果你的低层驱动没问题,你在使用f_moute之前SD卡是不是有文件系统(即格式化)。
     如果没有,就用f_mkfs函数制作FAT文件系统

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 12:34:16 | 显示全部楼层
本帖最后由 123nan 于 2019-5-20 12:40 编辑
huohua1991 发表于 2019-5-20 09:32
我看了你的代码有两个疑问:
1、在diskio.c中,我不知到为啥disk_read和disk_write这两函数为啥在特定的情 ...

1、我是从《SDIO—FatFs移植与读写测试》看的。这个程序没有问题。
2、main.c中有判断没有格式化先格式化。3、这个问题是卡死在初始化上了,我把路径地址改位SPI FLASH初始化化没问题。我觉得我是对sd卡的相关配置,没弄好。没有思路,不知道该怎么办?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 12:35:48 | 显示全部楼层
本帖最后由 123nan 于 2019-5-20 13:20 编辑
左丘冰 发表于 2019-5-20 09:02
直接用火哥的移植方式

我是看火哥的移植方式出的问题没找到原因
回复 支持 反对

使用道具 举报

发表于 2019-5-20 14:26:09 | 显示全部楼层
123nan 发表于 2019-5-20 12:34
1、我是从《SDIO—FatFs移植与读写测试》看的。这个程序没有问题。
2、main.c中有判断没有格式化先格式 ...

你尝试将diskio.c中,在disk_read和disk_write这两函数里,注释我给你圈出来的代码,即读或写时,都
不要去判断数据缓存区的地址是否4字节对齐
回复 支持 反对

使用道具 举报

发表于 2019-5-20 14:38:59 | 显示全部楼层
123nan 发表于 2019-5-20 12:34
1、我是从《SDIO—FatFs移植与读写测试》看的。这个程序没有问题。
2、main.c中有判断没有格式化先格式 ...

我认为disk_read和disk_write中判断数据缓存区的地址不是4字节对齐时不应该递归调用本身,
对于disk_read,判断数据缓存区的地址不是4字节对齐时,应调用
SD_ReadBlock((void *)scratch,(uint64_t)(sector++)*SD_BLOCKSIZE,SD_BLOCKSIZE);

对于disk_write,判断数据缓存区的地址不是4字节对齐时,应调用
SD_WriteBlock((void *)scratch,(uint64_t)(sector++)*SD_BLOCKSIZE,SD_BLOCKSIZE);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 20:21:42 | 显示全部楼层
huohua1991 发表于 2019-5-20 14:38
我认为disk_read和disk_write中判断数据缓存区的地址不是4字节对齐时不应该递归调用本身,
对于disk_rea ...

不对,DRESULT disk_write (
        BYTE pdrv,                          /* é豸Îïàí±àoÅ(0..) */
        const BYTE *buff,        /* óûD′èëêy¾YμÄ»o′æÇø */
        DWORD sector,                  /* éèÇøê×μØÖ· */
        UINT count                          /* éèÇø¸öêy(1..128) */
)返回值类型是DRESULT。而且野火pdf上也是这样写的。SD_WriteBlock((void *)scratch,(uint64_t)(sector++)*SD_BLOCKSIZE,SD_BLOCKSIZE);的类型是SD_Error。
回复 支持 反对

使用道具 举报

发表于 2019-5-20 22:48:00 | 显示全部楼层
123nan 发表于 2019-5-20 20:21
不对,DRESULT disk_write (
        BYTE pdrv,                          /* é豸Î&#239 ...

我对你无语了,这么简单的转换也不会,谁也帮不了你
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 10:02:16 | 显示全部楼层
本帖最后由 123nan 于 2019-5-21 10:48 编辑
huohua1991 发表于 2019-5-20 22:48
我对你无语了,这么简单的转换也不会,谁也帮不了你

转换是指把这个类型用SD ERROR 替换吗?如果是这样ff.c中的程序都要改,因为枚举类型内容都不同,判断的值都不同。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-21 12:51:00 | 显示全部楼层
huohua1991 发表于 2019-5-20 22:48
我对你无语了,这么简单的转换也不会,谁也帮不了你

大哥别生气,我刚学好多都不懂。我又试了下还是不行。
TIM图片20190521124810.png
TIM图片20190521124945.png
回复 支持 反对

使用道具 举报

发表于 2021-1-7 17:36:59 | 显示全部楼层
我也遇到这个问题了。火哥的diskio.c应该有问题..
我之前读sd卡的时候都是用火哥的驱动是好的。
后来我用了一张tf卡,遇到了你说的这个问题,会卡死。

然后用原子的驱动去读写就没问题.
问题具体出在哪里我看不懂..
回复 支持 反对

使用道具 举报

发表于 2021-1-7 18:33:07 | 显示全部楼层
flyingPiggy 发表于 2021-1-7 17:36
我也遇到这个问题了。火哥的diskio.c应该有问题..
我之前读sd卡的时候都是用火哥的驱动是好的。
后来我用了 ...

不对,不是驱动的问题。具体原因还没找到...挺神奇的一个问题..
回复 支持 反对

使用道具 举报

发表于 2021-1-8 09:00:58 | 显示全部楼层
flyingPiggy 发表于 2021-1-7 18:33
不对,不是驱动的问题。具体原因还没找到...挺神奇的一个问题..

我找到原因了,因为SD卡接触不良....
正好用原子例程的时候每次都成功,换一个野火的就卡死。
我还以为是软件的原因,找了好久,把两边的diskio.c换了一下,然后还是不行。

后来我发现用手按压sd可以了,因为用的是tf卡焊接在一个小板子上,然后用杜邦线跳的方式,所以接触有点不好。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 01:50 , Processed in 0.049669 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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