?? sd.lst
字號:
542 1 return Status;
543 1
544 1 SdWaitCard();
545 1
546 1 return STATUS_SUCCESS;
547 1 }
548 //----------------------------------------------------------------------------
549 STATUS SdWaitCmd()
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 10
550 {
551 1 CmdTimer = SD_CMD_TIMEOUT;
552 1 while((!(SDMI_INT&bmSD_COMPLETE_INT))&&CmdTimer); //
553 1 SDMI_INT&=~bmSD_COMPLETE_INT; //
554 1
555 1 if (CmdTimer)
556 1 return STATUS_SUCCESS;
557 1 else
558 1 {
559 2 SdCtrlReset();
560 2 return STATUS_FLASH_ERROR;
561 2 }
562 1 }
563
564 //----------------------------------------------------------------------------
565 /*
566 STATUS SdSetBlockLen(INT16U len)
567 {
568 STATUS Status;
569
570 SdWaitCard();
571
572 *((INT32U *)(&SdCmdBuf[1]))=len;
573 Status = SdSendCmd(SET_BLOCK_LEN,SdCmdBuf);
574 if(Status == STATUS_SUCCESS)
575 {
576 SDMI_LENH=len>>8;
577 SDMI_LENL=len;
578 }
579
580 return Status;
581 }
582 */
583 //--------------------------------------------------------------------
584 // Read first sector of data from SD/MMC
585 //--------------------------------------------------------------------
586 STATUS SdReadOneSector()
587 {
588 1 STATUS Status;
589 1 int RetryCount1 , RetryCount2;
590 1 BOOL ReadyForData;
591 1
592 1 if (!SdCardExist())
593 1 return STATUS_FLASH_ERROR;
594 1
595 1 if(SectorStart > SdAvailableBlocks)
596 1 return STATUS_PARAM_ERROR;
597 1
598 1 SdWaitCard();
599 1
600 1 for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
601 1 {
602 2 ReadyForData = FALSE;
603 2 for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
604 2 {
605 3 *((INT32U *)(&SdCmdBuf[1])) = RCA;
606 3 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
607 3 if(Status != STATUS_SUCCESS)
608 3 continue;
609 3 if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
610 3 {
611 4 ReadyForData = TRUE;
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 11
612 4 break;
613 4 }
614 3 }
615 2 if(!ReadyForData)
616 2 continue;
617 2
618 2 //SDMI_BUFBASE=0xEC; //FIFOA0
619 2
620 2 *((INT32U *)(&SdCmdBuf[1])) =
621 2 SectorStart << BYTES_PER_SECTOR_SHIFT;
622 2
623 2 //***********************8
624 2 if (SectorCount > 1) // Muti-Read.
625 2 {
626 3 SDMI_CTL|=bmSD_AUTO_CLK_EN;
627 3 Status = SdSendCmd(READ_MUL_BLOCK, SdCmdBuf);
628 3 if(Status != STATUS_SUCCESS)
629 3 continue;
630 3 }
631 2 else
632 2 {
633 3 Status = SdSendCmd(READ_BLOCK, SdCmdBuf);
634 3 if(Status != STATUS_SUCCESS)
635 3 continue;
636 3 }
637 2 //*******************************
638 2 if(SDMI_ST&bmSD_CRC16_ERR)//
639 2 {
640 3 SDMI_ST &=~bmSD_CRC16_ERR;
641 3 continue;
642 3 }
643 2 else
644 2 return STATUS_SUCCESS;
645 2 }
646 1 return STATUS_FLASH_ERROR;
647 1 }
648
649 //----------------------------------------------------------------------------
650 // Description:
651 // Read one sector of data from the SD device
652 //----------------------------------------------------------------------------
653 STATUS SdReadNextSectorData()
654 {
655 1 STATUS Status;
656 1 bit Stop;
657 1
658 1 Stop = SectorCount == 1;
659 1
660 1
661 1
662 1 SDMI_CMD=SD_CMD_RX_DATA_ONLY; //
663 1 SDMI_CTL|=bmSD_AUTO_CLK_EN; //
664 1 if ((Status = SdWaitCmd()) != STATUS_SUCCESS)//
665 1 return Status;
666 1
667 1 if(SDMI_ST&bmSD_CRC16_ERR) // CRC7 Error
668 1 {
669 2 SDMI_ST&=~bmSD_CRC16_ERR; // Clear INT
670 2 return STATUS_DATA_ERROR;
671 2 }
672 1
673 1 if (Stop)
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 12
674 1 return SdStopCmd();
675 1
676 1 return STATUS_SUCCESS;
677 1 }
678
679 STATUS SdReadSector()
680 {
681 1 STATUS Status = SdReadOneSector();
682 1 SectorStart ++;
683 1 return Status;
684 1 }
685
686 STATUS SdReadNextSector()
687 {
688 1 BYTE RetryCount;
689 1
690 1 STATUS Status = SdReadNextSectorData();
691 1 if(Status != STATUS_SUCCESS)
692 1 {
693 2 for(RetryCount = 0 ; RetryCount < 5; RetryCount ++)
694 2 {
695 3 Status = SdStopCmd();
696 3 if(Status != STATUS_SUCCESS)
697 3 continue;
698 3 Status = SdReadOneSector();
699 3 break;
700 3 }
701 2 }
702 1 SectorStart ++;
703 1 return Status;
704 1 }
705 //--------------------------------------------------------------------
706 // Write one sector of data to SD/MMC
707 //--------------------------------------------------------------------
708 STATUS SdWriteOneSector()
709 {
710 1 STATUS Status;
711 1 BYTE CrcSts;
712 1 int RetryCount1 , RetryCount2;
713 1 BOOL ReadyForData;
714 1
715 1 if(SDMI_ST & bmSD_WR_PROTECT)
716 1 return STATUS_WRITE_PROTECT;
717 1
718 1 SdWaitCard();
719 1
720 1 //MMCtest ++;
721 1 for(RetryCount1 = 0; RetryCount1 < 5; RetryCount1++)
722 1 {
723 2 ReadyForData = FALSE;
724 2 for(RetryCount2 = 0; RetryCount2 < 20; RetryCount2++)
725 2 {
726 3 *((INT32U *)(&SdCmdBuf[1])) = RCA;
727 3 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
728 3 if(Status != STATUS_SUCCESS) //MMCerror1++;
729 3 continue;
730 3 if(SdRespBuf[3] & 0x01) // READY_FOR_DATA in Card Status
731 3 {
732 4 ReadyForData = TRUE;
733 4 break;
734 4 }
735 3 }
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 13
736 2 if(!ReadyForData) //MMCerror2++;
737 2 continue;
738 2
739 2 //SDMI_BUFBASE=0xF0; //FIFOB0
740 2
741 2 *((INT32U *)(&SdCmdBuf[1])) = SectorStart << BYTES_PER_SECTOR_SHIFT;
742 2 //***********************8
743 2 if (SectorCount > 1) // Muti-Read.
744 2 {
745 3 Status = SdSendCmd(WRITE_MUL_BLOCK, SdCmdBuf);
746 3 if(Status != STATUS_SUCCESS)
747 3 continue;
748 3 }
749 2 else
750 2 {
751 3 Status = SdSendCmd(WRITE_BLOCK, SdCmdBuf);
752 3 if(Status != STATUS_SUCCESS)
753 3 continue;
754 3 }
755 2 //*******************************
756 2 CrcSts = (SDMI_ST&0x38) >> 3;
757 2 if(CrcSts != GOOD_CRC16_STS) //MMCerror3++;
758 2 continue;
759 2 else //*/
760 2 return STATUS_SUCCESS;
761 2 }
762 1
763 1 return STATUS_FLASH_ERROR;
764 1 }
765
766 //----------------------------------------------------------------------------
767 // Description:
768 // Write one sector of data from the SD device
769 //----------------------------------------------------------------------------
770 STATUS SdWriteNextSector()
771 {
772 1 STATUS Status;
773 1 BYTE CrcSts;
774 1 bit Stop;
775 1
776 1 Stop = SectorCount == 1;
777 1
778 1 SdWaitCard();
779 1
780 1 //SDMI_BUFBASE=0xF0; //FIFOB0
781 1
782 1 SDMI_CMD=SD_CMD_TX_DATA_ONLY;
783 1 if ((Status = SdWaitCmd()) != STATUS_SUCCESS)
784 1 return Status;
785 1 CrcSts = (SDMI_ST&0x38) >> 3;
786 1 if (CrcSts != GOOD_CRC16_STS)
787 1 return STATUS_DATA_ERROR;
788 1
789 1 if (Stop)
790 1 return SdStopCmd();
791 1
792 1 return STATUS_SUCCESS;
793 1 }
794
795 STATUS SdWriteSector()
796 {
797 1 STATUS Status = SdWriteOneSector();
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 14
798 1 SectorStart ++;
799 1 return Status;
800 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2361 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 39 ----
PDATA SIZE = ---- ----
DATA SIZE = 8 41
IDATA SIZE = 9 ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -