?? sd.lst
字號(hào):
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\OUTPUT\Sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sd.c BROWSE INCDIR(.\include) DEBUG OBJECTEXTEND PRINT(.\OUTPUT\Sd.lst) OBJ
-ECT(.\OUTPUT\Sd.obj)
line level source
1
2 #include "fs7805.h"
3 #include "fs7805regs.h"
4 #include "sd.h"
5 #include "include.h"
6 static INT32U xdata SdAvailableBlocks = 0;
7 static TCARD_TYPE xdata CardType = CARD_SD;
8 BYTE idata SdCmdBuf[5];
9 BYTE xdata SdRespBuf[17];
10 BYTE xdata SdRespBufForProgCsd[17];
11 static INT32U idata RCA = 0;
12 static BOOL MmcProtol;
13
14 INT32U SectorStart = 0;
15 INT16U SectorCount = 0;
16
17 BYTE CmdTimer;
18
19 void SdInit()
20 {
21 1 SYSIO_CFG=SYSIO_CFG|bmSD_EN; //enable SDMI interface
22 1 SDMI_CTL&=~bmSD_AUTO_CLK_EN; //
23 1 SDMI_CTL |= bmSD_CLK_40;//
24 1 }
25
26 void SdLowClk()
27 {
28 1 SDMI_CTL=(SDMI_CTL&~bmSD_CLK_SEL)|bmSD_CLK_EN;
29 1 }
30
31 void SdHiClk()
32 {
33 1 SDMI_CTL=(SDMI_CTL|bmSD_CLK_SEL)|bmSD_CLK_EN;
34 1 }
35
36 void SdStopClk()
37 {
38 1 SDMI_CTL=SDMI_CTL & ~bmSD_CLK_EN & ~bmSD_AUTO_CLK_EN;
39 1 }
40
41 void SdWaitCard()
42 {
43 1 while(SDMI_ST&bmSD_BUSY);
44 1 }
45
46 BYTE SdGetRespType(BYTE CmdIndex)
47 {
48 1 if(CmdIndex == SEND_RELATIVE_ADDR)
49 1 {
50 2 //if(CardType == CARD_SD)
51 2 return TYPE_RESP_R6;
52 2 //else
53 2 // return TYPE_RESP_R1;
54 2 }
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 2
55 1 switch(CmdIndex)
56 1 {
57 2 case GO_IDLE_STATE : return TYPE_RESP_NO; break;
58 2 case SEND_OP_COND : return TYPE_RESP_R3; break;
59 2 case ALL_SEND_CID : return TYPE_RESP_R2; break;
60 2 case SET_DSR : return TYPE_RESP_NO; break;
61 2 case SWITCH : return TYPE_RESP_R1; break;
62 2 case SELECT_CARD : return TYPE_RESP_R1; break;
63 2 case SEND_EXT_CSD : return TYPE_RESP_R1; break;
64 2 case SEND_CSD : return TYPE_RESP_R2; break;
65 2 case SEND_CID : return TYPE_RESP_R2; break;
66 2 case READ_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
67 2 case STOP_TRANS : return TYPE_RESP_R1; break;
68 2 case SEND_STATUS : return TYPE_RESP_R1; break;
69 2 case GO_INACTIVE_STATE : return TYPE_RESP_NO; break;
70 2 case SET_BLOCK_LEN : return TYPE_RESP_R1; break;
71 2 case READ_BLOCK : return TYPE_RESP_R1; break;
72 2 case READ_MUL_BLOCK : return TYPE_RESP_R1; break;
73 2 case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
74 2 case SET_BLOCK_COUNT : return TYPE_RESP_R1; break;
75 2 case WRITE_BLOCK : return TYPE_RESP_R1; break;
76 2 case WRITE_MUL_BLOCK : return TYPE_RESP_R1; break;
77 2 case PROGRAM_CID : return TYPE_RESP_R1; break;
78 2 case PROGRAM_CSD : return TYPE_RESP_R1; break;
79 2 case SET_WRITE_PROT : return TYPE_RESP_R1; break;
80 2 case CLR_WRITE_PROT : return TYPE_RESP_R1; break;
81 2 case SEND_WRITE_PROT : return TYPE_RESP_R1; break;
82 2 case ERASE_WR_BLK_START : return TYPE_RESP_R1; break;
83 2 case ERASE_WR_BLK_END : return TYPE_RESP_R1; break;
84 2 case ERASE_GROUP_START : return TYPE_RESP_R1; break;
85 2 case ERASE_GROUP_END : return TYPE_RESP_R1; break;
86 2 case ERASE : return TYPE_RESP_R1; break;
87 2 case FAST_IO : return TYPE_RESP_R4; break;
88 2 case GO_IRQ_STATE : return TYPE_RESP_R5; break;
89 2 case LOCK_UNLOCK : return TYPE_RESP_R1; break;
90 2 case APP_CMD : return TYPE_RESP_R1; break;
91 2 case GEN_CMD : return TYPE_RESP_R1; break;
92 2 // APP_CMDs
93 2 case SEND_NUM_WR_BLOCKS : return TYPE_RESP_R1; break;
94 2 case SD_SEND_OP_COND : return TYPE_RESP_R3; break;
95 2 case SEND_SCR : return TYPE_RESP_R1; break;
96 2 default : return TYPE_RESP_NO; break;
97 2 }
98 1 // Following commands are with identical index and response type:
99 1 // 1. SET_BUS_WIDTH (ACMD6) Response R1
100 1 // SWITCH (CMD6) Response R1
101 1 // 2. SEND_SD_STATUS (ACMD13) Response R1
102 1 // SEND_STATUS (CMD13) Response R1
103 1 // 3. SET_WR_BLK_ERASE_CNT (ACMD23) Response R1
104 1 // SET_BLOCK_COUNT (CMD23) Response R1
105 1 // 4. SET_CLR_CARD_DETECT (ACMD42) Response R1
106 1 // LOCK_UNLOCK (CMD42) Response R1
107 1 }
108
109 STATUS SdSendCmd(BYTE CmdIndex, BYTE *CmdBuf)
110 {
111 1 BYTE RespType , RespLen , CmdType;
112 1 BYTE i;
113 1 BYTE RetryCount = 0;
114 1
115 1 RespType = SdGetRespType(CmdIndex);
116 1
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 3
117 1 if( (CmdIndex == GEN_CMD)||
118 1 (CmdIndex == SEND_NUM_WR_BLOCKS)||
119 1 (CmdIndex == SEND_SCR)||
120 1 (CmdIndex == SEND_EXT_CSD)||
121 1 (CmdIndex == READ_BLOCK)||
122 1 (CmdIndex == READ_MUL_BLOCK)||
123 1 (CmdIndex == READ_DAT_UNTIL_STOP)/*||
124 1 (CmdIndex == SEND_WRITE_PROT)*/) //2006.05.21
125 1 {
126 2 RespLen = 6;
127 2 CmdType = SD_CMD_RX_DATA;
128 2 }
129 1 else if((CmdIndex == PROGRAM_CSD)||
130 1 (CmdIndex == LOCK_UNLOCK)||
131 1 (CmdIndex == WRITE_BLOCK)||
132 1 (CmdIndex == WRITE_MUL_BLOCK))
133 1 {
134 2 RespLen = 6;
135 2 CmdType = SD_CMD_TX_DATA;
136 2 }
137 1 else if(RespType == TYPE_RESP_NO)
138 1 {
139 2 RespLen = 0;
140 2 CmdType = SD_CMD_ONLY;
141 2 }
142 1 else if(RespType == TYPE_RESP_R2)
143 1 {
144 2 RespLen = 17;
145 2 CmdType = SD_CMD_LONG_RSP;
146 2 }
147 1
148 1 else
149 1 {
150 2 RespLen = 6;
151 2 CmdType = SD_CMD_SHORT_RSP;
152 2 }
153 1
154 1 if (CmdIndex == 0x5)
155 1 {
156 2 RespLen = 6;
157 2 CmdType = SD_CMD_SHORT_RSP;
158 2
159 2 }
160 1
161 1 for( ; RetryCount < 3; RetryCount++)
162 1 {
163 2 SDMCMDRESBUF00=0x40|CmdIndex; //The First byte
164 2 for(i = 1; i <= 4; i++) //The next 4 bytes
165 2 ((BYTE xdata *)(&SDMCMDRESBUF00))[i]=CmdBuf[i];
166 2
167 2 SDMI_CMD=CmdType;
168 2
169 2 CmdTimer = 5; // 50ms
170 2 //while((SDMI_INT&bmSD_COMPLETE_INT)==0);
171 2 //SDMI_INT&=~bmSD_COMPLETE_INT;
172 2 while(CmdTimer > 0)
173 2 {
174 3 if((SDMI_INT&bmSD_COMPLETE_INT)!=0) //wait for command is completed.
175 3 {
176 4 SDMI_INT&=~bmSD_COMPLETE_INT;
177 4 break;
178 4 }
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 4
179 3 }//*/
180 2 if(CmdTimer == 0) // Timeout
181 2 {
182 3 SdCtrlReset(); // ???
183 3
184 3 //MMCerror2++;
185 3 continue;
186 3 }
187 2
188 2 if(RespType == TYPE_RESP_NO)
189 2 return STATUS_SUCCESS;
190 2
191 2 if(RespType == TYPE_RESP_R3)
192 2 {
193 3 // The response type of SD_SEND_OP_COND (ACMD41) and
194 3 // SEND_OP_COND (CMD1) are both R3, which is not protected
195 3 // by CRC7. But hardware could still report CRC7 error for
196 3 // these command's response. So, to prevent from affecting
197 3 // next command, we clear CRC7-ERR INT bit here.
198 3 SDMI_ST&=~bmSD_CRC7_ERR;
199 3 for(i = 0; i < RespLen; i++)
200 3 SdRespBuf[i] = ((BYTE xdata *)(&SDMCMDRESBUF00))[i];
201 3 return STATUS_SUCCESS;
202 3 }
203 2
204 2 if(SDMI_ST&bmSD_CRC7_ERR) // CRC7 Error
205 2 {
206 3 SDMI_ST&=~bmSD_CRC7_ERR; // Clear INT
207 3 continue;
208 3 }
209 2
210 2 for(i = 0; i < RespLen; i++)
211 2 SdRespBuf[i] = ((BYTE xdata *)(&SDMCMDRESBUF00))[i];
212 2
213 2 if(RespType == TYPE_RESP_R1)
214 2 {
215 3 // Check following error bits in Card Status:
216 3 // 31 OUT_OF_RANGE SdRespBuf[1].7
217 3 // 30 ADDRESS_ERROR SdRespBuf[1].6
218 3 // 29 BLOCK_LEN_ERROR SdRespBuf[1].5
219 3 // 28 ERASE_SEQ_ERROR SdRespBuf[1].4
220 3 // 27 ERASE_PARAM SdRespBuf[1].3
221 3 // 26 WP_VIOLATION SdRespBuf[1].2
222 3 // 24 LOCK_UNLOCK_FAILED SdRespBuf[1].0
223 3 // 23 COM_CRC_ERR SdRespBuf[2].7
224 3 // 22 ILLEGAL_COMMAND SdRespBuf[2].6
225 3 // 21 CARD_ECC_FAILED SdRespBuf[2].5
226 3 // 20 CC_ERROR SdRespBuf[2].4
227 3 // 19 ERROR SdRespBuf[2].3
228 3 if( ( (SdRespBuf[1] & 0xFD) == 0 ) && // 8'b1111_1101
229 3 ( (SdRespBuf[2] & 0xF8) == 0 ) ) // 8'b1111_1000
230 3 return STATUS_SUCCESS; // No error
231 3 else
232 3 if( ( SdRespBuf[1] == 0x80 ) && //ignor OUT_OF_RANGE error
233 3 ( SdRespBuf[2] == 0 ) && // when multi read last 5 blocks
234 3 (( SectorStart >= SdAvailableBlocks-5)||
235 3 ( SectorStart <= SdAvailableBlocks))) //see MMC 4.0 SPEC--4.6.3(page 49)
236 3 return STATUS_SUCCESS; //
237 3 else //
238 3 continue;
239 3 }
240 2 else
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 5
241 2 return STATUS_SUCCESS;
242 2 }
243 1 return STATUS_FLASH_ERROR;
244 1 }
245
246 STATUS SdSendAppCmd(BYTE AppCmdIndex, BYTE *CmdBuf)
247 {
248 1 STATUS Status;
249 1 int RetryCount;
250 1 BYTE CmdBuf55[5]; // for APP_CMD (CMD55)
251 1
252 1 for(RetryCount = 0; RetryCount < 3; RetryCount++)
253 1 {
254 2 *((INT32U *)(&CmdBuf55[1])) = RCA;
255 2 Status = SdSendCmd(APP_CMD,CmdBuf55);
256 2
257 2 if(Status != STATUS_SUCCESS)
258 2 {
259 3 continue;
260 3 }
261 2
262 2 Status = SdSendCmd(AppCmdIndex,CmdBuf);
263 2
264 2 if(Status != STATUS_SUCCESS)
265 2 continue;
266 2 else
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -