金牌会员
 
- 积分
- 1970
- 金钱
- 1970
- 注册时间
- 2011-7-17
- 在线时间
- 4 小时
|
//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,所以初始化文件系统不成功。
|
|