📄 sd_spi.lst
字号:
279 2
280 2
281 2 }while((tmp == 0xff) && (i<SD_READREG_TIMEOUT));
282 1
283 1 if(i >= SD_READREG_TIMEOUT)
284 1 {
285 2
286 2 spi_cs_set();
287 2 return SD_ERR_TIMEOUT_READ; //超时错误
288 2
289 2 }
290 1
291 1
292 1 for(i=0;i<len;i++)
293 1 {
294 2 // recbuf[i] = spi_recbyte();
295 2 tmp = spi_recbyte();
296 2 }
297 1
298 1 tmp = spi_recbyte();
299 1 tmp = spi_recbyte();
300 1
301 1 spi_sendbyte(0xFF); //返回前发送8个CLK
302 1 spi_sendbyte(0xFF);
303 1 spi_cs_set();
C51 COMPILER V7.50 SD_SPI 06/04/2008 15:52:40 PAGE 6
304 1 sd_delay(20);
305 1
306 1 return(SD_NO_ERR);
307 1
308 1
309 1
310 1 }
*** WARNING C280 IN LINE 267 OF SD_SPI.C: 'recbuf': unreferenced local variable
311
312
313
314 uint8 sd_write(uint8 bmulti,uint32 len,char* sendbuf) //写SD卡,len为长度,sendbuf为发送缓冲,
315 { //bmulti为发送多块单块选择:1多块,0单块
316 1
317 1 uint32 i = 0;
318 1 uint8 tmp;
319 1
320 1 spi_cs_clr();
321 1
322 1 // spi_sendbyte(0xff); //先发送8个CLK
323 1
324 1 if( bmulti == 1 )
325 1 spi_sendbyte(SD_TOK_WRITE_STARTBLOCK_M); //写多块开始令牌
326 1 else //写单块开始令牌
327 1 spi_sendbyte(SD_TOK_WRITE_STARTBLOCK);
328 1
329 1 for(i=0;i<len;i++)
330 1 {
331 2
332 2 // spi_sendbyte(sendbuf[i]);
333 2 spi_sendbyte(0x55);
334 2
335 2 }
336 1
337 1 spi_sendbyte(0xFF); //16位CRC
338 1 spi_sendbyte(0xFF);
339 1
340 1 do
341 1 {
342 2 tmp = spi_recbyte();
343 2
344 2
345 2 }while(tmp == 0xFF);
346 1
347 1 do
348 1 {
349 2 tmp = spi_recbyte();
350 2
351 2 }while(tmp == 0);
352 1
353 1 spi_cs_set();
354 1 sd_delay(20);
355 1
356 1
357 1 return SD_NO_ERR;
358 1
359 1 }
*** WARNING C280 IN LINE 314 OF SD_SPI.C: 'sendbuf': unreferenced local variable
360
361
362 void sd_sendmulti_stop(void) //发送停止数据传输令牌
363 {
C51 COMPILER V7.50 SD_SPI 06/04/2008 15:52:40 PAGE 7
364 1
365 1 spi_sendbyte(0xff);
366 1 spi_sendbyte(SD_TOK_STOP_MULTI);
367 1 spi_recbyte();
368 1
369 1 spi_cs_set();
370 1
371 1 }
372
373 uint8 sd_en_acmd()
374 {
375 1 uint8 param[4] = {0,0,0,0},resp,ret;
376 1
377 1 ret = sd_send_cmd(CMD55,param,CMD55_R,&resp);
378 1
379 1 spi_cs_set();
380 1
381 1 return ret;
382 1 }
383
384 uint8 sd_activates()
385 {
386 1 uint8 param[4] = {0,0,0,0},resp,ret;
387 1
388 1 ret = sd_send_cmd(ACMD41,param,ACMD41_R,&resp);
389 1
390 1 spi_cs_set();
391 1
392 1 return ret;
393 1
394 1 }
395
396 uint8 sd_read_ocr()
397 {
398 1 uint8 param[4] = {0,0,0,0},resp,ret;
399 1
400 1 ret = sd_send_cmd(CMD58,param,CMD58_R,&resp);
401 1
402 1 spi_cs_set();
403 1
404 1 return ret;
405 1
406 1 }
407
408 uint8 sd_readcard_status(uint8*buffer) //读card status寄存器
409 {
410 1
411 1 uint8 param[4] ={0,0,0,0};
412 1 uint8 ret;
413 1
414 1 ret = sd_send_cmd(CMD13,param,CMD13_R,buffer);
415 1
416 1 sd_read(statuslen,recbuf);
417 1
418 1 spi_cs_set();
419 1
420 1 return ret;
421 1 }
422
423 uint8 sd_read_csd()
424 {
425 1 uint8 param[4] = {0,0,0,0},resp,ret;
C51 COMPILER V7.50 SD_SPI 06/04/2008 15:52:40 PAGE 8
426 1
427 1 ret = sd_send_cmd(CMD9, param, CMD9_R, &resp); /* 读CSD寄存器命令 command that read CSD register */
428 1
429 1 sd_read(cidlen,&recbuf);
430 1
431 1 spi_cs_set();
432 1
433 1 return ret;
434 1
435 1 }
436
437
438 uint8 sd_read_cid()
439 {
440 1 uint8 param[4] = {0,0,0,0},resp,ret;
441 1
442 1 ret = sd_send_cmd(CMD10, param, CMD10_R, &resp); /* 读CID寄存器命令 command that read CID register */
443 1
444 1 sd_read(cidlen,&recbuf);
445 1
446 1 spi_cs_set();
447 1
448 1 return ret;
449 1 // return (sd_read(cidlen, recbuf));
450 1 }
451
452
453 void sd_delay(uint8 value) //延时函数
454 {
455 1
456 1 uint8 i,j;
457 1 for(i=0;i<value;i++)
458 1 for(j=0;j<10;j++)
459 1 {
460 2 // _NOP_();
461 2 }
462 1
463 1
464 1 }
465
466 uint8 sd_reset(void) //复位SD卡
467 {
468 1 uint8 param[4] = {0,0,0,0},resp,ret;
469 1
470 1
471 1 ret = sd_send_cmd(CMD0,param,CMD0_R,&resp);
472 1
473 1 spi_cs_set();
474 1
475 1 return ret;
476 1 }
477
478
479 uint8 sd_check(void) //发出CMD1,查询卡的状态
480 {
481 1
482 1 uint8 param[4] = {0,0,0,0},ret,resp;
483 1
484 1 ret = sd_send_cmd(CMD1,param,CMD1_R,&resp);
485 1
486 1 spi_cs_set();
487 1
C51 COMPILER V7.50 SD_SPI 06/04/2008 15:52:40 PAGE 9
488 1 return ret;
489 1
490 1 }
491
492
493 uint8 sd_init(void) //SD卡初始化进入SPI模式
494 {
495 1 uint8 tmp;
496 1 uint8 i = 0;
497 1
498 1 spi_cs_set();
499 1
500 1 for(i=0;i<13;i++)
501 1 {
502 2 spi_sendbyte(0xFF);
503 2 }
504 1 spi_cs_clr();
505 1
506 1 sd_reset(); //发送CMD0复位SD卡
507 1 sd_delay(2);
508 1
509 1 do
510 1 {
511 2 sd_en_acmd();
512 2 tmp = sd_activates();
513 2 sd_delay(20);
514 2 i++;
515 2 //激活初始化
516 2 }while( (tmp!= 0)&&(i<SD_CMD_TIMEOUT));
517 1
518 1 if(i>=SD_CMD_TIMEOUT)
519 1 i = 1; //超时
520 1 else
521 1 i = 0;
522 1
523 1 sd_check(); //发送CMD1查询SD卡状态
524 1 sd_delay(1);
525 1
526 1 // sd_crc(0);
527 1 // sd_delay(1);
528 1
529 1 sd_set_blocklen(SD_BLOCKSIZE); //设置BLOCK长度
530 1 sd_delay(5);
531 1
532 1 sd_clear_protect();
533 1 sd_delay(5);
534 1
535 1 sd_readcard_status(recbuf); //读card status寄存器
536 1 sd_delay(10);
537 1
538 1 sd_read_cid();
539 1 sd_delay(10);
540 1
541 1 sd_read_csd();
542 1 sd_delay(10);
543 1
544 1 return SD_NO_ERR;
545 1 }
546
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V7.50 SD_SPI 06/04/2008 15:52:40 PAGE 10
CODE SIZE = 1630 ----
CONSTANT SIZE = 36 ----
XDATA SIZE = 24 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 158
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -