📄 sd.lst
字号:
277 2 for(i = 1; i <= 4; i++) //The next 4 bytes
278 2 ((BYTE xdata *)(&SDMCMDRESBUF00))[i]=CmdBuf[i];
279 2
280 2 SDMI_CMD=CmdType;
281 2
282 2 CmdTimer = 5; // 50ms
283 2 //while((SDMI_INT&bmSD_COMPLETE_INT)==0);
284 2 //SDMI_INT&=~bmSD_COMPLETE_INT;
285 2 while(CmdTimer > 0)
286 2 {
287 3 if((SDMI_INT&bmSD_COMPLETE_INT)!=0) //等待命令执行完毕
288 3 {
289 4 SDMI_INT&=~bmSD_COMPLETE_INT;
290 4 break;
291 4 }
292 3 }//*/
293 2 if(CmdTimer == 0) // Timeout
294 2 {
295 3 SdCtrlReset(); // ???
296 3
297 3 //MMCerror2++;
298 3 continue;
299 3 }
300 2
301 2 if(RespType == TYPE_RESP_NO)
302 2 return STATUS_SUCCESS;
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 6
303 2
304 2 if(RespType == TYPE_RESP_R3)
305 2 {
306 3 // The response type of SD_SEND_OP_COND (ACMD41) and
307 3 // SEND_OP_COND (CMD1) are both R3, which is not protected
308 3 // by CRC7. But hardware could still report CRC7 error for
309 3 // these command's response. So, to prevent from affecting
310 3 // next command, we clear CRC7-ERR INT bit here.
311 3 SDMI_ST&=~bmSD_CRC7_ERR;
312 3 for(i = 0; i < RespLen; i++)
313 3 SdRespBuf[i] = ((BYTE xdata *)(&SDMCMDRESBUF00))[i];
314 3 return STATUS_SUCCESS;
315 3 }
316 2
317 2 if(SDMI_ST&bmSD_CRC7_ERR) // CRC7 Error
318 2 {
319 3 SDMI_ST&=~bmSD_CRC7_ERR; // Clear INT
320 3 continue;
321 3 }
322 2
323 2 for(i = 0; i < RespLen; i++)
324 2 SdRespBuf[i] = ((BYTE xdata *)(&SDMCMDRESBUF00))[i];
325 2
326 2 if(RespType == TYPE_RESP_R1)
327 2 {
328 3 // Check following error bits in Card Status:
329 3 // 31 OUT_OF_RANGE SdRespBuf[1].7
330 3 // 30 ADDRESS_ERROR SdRespBuf[1].6
331 3 // 29 BLOCK_LEN_ERROR SdRespBuf[1].5
332 3 // 28 ERASE_SEQ_ERROR SdRespBuf[1].4
333 3 // 27 ERASE_PARAM SdRespBuf[1].3
334 3 // 26 WP_VIOLATION SdRespBuf[1].2
335 3 // 24 LOCK_UNLOCK_FAILED SdRespBuf[1].0
336 3 // 23 COM_CRC_ERR SdRespBuf[2].7
337 3 // 22 ILLEGAL_COMMAND SdRespBuf[2].6
338 3 // 21 CARD_ECC_FAILED SdRespBuf[2].5
339 3 // 20 CC_ERROR SdRespBuf[2].4
340 3 // 19 ERROR SdRespBuf[2].3
341 3 if( ( (SdRespBuf[1] & 0xFD) == 0 ) && // 8'b1111_1101
342 3 ( (SdRespBuf[2] & 0xF8) == 0 ) ) // 8'b1111_1000
343 3 return STATUS_SUCCESS; // No error
344 3 else
345 3 continue;
346 3 }
347 2 else
348 2 return STATUS_SUCCESS;
349 2 }
350 1 return STATUS_FLASH_ERROR;
351 1 }
352
353 STATUS SdSendAppCmd(BYTE AppCmdIndex, PBYTE AppCmdBuf)
354 {
355 1 STATUS Status;
356 1 int RetryCount;
357 1 BYTE CmdBuf55[MAX_CMD_LEN]; // for APP_CMD (CMD55)
358 1 //MMCerror1++;
359 1 //MMCCmdIndex[MMCerror1]= AppCmdIndex;
360 1 for(RetryCount = 0; RetryCount < 3; RetryCount++)
361 1 {
362 2 *((UINT32 *)(&CmdBuf55[1])) = RCA;
363 2
364 2 Status = SdSendCmd(APP_CMD, CmdBuf55);
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 7
365 2
366 2 if(Status != STATUS_SUCCESS)
367 2 {
368 3 //MMCerror3++;
369 3 continue;
370 3 }
371 2
372 2 Status = SdSendCmd(AppCmdIndex, AppCmdBuf);
373 2
374 2 if(Status != STATUS_SUCCESS)
375 2 continue;
376 2 else
377 2 return STATUS_SUCCESS;
378 2 }
379 1 return STATUS_FLASH_ERROR;
380 1 }
381
382 //----------------------------------------------------------------------------
383 STATUS SdChangeBusWidth(BYTE busWidth) //busWidth只能取值1或4或8
384 {
385 1 STATUS Status;
386 1
387 1 if(CardType == CARD_SD)
388 1 {
389 2 if(busWidth==4)
390 2 *((INT32U *)(&SdCmdBuf[1])) = RCA | 0x02; //4bits bus width
391 2 else
392 2 *((INT32U *)(&SdCmdBuf[1])) = RCA;
393 2
394 2 Status = SdSendAppCmd(SET_BUS_WIDTH,SdCmdBuf);
395 2 if(Status == STATUS_SUCCESS)
396 2 {
397 3 if(busWidth==4)
398 3 {
399 4 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
400 4 SDMI_CTL|=bmSD_BUS_4BIT_EN;
401 4 }
402 3 else
403 3 {
404 4 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
405 4 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
406 4 }
407 3 }
408 2 }
409 1 else // MMC
410 1 {
411 2 if(MmcProtol) // MMC 4.0 支持1/4/8 bits mode
412 2 {
413 3 if(busWidth==8)
414 3 *((INT32U *)(&SdCmdBuf[1])) = 0x03b70200;
415 3 else if(busWidth==4)
416 3 *((INT32U *)(&SdCmdBuf[1])) = 0x03b70100;
417 3 else
418 3 *((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
419 3 //*((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
420 3 Status = SdSendCmd(SWITCH, SdCmdBuf);
421 3
422 3 if(Status == STATUS_SUCCESS)
423 3 {
424 4 *((INT32U *)(&SdCmdBuf[1])) = RCA;
425 4 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
426 4
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 8
427 4 if(Status == STATUS_SUCCESS)
428 4 {
429 5 if(busWidth==8)
430 5 {
431 6 SDMI_CTL|=bmSD_BUS_8BIT_EN;
432 6 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
433 6 }
434 5 else if((busWidth==4))
435 5 {
436 6 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
437 6 SDMI_CTL|=bmSD_BUS_4BIT_EN;
438 6 }
439 5 else
440 5 {
441 6 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
442 6 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
443 6 }
444 5 }
445 4
446 4 SDMI_BUFBASE=0xF2; //FIFOB0
447 4 Status = SdReadExtCSD();
448 4 }
449 3
450 3 /*else
451 3 {
452 3 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
453 3 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
454 3 }*/
455 3 }
456 2 else // MMC 3.1 只支持1bit模式
457 2 {
458 3 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
459 3 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
460 3 }
461 2 }
462 1 return Status;
463 1 }
464 STATUS SdReadExtCSD()
465 {
466 1 STATUS Status;
467 1 int RetryCount1 , RetryCount2;
468 1 BOOL ReadyForData;
469 1
470 1 // if (!SdCardExist())
471 1 // return STATUS_FLASH_ERROR;
472 1
473 1 SdWaitCard();
474 1
475 1 for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
476 1 {
477 2 ReadyForData = FALSE;
478 2 for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
479 2 {
480 3 *((INT32U *)(&SdCmdBuf[1])) = RCA;
481 3 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
482 3 if(Status != STATUS_SUCCESS)
483 3 continue;
484 3 if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
485 3 {
486 4 ReadyForData = TRUE;
487 4 break;
488 4 }
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 9
489 3 }
490 2 if(!ReadyForData)
491 2 continue;
492 2
493 2 *((INT32U *)(&SdCmdBuf[1])) = 0;
494 2 Status = SdSendCmd(SEND_EXT_CSD, SdCmdBuf);
495 2 if(Status != STATUS_SUCCESS)
496 2 continue;
497 2
498 2 //*******************************
499 2 if(SDMI_ST&bmSD_CRC16_ERR)
500 2 {
501 3 SDMI_ST &=~bmSD_CRC16_ERR;
502 3 continue;
503 3 }
504 2 else
505 2 {
506 3 *((INT32U *)(&SdCmdBuf[1])) = RCA;
507 3 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
508 3
509 3 return STATUS_SUCCESS;
510 3 }
511 2 }
512 1 return STATUS_FLASH_ERROR;
513 1 }
514 //----------------------------------------------------------------------------
515 STATUS SdReset()
516 {
517 1 STATUS Status;
518 1 int i;
519 1
520 1 RCA = 0;
521 1
522 1 SdLoClk();
523 1 Delay(5); // Wait 5ms for stable clock
524 1 for(i = 1; i <= 4; i++)
525 1 SdCmdBuf[i] = 0;
526 1 Status = SdSendCmd(GO_IDLE_STATE, SdCmdBuf);
527 1 return Status;
528 1 }
529
530 //----------------------------------------------------------------------------
531 STATUS SdDetect()
532 {
533 1 STATUS Status;
534 1 UINT16 RetryCount;
535 1
536 1 *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
537 1
538 1 Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
539 1
540 1 if(Status == STATUS_SUCCESS)
541 1 {
542 2 CardType = CARD_SD;
543 2
544 2 // Check if card power-up operation finished
545 2 if(SdRespBuf[1] & CARD_PWRUP_FINISH)
546 2 return STATUS_SUCCESS;
547 2
548 2 // Wait until card power-up operation finished
549 2 for(RetryCount = 0; RetryCount < 500; RetryCount++)
550 2 {
C51 COMPILER V7.02b SD 07/18/2006 15:32:57 PAGE 10
551 3 *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
552 3
553 3 Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
554 3
555 3 if(Status != STATUS_SUCCESS)
556 3 continue;
557 3
558 3 if(SdRespBuf[1] & CARD_PWRUP_FINISH)
559 3 return STATUS_SUCCESS;
560 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -