📄 sdfilelib.lst
字号:
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SDFILELIB
OBJECT MODULE PLACED IN SdFileLib.OBJ
COMPILER INVOKED BY: D:\silabs\IDEFILES\C51\BIN\C51.EXE SdFileLib.c DEBUG OBJECTEXTEND TABS(2)
stmt level source
1 #include <c8051f020.h>
2 #include <math.h>
3 #include <stdlib.h>//调用 atoi函数
4 //--------------------------------
5 struct FAT32_FAT_Item
6 {
7 unsigned char Item[4];
8 };
9 //-----------------------------------
10 struct FAT32_FAT
11 {
12 struct FAT32_FAT_Item Items[128];
13 };
14
15 /*
16 FAT32中对BPB的定义如下 一共占用90个字节
17 */
18 struct FAT32_BPB
19 {
20 unsigned char BS_jmpBoot[3]; //跳转指令 offset: 0
21 unsigned char BS_OEMName[8]; // offset: 3
22 unsigned char BPB_BytesPerSec[2];//每扇区字节数 offset:11
23 unsigned char BPB_SecPerClus[1]; //每簇扇区数 offset:13
24 unsigned char BPB_RsvdSecCnt[2]; //保留扇区数目 offset:14
25 unsigned char BPB_NumFATs[1]; //此卷中FAT表数 offset:16
26 unsigned char BPB_RootEntCnt[2]; //FAT32为0 offset:17
27 unsigned char BPB_TotSec16[2]; //FAT32为0 offset:19
28 unsigned char BPB_Media[1]; //存储介质 offset:21
29 unsigned char BPB_FATSz16[2]; //FAT32为0 offset:22
30 unsigned char BPB_SecPerTrk[2]; //磁道扇区数 offset:24
31 unsigned char BPB_NumHeads[2]; //磁头数 offset:26
32 unsigned char BPB_HiddSec[4]; //FAT区前隐扇区数 offset:28
33 unsigned char BPB_TotSec32[4]; //该卷总扇区数 offset:32
34
35 unsigned char BPB_FATSz32[4]; //一个FAT表扇区数 offset:36
36 unsigned char BPB_ExtFlags[2]; //FAT32特有 offset:40
37 unsigned char BPB_FSVer[2]; //FAT32特有 offset:42
38 unsigned char BPB_RootClus[4]; //根目录簇号 offset:44
39 unsigned char FSInfo[2]; //保留扇区FSINFO扇区数offset:48
40 unsigned char BPB_BkBootSec[2]; //通常为6 offset:50
41 unsigned char BPB_Reserved[12]; //扩展用 offset:52
42 unsigned char BS_DrvNum[1]; // offset:64
43 unsigned char BS_Reserved1[1]; // offset:65
44 unsigned char BS_BootSig[1]; // offset:66
45 unsigned char BS_VolID[4]; // offset:67
46 unsigned char BS_FilSysType[11]; // offset:71
47 unsigned char BS_FilSysType1[8]; //"FAT32 " offset:82
48 };
49
50
51 //-----------------------------------------
52 xdata struct file_content_info
53 {
54 unsigned long file_size; //文件的大小
55 unsigned long frist_clust; //文件的起始簇
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 2
56 unsigned long current_clust; //第几族
57 unsigned char current_sector; //一族中的第几扇
58 unsigned int current_byte; //一扇中的第几字节
59 unsigned long file_name_sector; //文件名所在的扇区
60 unsigned int file_name_byte; //文件名在的字节位置
61 }file[5];
62 /*
63 FAT32初始化时初始参数装入如下结构体中
64 */
65 struct FAT32_Init_Arg
66 {
67 unsigned long Total_Sectors; //磁盘的总容量
68 unsigned long FirstDirClust; //根目录的开始簇
69 unsigned long FirstDataSector; //文件数据开始扇区号
70 unsigned int BytesPerSector; //每个扇区的字节数
71 unsigned int FATsectors; //FAT表所占扇区数
72 unsigned int SectorsPerClust; //每簇的扇区数
73 unsigned long FirstFATSector; //第一个FAT表所在扇区
74 unsigned long FirstDirSector; //第一个目录所在扇区
75 // unsigned long RootDirSectors; //根目录所占扇区数
76 // unsigned long RootDirCount; //根目录下的目录与文件数
77 };
78 //---------------------------------------------------------------
79 xdata unsigned char FAT32_Buffer[512] ; //扇区数据读写缓冲区
80 //xdata unsigned char FAT_Buffer[512]; //操作FAT时数据读缓冲区
81 xdata struct FAT32_Init_Arg Init_Arg1; //初始化参数结构体实体
82 //struct FileInfoStruct FileInfo; //文件信息结构体实体
83 unsigned long xdata se=0; //要操作的扇区数
84 //unsigned long xdata current_clust;
85 //unsigned int xdata clust_num;
86 unsigned char xdata file_num=0,file_byte=0xff; //打开文件的数目
87 //unsigned char xdata hzk[1024]; //存放液晶字库
88 //unsigned char xdata ch1[90]; //一条记录86个字节和串口中断条码数据
89 //unsigned char xdata count=0,count_flag,connect_data[5];
90
91 #define SYSCLK 24000000
92 sbit CS=P3^7;
93 unsigned char data cmd[6]={0x40,0x00,0x00,0x00,0x00,0x95};
94 //-----------函数申明--------------------------------------------
95 void MCU_init();
96 //SD卡的SPI初始化
97 void SD_SPI_init();
98 //小端转大端
99 unsigned long Little_To_Big(unsigned char *dat,unsigned char len);
100 //打开或创建文件
101 unsigned char fopen(char file_name[8]);
102 //关闭文件代号
103 void fclose(unsigned pfile);
104 //文件定位
105 void fseek(unsigned char pfile,unsigned long len);
106 //读区文件内容
107 void fread(unsigned char pfile,unsigned char *store,unsigned int read_num);
108 //写入文件内容,只能写在结尾
109 void fwrite(unsigned char pfile,unsigned char *store,unsigned int write_num);
110 //写入文件内容,删除原来文件内容
111 void fwriteall(unsigned char pfile,unsigned char *store,unsigned int write_num);
112 //汉字库与液晶汉字库的转换
113 void HZKLCD(unsigned char *ch,unsigned char *CH);
114 //字符串转数字
115 unsigned long find1(unsigned char pfile,unsigned char pfile1,unsigned char len1,unsigned char *array,unsi
-gned char len,unsigned char len2);
116
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 3
117 unsigned char SD_SPI_init_1();
118 void SD_CMD(unsigned char *cmd);
119 void FAT32_Init();
120 unsigned long Little_To_Big(unsigned char *dat,unsigned char len);
121 void Write_SD_Sector(unsigned long sector);
122 void Read_SD_Sector(unsigned long sectors);
123
124 #define ulong unsigned long
125 #define uchar unsigned char
126 #define uint unsigned int
127
128 //-------------函数声明-----------------------------------------
129 uchar file_name_compare(uchar *file_name,uchar *Name);
130 uchar fopen(char file_name[8]);
131 ulong FAT32_GetNextCluster(ulong LastCluster);
132 unsigned long Add_Newclust(unsigned char pfile);
133 unsigned long find_emptyclust();
134 void write_size(unsigned char pfile,unsigned int write_num);
135
136
137
138
139 void MCU_init()
140 {
141 1 WDTCN = 0xde;
142 1 WDTCN = 0xad;
143 1 XBR0=0x02; //选择.P0.0 - P0.3分别为SPI接口的SCK、MISO、MOSI和NSS
144 1 //XBR0=0x06; //P0.0和P0.1为串口,P0.2、P0.3、P0.4和P1.0为SPI接口
145 1 XBR1=0x00;
146 1 XBR2=0x44; //允许功能选择开关有效,开启UART1串口
147 1 P0MDOUT=0x1d;//0x34; //选择SCK、MOSI、NSS为推拉式输出,MISO为开漏式,作为数据输入口
148 1 P1MDOUT=0x40; //选择P1.6 LED为推拉式输出
149 1 P3=0x82; //READY 输入口
150 1 P74OUT=0x00; //P4 - P7 漏极开路
151 1 P4=0x0ff; //P4 输入
152 1 SPI0CFG=0xc7; //选择在时钟的第2个边沿采样,SCK的空闲状态为高电平,移位位数为8
153 1 SPI0CN=0x03; //允许主方式,允许SPI
154 1 SPI0CKR=SYSCLK/2/12000000-1;//SPI的波特率为12Mb/s
155 1 }
156 //---------------------------------------------------
157 //Name :SD_SPI_init_1
158 //Fun :SD 卡进入 SPI 模式
159 //In :none
160 //Out :0 - successful; 1 - failed
161 //---------------------------------------------------
162 unsigned char SD_SPI_init_1()
163 {
164 1 unsigned char j,retry;
165 1
166 1 for(j=0;j<10;j++) //Send 80 clocks
167 1 {
168 2 SPI0DAT = 0xff;
169 2 while(!SPIF);
170 2 SPIF = 0;
171 2 }
172 1
173 1 retry = 0;
174 1 do
175 1 {
176 2 SD_CMD(cmd); //Send CMD0
177 2 if(retry++>20) /* 超时返回 */
178 2 return 1;
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -