OpenEdv-开源电子网

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

原子哥,螃蟹爱虫进来看啊~~~关于最新版本的Fat文件系统初始化函数

[复制链接]

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2011-11-18 18:33:08 | 显示全部楼层 |阅读模式
//FAT初始化,不含SD的初始化,用之前应先调用sd的初始化
//返回值:0,初始化成功
//    其他,初始化失败  
unsigned char FAT_Init(void)//Initialize of FAT  need initialize SD first
{      
 bootsector710 *bs  = 0;       //定义DBR结构体,包含BPB部分(12~90字节是BPB)
 bpb710        *bpb = 0;       //定义BPB结构体    
 partrecord    *pr  = 0;       //定义硬盘信息 结构休      (16字节)
 DWORD hidsec=0;             //隐藏的扇区数即为DBR在物理扇区的偏移量
// u32 Capacity;  
 //Capacity = SD_GetCapacity();   //得到SD容量,单位为字节            
 //if(Capacity<0xff)return 1;      
 
 if(SD_ReadSingleBlock(0,fat_buffer))return 2; //读物理扇区0。即MBR(其中MBR内的硬盘分区表中有DBR的地址信息),如没有MBR,则为DBR。经测试,我的SD卡是有MBR的
 if(fat_buffer[0]!=0XEB&&fat_buffer[0]!=0XE9)  //如物理0扇区第一字节不为0XEB或0XE9,则存在MBR,否则不存在
  {        
  //printf("此SD卡的物理扇区0为MBR\n");
  pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition       第一分区
  hidsec=pr->prStartLBA;   //隐藏的扇区 即DBR的物理扇区偏移
  //printf("此SD卡的DBR的物理扇区为=%d\n",hidsec) ;
 }
 else
 {
  hidsec=0;      //无MBR,物理扇区0即为DBR
  //printf("此SD卡不存在MBR,物理扇区0即为DBR,物理扇区0即为逻辑扇区0.\n");
  }
 if(SD_ReadSingleBlock(hidsec,fat_buffer))return 3;
 //printf("DBR物理扇区偏移量:%d \n",hidsec);
 bs = (bootsector710 *)fat_buffer;
 bpb = (bpb710 *)bs->bsBPB;
 if(bpb->bpbFATsecs)//detemine thd FAT type  do not support FAT12
 {
  FAT32_Enable=0;        //FAT16
  FATsectors     = bpb->bpbFATsecs; //FAT表占用的扇区数
  FirstDirClust = 2;
 }
 else
 {
  FAT32_Enable=1;        //FAT32
  FATsectors     = bpb->bpbBigFATsecs;//FAT占用的扇区数
  FirstDirClust = bpb->bpbRootClust;
 }  
 BytesPerSector   = bpb->bpbBytesPerSec;          //每扇区字节数
 SectorsPerClust   = (BYTE)bpb->bpbSecPerClust;    //每簇扇区数
 FirstFATSector   = bpb->bpbResSectors+hidsec;    //第一个FAT表扇区
 RootDirCount   = bpb->bpbRootDirEnts;           //根目录项数
 RootDirSectors   = (RootDirCount*32)>>9;          //根目录占用的扇区数
 FirstDirSector   = FirstFATSector+bpb->bpbFATs*FATsectors; //第一个目录扇区
 FirstDataSector   = FirstDirSector+RootDirSectors;   //第一个数据扇区
 //printf("每扇区字节数:%d \n",BytesPerSector);
 //printf("每簇扇区数:%d \n",SectorsPerClust);
 //printf("第一个FAT表扇区:%d \n",FirstFATSector);
 //printf("根目录项数:%d \n",RootDirCount);
 //printf("根目录占用的扇区数:%d \n",RootDirSectors);
 return 0;  
}

以上文件 系统初始化函数是螃蟹爱虫修改过来的,在初始化刚开始的时候,加入了读取容量的语句,根据测试,部分山寨SD卡不能通过CSD寄存器读取内存卡容量,所以注释掉这三行语句,便可以支持一些山寨SD卡。


山寨SD卡电脑端读取容量截图:


这个山寨SD卡在STM32上读取到的容量为0.


经过实验,山寨SD卡读取CSD寄存器,指令是接受的,但卡返回来的CSD数据全部是0xff,就是因为这个原因,导致了读取的容量数值少于0xff,所以初始化文件系统不成功。
Time?And?Relative?Dimension?In?Space.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-18 19:35:37 | 显示全部楼层
回复【楼主位】Tardis:
---------------------------------
是有这个问题.
我也没搞明白sd卡的真正容量应该如何获取.
根据资料是读取CSD的内荣,但是其实有的卡读出来容量是不对的,但在windows上面,读取出来就是对的.这个应该是通过别的方法读出来的.有时间验证一下,看看fatfs读出的容量是否正常.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-18 20:03:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
归根到底,还是SD卡容量检测问题,我得研究一下电脑上是怎么检测SD卡容量的。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2011-11-18 21:28:36 | 显示全部楼层
因手头没有山寨SD卡,所以无从测试。以楼主的测试看来,山寨SD卡在有些地方做得不够规范啊。。。
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2011-11-18 21:57:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子兄,我认为真正的SD容量为:总的扇区数*每扇区多少字节。我也实验测试过,如在后面加上一句算上总扇区数
AllSectors=bpb->bpbHugeSectors*bpb->bpbBytesPerSec; //总的扇区数。
AllSectors>>=20;
printf("此SD卡容量为:%d MB\n",AllSectors);

得出的MB数与在SD卡实验中是一样的。但如果是字节数,两个实验得出的是不一样的。我的2G卡,在两个实验中得出的都为1910MB,
但如果单位为B的:则SD卡实验中的为:2006974464字节;而在显示汉字实验中用总扇区数*每扇区字节数的方法计算得2002780160字节,刚好为1910*1024*1024。
因为我觉得SD卡应该是整数个扇区,所以我觉得真正的容量应为总的扇区数*每扇区多少字节,大家觉得呢?
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-19 00:17:15 | 显示全部楼层
回复【4楼】螃蟹爱虫:
---------------------------------
确实,相当不规范,山寨SD卡他们做的标准就是能读就得,我手头上有一个2G的山寨SD卡,市面上购买才12元,能读能写,CSD寄存器,CID寄存器的指令是接受的,但返回值全部为0xff。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-19 00:23:00 | 显示全部楼层
回复【5楼】螃蟹爱虫:
---------------------------------
我也觉得是总的扇区数×512(一般每个扇区512字节),从而得到总的字节数,我觉得,如果从CSD寄存器读取出来的数值算容量的话,不太准确,因为实验测得,读出来的数据和电脑上很大出入,一般电脑上的偏小,我觉得电脑上是根据文件系统来读取容量的,一般卡没有格式化,电脑上显示的容量为0字节,如果没格式化,电脑是根据CSD寄存器来算容量的,就一般不会显示0字节了(除非微软就是这么蛋痛,不格式化不给你看容量,那没办法)。
也很神奇,电脑格式化不同文件系统,读取到的卡容量也不同,估计还真是根据文件系统得到的实际容量啊,估计CSD里的那个应该是“物理容量”吧。




没有NTFS的选项,估计2G卡不支持这个文件系统。 
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-19 00:35:42 | 显示全部楼层
回复【7楼】Tardis:
---------------------------------
实际试验一下?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-20 09:15:15 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
怎么试?在一个大于物理地址的地址上随便写入一个数据,然后读回,如果正确,就证明那个是物理地址?
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-20 09:36:33 | 显示全部楼层
回复【9楼】Tardis:
---------------------------------
windows格式化一下,然后分别用winhex和单片机读到的数据进行计算查看是否一致.
另外你不是说等于扇区数*512嘛,那么你从文件系统里面得到总扇区数,在计算,看看是否一致?哪个更准确?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-20 15:28:59 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
在重写SD卡驱动,我的SD卡驱动被杀毒软件干掉了,刚才测得winHEX读到的SD卡容量和单片机的一致。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-20 16:03:53 | 显示全部楼层
杀毒软件还爱干这事?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-20 17:47:56 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
的确,估计我的代码中有一部分吓到了杀毒软件,所以被删了。
顺便共享一下测试杀毒软件好坏的代码:

--------我是分割线,不要复制我,复制我下面的代码------------------------------------
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 
--------我也是分割线,不要复制我,复制我上面的代码----------------------------------
只需要把上述代码复制到一个记事本里,保存为txt文件就可以立刻知道杀毒软件的好坏。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-20 22:15:08 | 显示全部楼层
威武!!!
我的node32立马发现问题.说是一个什么测试来的.删除了被.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
 楼主| 发表于 2011-11-21 13:35:42 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
呵呵,如果有些杀毒软件没反应的话,那可以卸载那个杀毒软件了。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2011-12-16 15:15:06 | 显示全部楼层
360果然不行  要打开它才有反映
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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