📄 sd.lst
字号:
208 1 // Following commands are with identical index and response type:
209 1 // 1. SET_BUS_WIDTH (ACMD6) Response R1
210 1 // SWITCH (CMD6) Response R1
211 1 // 2. SEND_SD_STATUS (ACMD13) Response R1
212 1 // SEND_STATUS (CMD13) Response R1
213 1 // 3. SET_WR_BLK_ERASE_CNT (ACMD23) Response R1
214 1 // SET_BLOCK_COUNT (CMD23) Response R1
215 1 // 4. SET_CLR_CARD_DETECT (ACMD42) Response R1
216 1 // LOCK_UNLOCK (CMD42) Response R1
217 1 }
218
219 STATUS SdSendCmd(BYTE CmdIndex, PBYTE CmdBuf)
220 {
221 1 BYTE RespType , RespLen , CmdType;
222 1 BYTE Status;
223 1 BYTE i;
224 1 BYTE RetryCount = 0;
225 1
226 1 RespType = SdGetRespType(CmdIndex);
227 1
228 1 if((CmdIndex == READ_BLOCK)||
229 1 (CmdIndex == READ_MUL_BLOCK))
230 1 {
231 2 RespLen = 6;
232 2 CmdType = SD_CMD_RX_DATA;
233 2 }
234 1 else if((CmdIndex == WRITE_BLOCK)||
235 1 (CmdIndex == WRITE_MUL_BLOCK))
236 1 {
237 2 RespLen = 6;
238 2 CmdType = SD_CMD_TX_DATA;
239 2 }
240 1 else if(RespType == TYPE_RESP_NO)
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 PAGE 5
241 1 {
242 2 RespLen = 0;
243 2 CmdType = SD_CMD_ONLY;
244 2 }
245 1 else if(RespType == TYPE_RESP_R2)
246 1 {
247 2 RespLen = 17;
248 2 CmdType = SD_CMD_LONG_RSP;
249 2 }
250 1 else
251 1 {
252 2 RespLen = 6;
253 2 CmdType = SD_CMD_SHORT_RSP;
254 2 }
255 1
256 1 for( ; RetryCount < 3; RetryCount++)
257 1 {
258 2 CmdBuf[0] = CARD_CMD_START | CmdIndex;
259 2 for(i = 0; i < 5; i++)
260 2 CSRWrite(SD_BASE + SD_CMDBUF_BASE + i, CmdBuf[i]);
261 2
262 2 CSRWrite(SD_BASE + SD_COMMAND, CmdType);
263 2
264 2 //CmdTimer = SD_CMD_TIMEOUT;
265 2 CmdTimer = 5; // 50ms
266 2 while(CmdTimer > 0)
267 2 {
268 3 Status = CSRRead(SD_BASE + SD_IE);
269 3 if(Status & SD_COMPLETE)
270 3 {
271 4 CSRWrite(SD_BASE + SD_IE, ~SD_COMPLETE); // Clear INT
272 4 break;
273 4 }
274 3 }
275 2 if(CmdTimer == 0) // Timeout
276 2 {
277 3 SdCtrlReset(); // ???
278 3 continue;
279 3 }
280 2
281 2 if(RespType == TYPE_RESP_NO)
282 2 return STATUS_SUCCESS;
283 2
284 2 if(RespType == TYPE_RESP_R3)
285 2 {
286 3 // The response type of SD_SEND_OP_COND (ACMD41) and
287 3 // SEND_OP_COND (CMD1) are both R3, which is not protected
288 3 // by CRC7. But hardware could still report CRC7 error for
289 3 // these command's response. So, to prevent from affecting
290 3 // next command, we clear CRC7-ERR INT bit here.
291 3 CSRWrite(SD_BASE + SD_IE, ~SD_CRC7_ERR);
292 3 for(i = 0; i < RespLen; i++)
293 3 SdRespBuf[i] = CSRRead(SD_BASE + SD_RESPBUF_BASE + i);
294 3 return STATUS_SUCCESS;
295 3 }
296 2
297 2 if(CSRRead(SD_BASE + SD_IE) & SD_CRC7_ERR) // CRC7 Error
298 2 {
299 3 CSRWrite(SD_BASE + SD_IE, ~SD_CRC7_ERR); // Clear INT
300 3 continue;
301 3 }
302 2
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 PAGE 6
303 2 for(i = 0; i < RespLen; i++)
304 2 SdRespBuf[i] = CSRRead(SD_BASE + SD_RESPBUF_BASE + i);
305 2
306 2 if(RespType == TYPE_RESP_R1)
307 2 {
308 3 // Check following error bits in Card Status:
309 3 // 31 OUT_OF_RANGE SdRespBuf[1].7
310 3 // 30 ADDRESS_ERROR SdRespBuf[1].6
311 3 // 29 BLOCK_LEN_ERROR SdRespBuf[1].5
312 3 // 28 ERASE_SEQ_ERROR SdRespBuf[1].4
313 3 // 27 ERASE_PARAM SdRespBuf[1].3
314 3 // 26 WP_VIOLATION SdRespBuf[1].2
315 3 // 24 LOCK_UNLOCK_FAILED SdRespBuf[1].0
316 3 // 23 COM_CRC_ERR SdRespBuf[2].7
317 3 // 22 ILLEGAL_COMMAND SdRespBuf[2].6
318 3 // 21 CARD_ECC_FAILED SdRespBuf[2].5
319 3 // 20 CC_ERROR SdRespBuf[2].4
320 3 // 19 ERROR SdRespBuf[2].3
321 3 if( ( (SdRespBuf[1] & 0xFD) == 0 ) && // 8'b1111_1101
322 3 ( (SdRespBuf[2] & 0xF8) == 0 ) ) // 8'b1111_1000
323 3 return STATUS_SUCCESS; // No error
324 3 else
325 3 continue;
326 3 }
327 2 else
328 2 return STATUS_SUCCESS;
329 2 }
330 1 return STATUS_FLASH_ERROR;
331 1 }
332
333 STATUS SdSendAppCmd(BYTE AppCmdIndex, PBYTE AppCmdBuf)
334 {
335 1 STATUS Status;
336 1 int RetryCount;
337 1 BYTE CmdBuf55[MAX_CMD_LEN]; // for APP_CMD (CMD55)
338 1
339 1 for(RetryCount = 0; RetryCount < 3; RetryCount++)
340 1 {
341 2 *((UINT32 *)(&CmdBuf55[1])) = RCA;
342 2
343 2 Status = SdSendCmd(APP_CMD, CmdBuf55);
344 2
345 2 if(Status != STATUS_SUCCESS)
346 2 continue;
347 2
348 2 Status = SdSendCmd(AppCmdIndex, AppCmdBuf);
349 2
350 2 if(Status != STATUS_SUCCESS)
351 2 continue;
352 2 else
353 2 return STATUS_SUCCESS;
354 2 }
355 1 return STATUS_FLASH_ERROR;
356 1 }
357
358 //----------------------------------------------------------------------------
359 STATUS SdChangeBusWidth()
360 {
361 1 STATUS Status;
362 1 BYTE RegValue;
363 1
364 1 *((UINT32 *)(&SdCmdBuf[1])) = RCA | BUS_WIDTH_4BIT;
C51 COMPILER V7.02b SD 02/01/2007 10:35:44 PAGE 7
365 1
366 1 Status = SdSendAppCmd(SET_BUS_WIDTH, SdCmdBuf);
367 1
368 1 if(Status == STATUS_SUCCESS)
369 1 {
370 2 RegValue = CSRRead(SD_BASE + SD_CLK_CTRL);
371 2 //RegValue |= SD_CLK_NIBBLE;
372 2 RegValue |= 0x10;
373 2 CSRWrite(SD_BASE + SD_CLK_CTRL, RegValue);
374 2 }
375 1 return Status;
376 1 }
377
378 //----------------------------------------------------------------------------
379 STATUS SdReset()
380 {
381 1 STATUS Status;
382 1 int i;
383 1
384 1 RCA = 0;
385 1
386 1 SdLoClk();
387 1 Delay(5); // Wait 5ms for stable clock
388 1 for(i = 1; i <= 4; i++)
389 1 SdCmdBuf[i] = 0;
390 1 Status = SdSendCmd(GO_IDLE_STATE, SdCmdBuf);
391 1 return Status;
392 1 }
393
394 //----------------------------------------------------------------------------
395 STATUS SdDetect()
396 {
397 1 STATUS Status;
398 1 UINT16 RetryCount;
399 1
400 1 *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
401 1
402 1 Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
403 1
404 1 if(Status == STATUS_SUCCESS)
405 1 {
406 2 CardType = CARD_SD;
407 2
408 2 // Check if card power-up operation finished
409 2 if(SdRespBuf[1] & CARD_PWRUP_FINISH)
410 2 return STATUS_SUCCESS;
411 2
412 2 // Wait until card power-up operation finished
413 2 for(RetryCount = 0; RetryCount < 500; RetryCount++)
414 2 {
415 3 *((UINT32 *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
416 3
417 3 Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
418 3
419 3 if(Status != STATUS_SUCCESS)
420 3 continue;
421 3
422 3 if(SdRespBuf[1] & CARD_PWRUP_FINISH)
423 3 return STATUS_SUCCESS;
424 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -