OpenEdv-开源电子网

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

原子的FAT_Init()函数里读出的DRB数据为什么都没有经过小端转大端,但读出的数据经验证是对的?

[复制链接]

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2011-10-24 22:48:47 | 显示全部楼层 |阅读模式

如题:
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;
 u32 Capacity,DBR_Sector; 
  u8 i;
 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的
 bs = (bootsector710 *)fat_buffer;     //(bootsector710 *)fat_buffer:把数组fat_buffer转换为指向结构类型bootsector710 的指针,然后赋给结构指针bs
 pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition   第一分区
 hidsec = pr->prStartLBA;//the hidden sectors    得DBR所在的物理扇区偏移扇区数。在DBR之前的扇区数是隐藏的。比如说这里DBR的偏移,为什么没有小端转大端,读出的数据经验证是对的???
 if(hidsec >= Capacity/512)hidsec = 0; 
 else
 {
  if(SD_ReadSingleBlock(pr->prStartLBA,fat_buffer))return 3;//read the bpb sector  即DBR扇区,里面的(第12~90字节是BPB)
  bs = (bootsector710 *)fat_buffer;
  if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
  {
   hidsec = 0;
   if(SD_ReadSingleBlock(0,fat_buffer))return 4;//read the bpb sector
   bs = (bootsector710 *)fat_buffer; 
  }
 }  
 if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 5;//对付没有bootsect的sd卡 //dead with the card which has no bootsect
 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;//第一个数据扇区
 return 0;

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2011-10-25 00:10:03 | 显示全部楼层
回复【楼主位】螃蟹爱虫:
---------------------------------
这里是利用stm32自身的大小端方式强制转换的.
采用结构体强制转换,在转换过程中,对几个字节的成员,采用的是STM32自身的大小端方式,去取结果的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2011-10-21
在线时间
0 小时
发表于 2011-10-25 01:29:40 | 显示全部楼层
哦,学习了,我说怎么好多强制转换
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
 楼主| 发表于 2011-10-25 22:29:44 | 显示全部楼层
经查看STM32中文参考手册_V10.pdf,P27页,存储器组织有专门的说明,STM32是以小端形式保存数据的,与计算机一样,所以不用转换的。
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
 楼主| 发表于 2011-10-25 22:31:13 | 显示全部楼层
所以原子采用结构体的方式非常的好,这样读出的数据直接就是正确的了,就可以省去每次读取数据都要转换这一步了。
回复 支持 反对

使用道具 举报

14

主题

101

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
493
金钱
493
注册时间
2011-9-6
在线时间
3 小时
发表于 2011-10-26 09:10:34 | 显示全部楼层
大端模式与小段模式的区别 http://www.cnblogs.com/TsuiLei/archive/2008/10/29/1322504.html
事无巨细 循序渐进
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2012-8-26
在线时间
0 小时
发表于 2012-8-26 15:30:02 | 显示全部楼层
meg32做此文件系统,也可以用此强制转换吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 13:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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