OpenEdv-开源电子网

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

关于原子的FAT_Init(void)函数识别sd卡问题

[复制链接]

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
发表于 2012-10-9 11:48:22 | 显示全部楼层 |阅读模式
原子的FAT_Init(void)函数

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在物理扇区的偏移量
 long long Capacity;
     //u16 a;
  
 Capacity =(long long)SD_GetSectorCount()*512;   //得到SD容量,单位为字节           
 if(Capacity<0xff)return 1;      
 
 if(SD_ReadDisk(fat_buffer,0,1))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的物理扇区偏移     


红框是重点 :4种颜色分别是4个分区信息,DBR的物理扇区偏移:3F 
只读第1分区就会不能正确识别像这样的卡(这卡也只有1个分区,只是 DBR的物理扇区偏移在502-505了)  
一个设备可以最多有四个分区,其他三个分区的相关数据是在fat_buffer[470]/fat_buffer[473],
fat_buffer[486]/fat_buffer[489],fat_buffer[502]/fat_buffer[505]。
我认为都要读,直到fat_buffer[0]=0XEB&&fat_buffer[0]=0XE9为止。


    原来上传的程序有误,重新上传新的             
  

新FAT.rar

16.84 KB, 下载次数: 247

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

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
 楼主| 发表于 2012-10-9 11:54:02 | 显示全部楼层


/取消选择,释放SPI总线
void SD_DisSelect(void)

SD_CS=1;
 SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟 
 }

这是原子的,顺序反了,应该这样:

/取消选择,释放SPI总线
void SD_DisSelect(void)

 SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟 //8个脉冲后才取消片选
 SD_CS=1;
}



 我照这个思路修改了FAT_Init(void)函数
现在能正确识别以前不能正确识别的tf卡了。
sd卡驱动也小改了一下 

回复 支持 反对

使用道具 举报

27

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-8-11
在线时间
0 小时
发表于 2012-10-9 15:04:08 | 显示全部楼层
学习了~~
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2012-10-9 17:31:16 | 显示全部楼层
回复【2楼】ye781205:
---------------------------------
上程序
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-9 23:37:58 | 显示全部楼层
回复【楼主位】ye781205:
---------------------------------
非常好!!
我测试一下,如果确实解决问题的话,我们将免费赠送一套mini板给楼主,以表感谢。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
 楼主| 发表于 2012-10-10 10:42:07 | 显示全部楼层
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 hidsec1[4];             //隐藏的扇区数即为DBR在物理扇区的偏移量
DWORD hidsec;
u8 a=0;
long long Capacity; 

  
Capacity =(long long)SD_GetSectorCount()*512;   //得到SD容量,单位为字节            
if(Capacity<0xff)return 1;       

if(SD_ReadDisk(fat_buffer,0,1))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的物理扇区偏移
 
  hidsec1[0] = fat_buffer[457]*0x1000000+fat_buffer[456]*0x10000+fat_buffer[455]*0x100+fat_buffer[454];      
  hidsec1[1] = fat_buffer[473]*0x1000000+fat_buffer[472]*0x10000+fat_buffer[471]*0x100+fat_buffer[470];   // 第一分区
  hidsec1[2] = fat_buffer[489]*0x1000000+fat_buffer[488]*0x10000+fat_buffer[487]*0x100+fat_buffer[486];      
  hidsec1[3] = fat_buffer[505]*0x1000000+fat_buffer[504]*0x10000+fat_buffer[503]*0x100+fat_buffer[502];

 do
      {   
   if(SD_ReadDisk(fat_buffer,hidsec1[a],1))return 4;
   hidsec=hidsec1[a];    //第1分区物理扇区偏移
   if(a>3)return 5;
   a++;   
   } 
     while(fat_buffer[0]!=0xEB&&fat_buffer[0]!=0xE9);
   // hidsec=0x3f;   /*我的sd卡需要的  测试用*/
//printf("此SD卡的DBR的物理扇区偏移为=%d\n",hidsec) ;
}
else 
{
hidsec=0;      //无MBR,物理扇区0即为DBR
//printf("此SD卡不存在MBR,物理扇区0即为DBR,物理扇区0即为逻辑扇区0.\n"); 
  } 
if(SD_ReadDisk(fat_buffer,hidsec,1))return 3;
//printf("DBR物理扇区偏移量:%d \n",hidsec);
//   printf("开始:\n");
//      for(a=0;a<512;a++)printf("%x ",fat_buffer[a]);//打印MBR扇区数据        
//   printf("结束\n");



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;   
}   
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-12 23:36:33 | 显示全部楼层
测试了我这边一个不能读的卡,结果还是不能读,这卡无敌了...汗....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

186

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1260
金钱
1260
注册时间
2012-9-1
在线时间
67 小时
 楼主| 发表于 2012-10-13 16:30:19 | 显示全部楼层
最新发现,spi时钟有很大关系
有的卡高了不能读
有的卡低了不能读,不解???
有知道是怎么回事的嘛????
难道sd卡的spi模式要匹配时钟??????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-13 17:54:54 | 显示全部楼层
初始化的时候不能太高吧?初始化过了就好,我记得SD卡是支持25M的SPI
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-20 04:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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