打印

SD+FATFS+2440求助

[复制链接]
3382|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
386452199|  楼主 | 2011-5-17 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FATFS, sd, se, ce, ck
if (LD_WORD_fat(&fs->win[BS_55AA]) != 0xAA55)               /* Check record signature (always placed at offset 510 even if the sector size is >512) */
        return 2;
我的程序到这里就返回了,返回2。不知道是哪里出错了

相关帖子

沙发
byhoo| | 2011-5-17 16:35 | 只看该作者
我是这样搞的,先申请一个变量 WORD temp;
temp = LD_WORD_fat(&fs->win[BS_55AA]);
if(temp != 0xAA55)
  return 2;

有更好的方法可以告诉我,hby2003@gmail.com

使用特权

评论回复
板凳
386452199|  楼主 | 2011-5-17 16:44 | 只看该作者
:)谢谢,一起学习

使用特权

评论回复
地板
386452199|  楼主 | 2011-5-17 17:11 | 只看该作者
:'(还是一个样

使用特权

评论回复
5
byhoo| | 2011-5-17 18:05 | 只看该作者
那看你有没有读取数据出来,数据读错了话肯定是不对的

使用特权

评论回复
6
386452199|  楼主 | 2011-5-17 18:41 | 只看该作者
#define BS_55AA                                510
但是我在510读的不是0XAA55倒是在508读出的是0X55AA,我的程序设的是小端,不知道是不是这个问题

使用特权

评论回复
7
byhoo| | 2011-5-17 20:51 | 只看该作者
哦,在2440用SDIO读取SD卡的时候,需要把SDIO模块设置成大端模式,因为SD内的数据是大端模式的顺序排列的

使用特权

评论回复
8
386452199|  楼主 | 2011-5-17 21:21 | 只看该作者
#define BS_55AA                                510
这里要改吗?

使用特权

评论回复
9
byhoo| | 2011-5-17 21:39 | 只看该作者
不是这里,在设置SDIO模块的寄存器里面改
SDICON 的 bit4,你选择 TYPEA,试试看看

使用特权

评论回复
10
386452199|  楼主 | 2011-5-17 21:50 | 只看该作者
谢谢你的回复,是这样的,我刚改了TYPEA
rSDICON=(0<<4)|1;
但还是不对,rcv_tmp=rSDIDAT;最后这里rcv_tmp=aa550000,在地址中为000055aa,原因是
*(BYTE_fat*)(buff++)=(BYTE_fat)(rcv_tmp);
*(BYTE_fat*)(buff++)=(BYTE_fat)((WORD_fat)(rcv_tmp)>>8);
*(BYTE_fat*)(buff++)=(BYTE_fat)((DWORD_fat)(rcv_tmp)>>16);
*(BYTE_fat*)(buff++)=(BYTE_fat)((DWORD_fat)(rcv_tmp)>>24);  

这里我是这样改的
WORD_fat  LD_WORD( BYTE_fat *ptr)
{   
   return (WORD_fat)(((WORD_fat)*(BYTE_fat*)((ptr)+1)<<8)|(WORD_fat)*(BYTE_fat*)(ptr))+1);
   
}
但最后temp = LD_WORD(&fs->win[BS_55AA]);
这里temp还是为0

使用特权

评论回复
11
starnoob| | 2011-5-17 21:54 | 只看该作者
不错啊

使用特权

评论回复
12
386452199|  楼主 | 2011-5-17 21:56 | 只看该作者
:'(可是不对啊

使用特权

评论回复
13
386452199|  楼主 | 2011-5-17 23:28 | 只看该作者
问题解决,是2440里大小端的问题rSDICON=(0<<4)|1;
设为这样就可以了。其它的用网上的程序就可。
现在if (LD_WORD_fat(&fs->win[BS_55AA]) != 0xAA55)  这里没问题了,但是再向下就又不对了
res = follow_path(&dj, path);
到上面这里,res = FR_DISK_ERR
还不知道是怎么错的,继续努力,也希望这个贴子能对和我一样正在学SD+FATFS的人有所帮忙

使用特权

评论回复
14
386452199|  楼主 | 2011-5-17 23:31 | 只看该作者
错了,是这里不对的
res = follow_path(&dj, path);        /* Follow the file path */

使用特权

评论回复
15
byhoo| | 2011-5-18 08:29 | 只看该作者
注意读写SD驱动函数的参数...
我帮你找找我的移植的调试笔记吧...就几个要点,

使用特权

评论回复
16
byhoo| | 2011-5-18 09:26 | 只看该作者
本帖最后由 byhoo 于 2011-5-18 09:28 编辑

其实坛子里有人搞过,现在才看到,你可以参考下
https://bbs.21ic.com/frame.php?frameon=yes&referer=http%3A//bbs.21ic.com/icnewest.html

使用特权

评论回复
17
386452199|  楼主 | 2011-5-18 09:32 | 只看该作者
:)是有个贴子这里,我的disk_read 就是用xfcjava2大虾的
[ARM 论坛] 主题:移植FATFS到S3C2440的SD卡上遇到的困难,请高手指点

但我的程序跑到res = follow_path(&dj, path); 这里时返回FR_NO_FILE

使用特权

评论回复
18
386452199|  楼主 | 2011-5-18 12:17 | 只看该作者
:'(继续求助啊,我发现程序第一次在dir_find中的
do
{
......................
}
while(res == FR_OK);
中是对的
但再次循环时,也就是第二次do时c = dir[DIR_Name];
这里C = 0
在ff.h中
#define        DIR_Name                        0
查dir[DIR_Name]地址为0X33FF3604
其数据为
0x33ff3604       00 8A 07 00
不知道是哪里设的不对了,大虾们帮帮忙吧,谢谢

使用特权

评论回复
19
byhoo| | 2011-5-18 20:19 | 只看该作者
不好意思,我的笔记放在家里的电脑上,我放到网上了 ,很多细节没有涉及,你可以参考下
http://blog.chinaunix.net/space. ... =blog&id=324524

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

23

帖子

1

粉丝