📄 sd.lst
字号:
C51 COMPILER V7.20 SD 11/03/2007 17:08:47 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\output\sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\driver\sd.c LARGE ORDER INCDIR(.\src\include) DEBUG OBJECTEXTEND PRINT(
-.\output\sd.lst) OBJECT(.\output\sd.obj)
line level source
1 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&SD卡驱动&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2 //*文件名称:sd.c
3
4 //*文件作用:SD卡驱动
5
6 //*文件作者:翟 鹏
7
8 //*创建日期:2004年5月
9 //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
10
11
12
13 #include <include.h>
14
15
16
17 static uchar bdata Data=0;
18 sbit Data0=Data^0;
19 sbit Data1=Data^1;
20 sbit Data2=Data^2;
21 sbit Data3=Data^3;
22 sbit Data4=Data^4;
23 sbit Data5=Data^5;
24 sbit Data6=Data^6;
25 sbit Data7=Data^7;
26
27 static uchar xdata CMD17[]={0x51,0x00,0x00,0x00,0x00,0xFF};//cmd17
28
29
30
31 //********************************************************************************************************
-***************
32 //函数作用:io口模拟spi
33 //参数说明:
34 //注意事项:
35 //返回说明:无
36 //********************************************************************************************************
-***************
37 static void sd_write(void)
38 {
39 1 SD_CLK=0;
40 1 SD_DI=Data7;
41 1 SD_CLK=1;
42 1
43 1 SD_CLK=0;
44 1 SD_DI=Data6;
45 1 SD_CLK=1;
46 1
47 1 SD_CLK=0;
48 1 SD_DI=Data5;
49 1 SD_CLK=1;
50 1
51 1 SD_CLK=0;
52 1 SD_DI=Data4;
C51 COMPILER V7.20 SD 11/03/2007 17:08:47 PAGE 2
53 1 SD_CLK=1;
54 1
55 1 SD_CLK=0;
56 1 SD_DI=Data3;
57 1 SD_CLK=1;
58 1
59 1 SD_CLK=0;
60 1 SD_DI=Data2;
61 1 SD_CLK=1;
62 1
63 1 SD_CLK=0;
64 1 SD_DI=Data1;
65 1 SD_CLK=1;
66 1
67 1 SD_CLK=0;
68 1 SD_DI=Data0;
69 1 SD_CLK=1;
70 1 }
71
72 //********************************************************************************************************
-***************
73 //函数作用:io口模拟spi
74 //参数说明:
75 //注意事项:
76 //返回说明:无
77 //********************************************************************************************************
-***************
78 static void sd_read(void)
79 {
80 1 SD_CLK=0;
81 1 SD_CLK=1;
82 1 Data7=SD_DO;
83 1
84 1 SD_CLK=0;
85 1 SD_CLK=1;
86 1 Data6=SD_DO;
87 1
88 1 SD_CLK=0;
89 1 SD_CLK=1;
90 1 Data5=SD_DO;
91 1
92 1 SD_CLK=0;
93 1 SD_CLK=1;
94 1 Data4=SD_DO;
95 1
96 1 SD_CLK=0;
97 1 SD_CLK=1;
98 1 Data3=SD_DO;
99 1
100 1 SD_CLK=0;
101 1 SD_CLK=1;
102 1 Data2=SD_DO;
103 1
104 1 SD_CLK=0;
105 1 SD_CLK=1;
106 1 Data1=SD_DO;
107 1
108 1 SD_CLK=0;
109 1 SD_CLK=1;
110 1 Data0=SD_DO;
111 1 }
112
C51 COMPILER V7.20 SD 11/03/2007 17:08:47 PAGE 3
113 //********************************************************************************************************
-***************
114 //函数作用:发送命令----在初始化时使用
115 //参数说明:
116 //注意事项:
117 //返回说明:无
118 //********************************************************************************************************
-***************
119 static uchar sd_send_cmd_init(uchar *cmd)
120 {
121 1 uchar xdata a,timeout=0;
122 1
123 1 SD_CS=1;
124 1 Data=0xff;sd_write();
125 1 SD_CS=0;
126 1
127 1 Data=cmd[0];sd_write();
128 1 Data=cmd[1];sd_write();
129 1 Data=cmd[2];sd_write();
130 1 Data=cmd[3];sd_write();
131 1 Data=cmd[4];sd_write();
132 1 Data=cmd[5];sd_write();
133 1
134 1 Data=0xff;
135 1 while(Data==0xff)
136 1 {
137 2 sd_read();
138 2 for(a=0;a<255;a++);
139 2 for(a=0;a<255;a++);
140 2 for(a=0;a<255;a++);
141 2 if(timeout++>100)break;
142 2 }
143 1
144 1 return Data;
145 1 }
146
147 //********************************************************************************************************
-***************
148 //函数作用:发送命令----在读写数据时使用
149 //参数说明:
150 //注意事项:
151 //返回说明:无
152 //********************************************************************************************************
-***************
153 static uchar SD_Send_Cmd(void)
154 {
155 1 uchar xdata timeout=0;
156 1
157 1 SD_CS=1;
158 1 Data=0xff;sd_write();
159 1 SD_CS=0;
160 1
161 1 Data=CMD17[0];sd_write();
162 1 Data=CMD17[1];sd_write();
163 1 Data=CMD17[2];sd_write();
164 1 Data=CMD17[3];sd_write();
165 1 Data=CMD17[4];sd_write();
166 1 Data=CMD17[5];sd_write();
167 1
168 1 Data=0xff;
169 1 while(Data==0xff)
170 1 {
C51 COMPILER V7.20 SD 11/03/2007 17:08:47 PAGE 4
171 2 sd_read();
172 2 if(timeout++>100)break;
173 2 }
174 1
175 1 return Data;
176 1 }
177
178 //********************************************************************************************************
-***************
179 //函数作用:初始化
180 //参数说明:
181 //注意事项:
182 //返回说明:无
183 //********************************************************************************************************
-***************
184 uchar SD_Init(void)
185 {
186 1 uchar xdata retry;
187 1 uchar xdata CMD[]={0x40,0x00,0x00,0x00,0x00,0x95};//cmd0
188 1
189 1 SD_CS=1;
190 1 Data=0xff;sd_write();
191 1 SD_CS=0;
192 1
193 1 //Send the 1st command
194 1 retry=0;
195 1 while(sd_send_cmd_init(CMD)!=0x01)
196 1 {
197 2 dog();
198 2 if(retry++>200)return 1;
199 2 }
200 1 //Send the 2nd command
201 1 retry=0;
202 1 CMD[0]=0x41;
203 1 CMD[5]=0xFF;
204 1 while(sd_send_cmd_init(CMD)!=0x00)
205 1 {
206 2 dog();
207 2 if(retry++>200)return 2;
208 2 }
209 1 //Send the third command set block size
210 1 retry=0;
211 1 CMD[0]=0x50;
212 1 CMD[3]=((512&0xFF00)>>8);
213 1 CMD[4]=(512&0x00FF);
214 1 CMD[5]=0xFF;
215 1 while(sd_send_cmd_init(CMD)!=0x00)
216 1 {
217 2 dog();
218 2 if(retry++>200)return 3;
219 2 }
220 1
221 1 SD_CS=1;
222 1 return 0;
223 1 }
224
225 //********************************************************************************************************
-***************
226 //函数作用:设置当前扇区地址
227 //参数说明:
228 //注意事项:
229 //返回说明:无
C51 COMPILER V7.20 SD 11/03/2007 17:08:47 PAGE 5
230 //********************************************************************************************************
-***************
231 void SD_Set_SectorAddr(ulong addr)
232 {
233 1 (ulong)addr<<=9;
234 1 *((ulong *)&CMD17[1])=addr;
235 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -