📄 sd.lst
字号:
588 3 }
589 2 }
590 1 while(!(STATUS07_00 & XFEREND))
591 1 {
592 2 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
593 2 {
594 3 STATUS07_00 = 0xFF;
595 3 STATUS15_08 = BUSYEND;
596 3 return KO;
597 3 }
598 2 }
599 1 SDH_DMA_ACK &= ~DMA_ACK_F;//DMA acknowledge flag
600 1
601 1 STATUS07_00 = 0xFF;
602 1 STATUS15_08 = BUSYEND;
603 1 do
604 1 {
605 2 if(SDCIF_CMD13())
606 2 {
607 3 //ChkCurrentState();
608 3 //if(SDVar.CardStatus[1] == 4)
609 3 if(((RREP103_096 & 0X1E) >> 1) == 4)
610 3 return OK;
611 3 }
612 2 }
613 1 while(1);
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 11
614 1 }
615 /************************************************
616 函 数 名: SDCIF_CMD27()
617 功 能:Programming of the programmable bits of the CSD(128 bits)
618 说 明:数据存放地址由SDH_DMA_CS决定
619 调 用:
620 全局变量:ErrVal
621 入口参数:无
622 出口参数:无
623 返 回 值:无
624 ************************************************/
625 /*void SDCIF_CMD27(void)
626 {
627 SDVar.ErrVal = 0;
628 BLKLEN11_08 = 0x00;//SET_BLOCKLEN
629 BLKLEN07_00 = 128 / 8;
630 DATACON = XFER_MODE_1;//block write
631 //argument dont't care
632 CMDCON = (WAITRSP | DATA_WITH);
633 CMDINDEX = PROGRAM_CSD;
634 while(!(STATUS07_00 & CMDSEND));
635
636 while(!(STATUS07_00 & RSPRXVP))
637 {
638 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
639 {
640 SDVar.ErrVal = 1;
641 break;
642 }
643 }
644 while(!(STATUS07_00 & XFEREND))
645 {
646 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
647 {
648 SDVar.ErrVal = 1;
649 break;
650 }
651 }
652 while(!(STATUS15_08 & BUSYEND));
653 SDH_DMA_ACK &= ~DMA_ACK_F;//DMA acknowledge flag
654
655 STATUS07_00 = 0xFF;
656 STATUS15_08 = BUSYEND;
657 }
658 /************************************************
659 函 数 名: SDCIF_CMD28()
660 功 能:This command sets the write protection bit of the addressed group.
661 The properties of write protection are coded in the card specific data(WP_GRP_SIZE)
662 说 明:
663 调 用:
664 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
665 入口参数:无
666 出口参数:无
667 返 回 值:无
668 ************************************************/
669 /*void SDCIF_CMD28(void)
670 {
671 SDVar.ErrVal = 0;
672 DATACON = XFER_MODE_2;//check busy
673 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
674 ARG23_16 = SDVar.FlashAddr[1];
675 ARG15_08 = SDVar.FlashAddr[2];
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 12
676 ARG07_00 = SDVar.FlashAddr[3];
677 CMDCON = (WAITRSP | DATA_WITH);
678 CMDINDEX = SET_WRITE_PROT;
679 while(!(STATUS07_00 & CMDSEND));
680
681 while(!(STATUS07_00 & RSPRXVP))
682 {
683 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
684 {
685 SDVar.ErrVal = 1;
686 break;
687 }
688 }
689 while(!(STATUS15_08 & BUSYEND));
690
691 STATUS07_00 = 0xFF;
692 STATUS15_08 = BUSYEND;
693 }
694 /************************************************
695 函 数 名: SDCIF_CMD29()
696 功 能:This command clears the write protection bit of the addressed group
697 说 明:
698 调 用:
699 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
700 入口参数:无
701 出口参数:无
702 返 回 值:无
703 ************************************************/
704 /*void SDCIF_CMD29(void)
705 {
706 SDVar.ErrVal = 0;
707 DATACON = XFER_MODE_2;//check busy
708 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
709 ARG23_16 = SDVar.FlashAddr[1];
710 ARG15_08 = SDVar.FlashAddr[2];
711 ARG07_00 = SDVar.FlashAddr[3];
712 CMDCON = (WAITRSP | DATA_WITH);
713 CMDINDEX = CLR_WRITE_PROT;
714 while(!(STATUS07_00 & CMDSEND));
715
716 while(!(STATUS07_00 & RSPRXVP))
717 {
718 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
719 {
720 SDVar.ErrVal = 1;
721 break;
722 }
723 }
724 while(!(STATUS15_08 & BUSYEND));
725
726 STATUS07_00 = 0xFF;
727 STATUS15_08 = BUSYEND;
728 }
729 /************************************************
730 函 数 名: SDCIF_CMD30()
731 功 能:This command asks the card to send the status of the write protection bits
732 说 明:数据存放地址由SDH_DMA_CS决定
733 调 用:
734 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
735 入口参数:无
736 出口参数:无
737 返 回 值:无
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 13
738 ************************************************/
739 /*void SDCIF_CMD30(void)
740 {
741 SDVar.ErrVal = 0;
742 BLKLEN11_08 = 0x00;//SET_BLOCKLEN
743 BLKLEN07_00 = 4;
744 DATACON = XFER_MODE_0;//block read
745 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
746 ARG23_16 = SDVar.FlashAddr[1];
747 ARG15_08 = SDVar.FlashAddr[2];
748 ARG07_00 = SDVar.FlashAddr[3];
749 CMDCON = (WAITRSP | DATA_WITH);
750 CMDINDEX = SEND_WRITE_PROT;
751 while(!(STATUS07_00 & CMDSEND));
752
753 while(!(STATUS07_00 & RSPRXVP))
754 {
755 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
756 {
757 SDVar.ErrVal = 1;
758 break;
759 }
760 }
761
762 while(!(STATUS07_00 & XFEREND))
763 {
764 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
765 {
766 SDVar.ErrVal = 1;
767 break;
768 }
769 }
770 STATUS07_00 = 0xFF;
771 }
772 /************************************************
773 函 数 名: SDCIF_CMD32()
774 功 能:Sets the address of the first write block to be erased
775 说 明:
776 调 用:
777 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
778 入口参数:无
779 出口参数:无
780 返 回 值:无
781 ************************************************/
782 /*void SDCIF_CMD32(void)
783 {
784 SDVar.ErrVal = 0;
785 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
786 ARG23_16 = SDVar.FlashAddr[1];
787 ARG15_08 = SDVar.FlashAddr[2];
788 ARG07_00 = SDVar.FlashAddr[3];
789 CMDCON = WAITRSP;
790 CMDINDEX = ERASE_WR_BLK_START;
791 while(!(STATUS07_00 & CMDSEND));
792
793 while(!(STATUS07_00 & RSPRXVP))
794 {
795 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
796 {
797 SDVar.ErrVal = 1;
798 break;
799 }
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 14
800 }
801 STATUS07_00 = 0xFF;
802 }
803 /************************************************
804 函 数 名: SDCIF_CMD33()
805 功 能:Sets the address of the last write block of the continuous range to be erased
806 说 明:
807 调 用:
808 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
809 入口参数:无
810 出口参数:无
811 返 回 值:无
812 ************************************************/
813 /*void SDCIF_CMD33(void)
814 {
815 SDVar.ErrVal = 0;
816 ARG31_24 = SDVar.FlashAddr[0];//argument = SD_lba(FlashAddr[3:0])
817 ARG23_16 = SDVar.FlashAddr[1];
818 ARG15_08 = SDVar.FlashAddr[2];
819 ARG07_00 = SDVar.FlashAddr[3];
820 CMDCON = WAITRSP;
821 CMDINDEX = ERASE_WR_BLK_END;
822 while(!(STATUS07_00 & CMDSEND));
823
824 while(!(STATUS07_00 & RSPRXVP))
825 {
826 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
827 {
828 SDVar.ErrVal = 1;
829 break;
830 }
831 }
832 STATUS07_00 = 0xFF;
833 }
834 /************************************************
835 函 数 名: SDCIF_CMD38()
836 功 能:Erases all previously selected write blocks
837 说 明:
838 调 用:
839 全局变量:ErrVal
840 入口参数:无
841 出口参数:无
842 返 回 值:无
843 ************************************************/
844 /*void SDCIF_CMD38(void)
845 {
846 SDVar.ErrVal = 0;
847 //argument dont't care
848 DATACON = XFER_MODE_2;//check busy
849 CMDCON = WAITRSP;
850 CMDINDEX = ERASE;
851 while(!(STATUS07_00 & CMDSEND));
852
853 while(!(STATUS07_00 & RSPRXVP))
854 {
855 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
856 {
857 SDVar.ErrVal = 1;
858 break;
859 }
860 }
861 while(!(STATUS15_08 & BUSYEND));
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 15
862 STATUS07_00 = 0xFF;
863 STATUS15_08 = BUSYEND;
864 }
865 /************************************************
866 函 数 名: SDCIF_CMD42()
867 功 能:Used to set/reset the password or lock/unlock the card
868 The size of the data block is set by the SET_BLOCK_LEN command
869 说 明:数据存放地址由SDH_DMA_CS决定
870 调 用:
871 全局变量:ErrVal
872 入口参数:BlockLen: 块长度, 由CMD16设置
873 出口参数:无
874 返 回 值:无
875 ************************************************/
876 /*void SDCIF_CMD42(unsigned int BlockLen)
877 {
878 SDVar.ErrVal = 0;
879 BLKLEN11_08 = (Uint8)(BlockLen >> 8);//SET_BLOCKLEN
880 BLKLEN07_00 = (Uint8)BlockLen;
881 DATACON = XFER_MODE_1;//block write
882 //argument dont't care
883 CMDCON = (WAITRSP | DATA_WITH);
884 CMDINDEX = LOCK_UNLOCK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -