📄 sd.lst
字号:
885 while(!(STATUS07_00 & CMDSEND));
886
887 while(!(STATUS07_00 & RSPRXVP))
888 {
889 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
890 {
891 SDVar.ErrVal = 1;
892 break;
893 }
894 }
895 while(!(STATUS07_00 & XFEREND))
896 {
897 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
898 {
899 SDVar.ErrVal = 1;
900 break;
901 }
902 }
903 while(!(STATUS15_08 & BUSYEND));
904 SDH_DMA_ACK &= ~DMA_ACK_F;//DMA acknowledge flag
905
906 STATUS07_00 = 0xFF;
907 STATUS15_08 = BUSYEND;
908 }
909 /************************************************
910 函 数 名: SDCIF_CMD55()
911 功 能:Indicates to the card that the next command is an
912 application specific command rather than a
913 standard command
914 说 明:
915 调 用:
916 全局变量:RCA
917 入口参数:无
918 出口参数:无
919 返 回 值:无
920 ************************************************/
921 bit SDCIF_CMD55(void)
922 {
923 1 ARG31_24 = SDVar.RCA[1];//argument = RCA
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 16
924 1 ARG23_16 = SDVar.RCA[0];
925 1 ARG15_08 = 0;
926 1 ARG07_00 = 0;
927 1 CMDCON = WAITRSP;
928 1 CMDINDEX = APP_CMD;
929 1 while(!(STATUS07_00 & CMDSEND));
930 1 while(!(STATUS07_00 & RSPRXVP))
931 1 {
932 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
933 2 {
934 3 STATUS07_00 = 0xFF;
935 3 return KO;
936 3 }
937 2 }
938 1 STATUS07_00 = 0xFF;
939 1 return OK;
940 1 }
941
942 /************************************************
943 函 数 名: SDCIF_ACMD06()
944 功 能:Defines the data bus width('00' = 1bit or '10' = 4 bits bus)to be used for data transfer
945 说 明:用于SD卡
946 调 用:
947 全局变量:ErrVal, BusBits
948 入口参数:无
949 出口参数:无
950 返 回 值:无
951 ************************************************/
952 //设置SD卡数据总线宽度
953 bit SDCIF_ACMD06(void)
954 {
955 1 ARG31_24 = 0;
956 1 ARG23_16 = 0;
957 1 ARG15_08 = 0;
958 1 ARG07_00 = SDVar.BusBits;//argument = bus wide
959 1 CMDCON = WAITRSP;
960 1 CMDINDEX = SET_BUS_WIDTH;
961 1 while(!(STATUS07_00 & CMDSEND));
962 1 while(!(STATUS07_00 & RSPRXVP))
963 1 {
964 2 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
965 2 {
966 3 STATUS07_00 = 0xFF;
967 3 return KO;
968 3 }
969 2 }
970 1 STATUS07_00 = 0xFF;
971 1
972 1 if(SDVar.BusBits == 2)
973 1 // SDIFCON0 = (WIDEBUS | CLK_EN );
974 1 SDIFCON0 = (WIDEBUS | CLK_EN | HISPEED );
975 1 else
976 1 //SDIFCON0 = WIDEBUS;
977 1 SDIFCON0 = CLK_EN;
978 1 return OK;
979 1 }
980 /************************************************
981 函 数 名: SDCIF_ACMD13()
982 功 能:Send the SD Card status(512 bits)
983 说 明:数据存放地址由SDH_DMA_CS决定
984 调 用:必须先调用SDCIF_CMD55()
985 全局变量:ErrVal
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 17
986 入口参数:无
987 出口参数:无
988 返 回 值:无
989 ************************************************/
990 /*void SDCIF_ACMD13(void)
991 {
992 SDVar.ErrVal = 0;
993 //argument dont't care
994 BLKLEN11_08 = 0x00;//SET_BLOCKLEN
995 BLKLEN07_00 = 512 / 8;
996 CMDCON = (WAITRSP | DATA_WITH);
997 CMDINDEX = SD_STATUS;
998 while(!(STATUS07_00 & CMDSEND));
999 while(!(STATUS07_00 & RSPRXVP))
1000 {
1001 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
1002 {
1003 SDVar.ErrVal = 1;
1004 STATUS07_00 = 0xFF;
1005 return;
1006 }
1007 }
1008 while(!(STATUS07_00 & XFEREND))
1009 {
1010 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
1011 {
1012 SDVar.ErrVal = 1;
1013 STATUS07_00 = 0xFF;
1014 return;
1015 }
1016 }
1017 STATUS07_00 = 0xFF;
1018 }
1019 /************************************************
1020 函 数 名: SDCIF_ACMD22()
1021 功 能:Send the number of the written (without errors) write blocks
1022 Responds with 32 bits + CRC data block
1023 说 明:数据存放地址由SDH_DMA_CS决定
1024 调 用:必须先调用SDCIF_CMD55()
1025 全局变量:ErrVal
1026 入口参数:无
1027 出口参数:无
1028 返 回 值:无
1029 ************************************************/
1030 /*void SDCIF_ACMD22(void)
1031 {
1032 SDVar.ErrVal = 0;
1033 //argument dont't care
1034 BLKLEN11_08 = 0x00;//SET_BLOCKLEN
1035 BLKLEN07_00 = 32 / 8;
1036 CMDCON = (WAITRSP | DATA_WITH);
1037 CMDINDEX = SEND_NUMBER_WR_BLOCKS;
1038 while(!(STATUS07_00 & CMDSEND));
1039 while(!(STATUS07_00 & RSPRXVP))
1040 {
1041 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
1042 {
1043 SDVar.ErrVal = 1;
1044 STATUS07_00 = 0xFF;
1045 return;
1046 }
1047 }
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 18
1048 while(!(STATUS07_00 & XFEREND))
1049 {
1050 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
1051 {
1052 SDVar.ErrVal = 1;
1053 STATUS07_00 = 0xFF;
1054 return;
1055 }
1056 }
1057 STATUS07_00 = 0xFF;
1058 }
1059 /************************************************
1060 函 数 名: SDCIF_ACMD41()
1061 功 能:Asks the accessed card to send its operating
1062 condition register (OCR) content in the
1063 response on the CMD line
1064 说 明:
1065 调 用:必须先调用SDCIF_CMD55()
1066 全局变量:ErrVal, OCR
1067 入口参数:无
1068 出口参数:无
1069 返 回 值:无
1070 ************************************************/
1071 bit SDCIF_ACMD41(void)
1072 {
1073 1 //SDVar.ErrVal = 0;
1074 1 ARG31_24 = SDVar.OCR[3];//argument = OCR
1075 1 ARG23_16 = SDVar.OCR[2];
1076 1 ARG15_08 = SDVar.OCR[1];
1077 1 ARG07_00 = SDVar.OCR[0];
1078 1 CMDCON = WAITRSP;
1079 1 CMDINDEX = SD_SEND_OP_COND;
1080 1 while(!(STATUS07_00 & CMDSEND));
1081 1 while(!(STATUS07_00 & RSPRXVP))
1082 1 {
1083 2 if((STATUS07_00 & RSPTIMEOUT))
1084 2 {
1085 3 STATUS07_00 = 0xFF;
1086 3 return KO;
1087 3 }
1088 2 }
1089 1 STATUS07_00 = 0xFF;
1090 1 return OK;
1091 1 }
1092 /************************************************
1093 函 数 名: SDCIF_ACMD51()
1094 功 能:Reads the SD Configuration Register (SCR)(64 bits)
1095 说 明:数据存放地址由SDH_DMA_CS决定
1096 调 用:必须先调用SDCIF_CMD55()
1097 全局变量:ErrVal
1098 入口参数:无
1099 出口参数:无
1100 返 回 值:无
1101 ************************************************/
1102 /*void SDCIF_ACMD51(void)
1103 {
1104 SDVar.ErrVal = 0;
1105 //argument dont't care
1106 //ARG31_24 = SDVar.OCR[3];
1107 //ARG23_16 = SDVar.OCR[2];
1108 //ARG15_08 = SDVar.OCR[1];
1109 //ARG07_00 = SDVar.OCR[0];
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 19
1110 BLKLEN11_08 = 0x00;//SET_BLOCKLEN
1111 BLKLEN07_00 = 64 / 8;
1112 CMDCON = (WAITRSP | DATA_WITH);
1113 CMDINDEX = SEND_SCR;
1114 while(!(STATUS07_00 & CMDSEND));
1115 while(!(STATUS07_00 & RSPRXVP))
1116 {
1117 if((STATUS07_00 & RSPTIMEOUT)||(STATUS07_00 & CRC7ERROR))
1118 {
1119 SDVar.ErrVal = 1;
1120 STATUS07_00 = 0xFF;
1121 return;
1122 }
1123 }
1124 while(!(STATUS07_00 & XFEREND))
1125 {
1126 if((STATUS07_00 & DTIMEOUT)||(STATUS07_00 & CRC16ERROR))
1127 {
1128 SDVar.ErrVal = 1;
1129 STATUS07_00 = 0xFF;
1130 return;
1131 }
1132 }
1133 STATUS07_00 = 0xFF;
1134 }
1135 /************************************************
1136 函 数 名: ChkCurrentState()
1137 功 能:检查SD卡状态
1138 说 明:
1139 调 用:
1140 全局变量:CardStatus
1141 入口参数:无
1142 出口参数:无
1143 返 回 值:无
1144 ************************************************/
1145 /*void ChkCurrentState(void)
1146 {
1147 SDVar.CardStatus[1] = RREP103_096;
1148 SDVar.CardStatus[1] &= 0x1E;
1149 //
1150 SDVar.CardStatus[1] >>= 1;
1151
1152 //
1153 }
1154 /************************************************
1155 函 数 名: SDHostRead512B_LBA
1156 功 能:从逻辑块地址开始读取512字节
1157 说 明:数据存放地址由SDH_DMA_CS决定
1158 调 用:
1159 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
1160 入口参数:无
1161 出口参数:无
1162 返 回 值:1 -> success, 0 -> failure
1163 ************************************************/
1164 bit SDHostRead512B_LBA(U32 logic_address, U8 dma_section)
1165 {
1166 1 SDH_DMA_CS = dma_section;
1167 1 SD_lba = logic_address << 9;
1168 1 if(SDCIF_CMD17())
1169 1 return OK;
1170 1 else
1171 1 return KO;
C51 COMPILER V8.08 SD 07/28/2007 11:42:15 PAGE 20
1172 1 }
1173 /************************************************
1174 函 数 名: DMA_load_sector()
1175 功 能:从逻辑块地址开始读取512字节
1176 说 明:数据存放地址由SDH_DMA_CS决定
1177 调 用:
1178 全局变量:ErrVal, SD_lba(FlashAddr[3:0])
1179 入口参数:无
1180 出口参数:无
1181 返 回 值:1 -> success, 0 -> failure
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -