📄 sdfilelib.lst
字号:
179 2 }
180 1 while(SPI0DAT != 1); //Response 01h,Successful!
181 1
182 1 cmd[0]=0x41;
183 1 cmd[5]=0xff;
184 1 retry = 0;
185 1 do
186 1 {
187 2 SD_CMD(cmd); //Send CMD1
188 2 if(retry++>20) /* 超时返回 */
189 2 return 1;
190 2 }
191 1 while(SPI0DAT!=0); //Response 00h,Successful!
192 1 CS = 1;
193 1 return 0;
194 1 }
195 //---------------------------------------------------
196 //Name :SD_SPI_init
197 //Fun :sd卡初始化
198 //In :none
199 //Out :none
200 //---------------------------------------------------
201 void SD_SPI_init()
202 {
203 1 unsigned char t;
204 1 for(t=0;t<50;t++)
205 1 {if(SD_SPI_init_1()==0)break;/*file_num=SD_SPI_init_1();*/}
206 1 //ERROR();
207 1 }
208 //--------------------------------------------
209 //Name :SD_CMD
210 //Fun :Send SD Card Command
211 //In :unsigned char *cmd
212 //Out :none
213 //---------------------------------------------------
214 void SD_CMD(unsigned char *cmd)
215 {
216 1 unsigned char i;
217 1 CS = 1;
218 1
219 1 SPI0DAT = 0xff; //发送8个时钟信号
220 1 while(!SPIF);
221 1 SPIF = 0;
222 1
223 1 CS = 0;
224 1 for(i=0;i<6;i++)
225 1 {
226 2 SPI0DAT = *(cmd++);
227 2 while(!SPIF);
228 2 SPIF = 0;
229 2 }
230 1 i = 0;
231 1 do
232 1 {
233 2 SPI0DAT = 0xff; /* Wait for Response */
234 2 while(!SPIF);
235 2 SPIF = 0;
236 2 if(i++>20) /* 超时返回 */
237 2 return;
238 2 }
239 1 while(SPI0DAT == 0xff);
240 1 }
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 5
241 //---------------------------------------------------
242 //函数名:Read_SD_Sector
243 //功 能:读 一个扇区寄存器
244 //参 数:sector
245 //返回值:
246 //---------------------------------------------------
247 void Read_SD_Sector(unsigned long sectors)
248 {
249 1 unsigned int n = 0;
250 1 unsigned long sector;
251 1
252 1 sector=sectors;
253 1 // unsigned char response;
254 1 //地址变换 由逻辑块地址转为字节地址
255 1 sector = sector << 9; // sector = sector * 512
256 1 cmd[0] = 0x51;
257 1 cmd[1] = ((sector & 0xFF000000) >>24 );
258 1 cmd[2] = ((sector & 0x00FF0000) >>16 );
259 1 cmd[3] = ((sector & 0x0000FF00) >>8 );
260 1 do
261 1 {
262 2 SD_CMD(cmd);//发送CMD16
263 2 n++;
264 2 if(n == 100);
265 2 // READ_BLOCK_ERROR=0x55;
266 2 // return(READ_BLOCK_ERROR);//CMD16 错误!
267 2 }
268 1 while(SPI0DAT!=0); //回应00h,停止写入
269 1 n = 0;
270 1 do
271 1 {
272 2 SPI0DAT = 0xff; //* 等待回复 *
273 2 while(!SPIF){}
274 2 SPIF = 0;
275 2 if(n++>200);
276 2 // READ_BLOCK_START_ERROR=0x55; //* 超时返回 *
277 2 // return(READ_BLOCK_START_ERROR);
278 2 }
279 1 while(SPI0DAT != 0xfe);
280 1 for (n=0;n<512;n++)
281 1 {
282 2 SPI0DAT = 0xff;
283 2 while(!SPIF){}
284 2 SPIF = 0;
285 2 FAT32_Buffer[n] = SPI0DAT;
286 2 }
287 1 SPI0DAT = 0xff;
288 1 while(!SPIF);
289 1 SPIF = 0;
290 1 SPI0DAT = 0xff;
291 1 while(!SPIF);
292 1 SPIF = 0;
293 1 CS = 1;
294 1 }
295 //---------------------------------------------------
296 //Name :Write_SD_Sector
297 //Fun :Write one Sector on SD Card
298 //In :unsigned long sector
299 //Out :none
300 //---------------------------------------------------
301 void Write_SD_Sector(unsigned long sector)
302 {
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 6
303 1 unsigned int n = 0;
304 1
305 1 //地址变换 由逻辑块地址转为字节地址
306 1 sector = sector << 9; //sector = sector * 512
307 1 cmd[0] = 0x58;
308 1 cmd[1] = ((sector & 0xFF000000) >>24 );
309 1 cmd[2] = ((sector & 0x00FF0000) >>16 );
310 1 cmd[3] = ((sector & 0x0000FF00) >>8 );
311 1 do
312 1 {SD_CMD(cmd);} //Send CMD24
313 1 while(SPI0DAT!=0); //Response 00h,Successful!
314 1
315 1 SPI0DAT = 0xff;
316 1 while(!SPIF);
317 1 SPIF = 0;
318 1
319 1 SPI0DAT = 0xfe; //Start Byte
320 1 while(!SPIF);
321 1 SPIF = 0;
322 1
323 1 for (n=0;n<512;n++) //512+2 Bytes CRC(Don't Care)
324 1 {
325 2 SPI0DAT =FAT32_Buffer[n];
326 2 while(!SPIF);
327 2 SPIF = 0;
328 2 }
329 1 SPI0DAT = 0xff;
330 1 while(!SPIF);
331 1 SPIF = 0;
332 1 SPI0DAT = 0xff;
333 1 while(!SPIF);
334 1 SPIF = 0;
335 1 SPI0DAT = 0xff;
336 1 while(!SPIF);
337 1 SPIF = 0;
338 1 if((SPI0DAT & 0x1F)!=0x05) // xxx0 0101b
339 1 CS=1; //Failed!
340 1 do
341 1 {
342 2 SPI0DAT = 0xff;
343 2 while(!SPIF);
344 2 SPIF = 0;
345 2 }
346 1 while (SPI0DAT!=0xff); //Busy
347 1 CS=1;
348 1 /*if((SPI0DAT & 0x1F)==0x05)
349 1 CS=1;
350 1 SPI0DAT = 0xff;
351 1 while(!SPIF);
352 1 SPIF = 0;
353 1 SPI0DAT = 0xff;
354 1 while(!SPIF);
355 1 SPIF = 0;*/
356 1 }
357 //---------------------------------------------------------------------------
358 /*void FAT32_Init(struct FAT32_Init_Arg *Arg )
359 {
360 struct FAT32_BPB *bpb=(struct FAT32_BPB *)(FAT32_Buffer); //将数据缓冲区指针转为struct
- FAT32_BPB 型指针
361 se=0;
362 Read_SD_Sector(se);
363 Arg->Total_Sectors =Little_To_Big((bpb->BPB_TotSec32) ,4); //????? //FAT32
C51 COMPILER V7.06 SDFILELIB 01/10/2009 12:18:21 PAGE 7
-_Get_Total_Size()可以返回磁盘的总容量,单位是兆
364 Arg->FATsectors =Little_To_Big((bpb->BPB_FATSz32) ,4); //装入FAT表占用的扇
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -