📄 sd.lst
字号:
267 2 return STATUS_SUCCESS;
268 2 }
269 1 return STATUS_FLASH_ERROR;
270 1 }
271
272 STATUS SdReset()
273 {
274 1 STATUS Status;
275 1 int i;
276 1
277 1 SdLowClk();
278 1 Delay1ms(150);
279 1 for(i = 1; i <= 4; i++)
280 1 SdCmdBuf[i]=0;
281 1 Status = SdSendCmd(GO_IDLE_STATE,SdCmdBuf);
282 1 return Status;
283 1 }
284
285 STATUS SdCardDetect()
286 {
287 1 STATUS Status;
288 1 INT16U RetryCount;
289 1
290 1 *(INT32U *)(&SdCmdBuf[1])=OPERATION_VOL_RANGE;
291 1 Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
292 1
293 1 if(Status == STATUS_SUCCESS)
294 1 {
295 2 CardType = CARD_SD;
296 2
297 2 // Check if card power-up operation finished
298 2 if(SDMCMDRESBUF01 & CARD_PWRUP_FINISH)
299 2 return STATUS_SUCCESS;
300 2
301 2 // Wait until card power-up operation finished
302 2 for(RetryCount = 0; RetryCount < 500; RetryCount++)
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 6
303 2 {
304 3 *((INT32U idata *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
305 3
306 3 Status = SdSendAppCmd(SD_SEND_OP_COND, SdCmdBuf);
307 3
308 3 if(Status != STATUS_SUCCESS)
309 3 continue;
310 3
311 3 if(SDMCMDRESBUF01 & CARD_PWRUP_FINISH)
312 3 return STATUS_SUCCESS;
313 3 }
314 2 return STATUS_FLASH_ERROR;
315 2 }
316 1
317 1 else
318 1 {
319 2 CardType = CARD_MMC;
320 2
321 2 // Wait until card power-up operation finished
322 2 for(RetryCount = 0; RetryCount < 500; RetryCount++)
323 2 {
324 3 *((INT32U *)(&SdCmdBuf[1])) = OPERATION_VOL_RANGE;
325 3
326 3 Status = SdSendCmd(SEND_OP_COND, SdCmdBuf);
327 3
328 3 if(Status != STATUS_SUCCESS)
329 3 continue;
330 3
331 3 if(SdRespBuf[1] & CARD_PWRUP_FINISH)
332 3 return STATUS_SUCCESS;
333 3 }
334 2 return STATUS_FLASH_ERROR;
335 2 }
336 1 return Status;
337 1 }
338
339 STATUS SdGoIdentifyState()
340 {
341 1 STATUS Status;
342 1 int i;
343 1
344 1 for(i = 1; i <= 4; i++)
345 1 SdCmdBuf[i] = 0;
346 1 Status = SdSendCmd(ALL_SEND_CID,SdCmdBuf);
347 1 return Status;
348 1 }
349
350 STATUS SdGoStandbyState()
351 {
352 1 STATUS Status;
353 1 int i;
354 1
355 1 if(CardType == CARD_SD)
356 1 {
357 2 for(i = 1; i <= 4; i++)
358 2 SdCmdBuf[i] = 0;
359 2 }
360 1 else
361 1 {
362 2 RCA = 0x00010000;
363 2 *((INT32U idata *)(&SdCmdBuf[1])) = RCA;
364 2 }
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 7
365 1
366 1 Status = SdSendCmd(SEND_RELATIVE_ADDR,SdCmdBuf);
367 1
368 1 if(CardType == CARD_SD)
369 1 RCA = *((INT32U *)(&SdRespBuf[1])) & 0xffff0000;
370 1
371 1 return STATUS_SUCCESS;
372 1 }
373
374 //--------------------------------------------------------------------
375 STATUS SdReadCSD()
376 {
377 1 STATUS Status;
378 1 BYTE READ_BL_LEN;
379 1 BYTE C_SIZE_MUTI;
380 1 INT32U C_SIZE;
381 1 int i;
382 1
383 1 *((INT32U *)(&SdCmdBuf[1])) = RCA;
384 1
385 1 Status = SdSendCmd(SEND_CSD,SdCmdBuf);
386 1 for(i=0;i<17;i++)
387 1 SdRespBufForProgCsd[i]=SdRespBuf[i];
388 1 if(Status != STATUS_SUCCESS)
389 1 return Status;
390 1
391 1 if(SdRespBuf[1] & 0x3c)//check MMC3.1 or MMC4.0
392 1 MmcProtol = TRUE;
393 1 else
394 1 MmcProtol = FALSE;
395 1
396 1 READ_BL_LEN = SdRespBuf[6] & 0xf;
397 1 C_SIZE = SdRespBuf[7] & 0x3;
398 1 C_SIZE <<= 8;
399 1 C_SIZE |= SdRespBuf[8];
400 1 C_SIZE <<= 2;
401 1 C_SIZE |= (SdRespBuf[9] >> 6);
402 1 C_SIZE_MUTI = SdRespBuf[10] & 0x3;
403 1 C_SIZE_MUTI <<= 1;
404 1 C_SIZE_MUTI |= (SdRespBuf[11] >> 7);
405 1
406 1 SdAvailableBlocks = (INT32U)((C_SIZE + 1) << (C_SIZE_MUTI + 2 + (READ_BL_LEN - BYTES_PER_SECTOR_SHIFT)
-));
407 1 SdAvailableBlocks -= 1;
408 1
409 1 return STATUS_SUCCESS;
410 1 }
411
412 STATUS SdGoTransferState()
413 {
414 1 STATUS Status;
415 1 BYTE CurrentState;
416 1
417 1 *((INT32U *)(&SdCmdBuf[1])) = RCA;
418 1 Status = SdSendCmd(SELECT_CARD, SdCmdBuf);
419 1 if(Status != STATUS_SUCCESS)
420 1 return Status;
421 1
422 1 *((INT32U *)(&SdCmdBuf[1])) = RCA;
423 1 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
424 1 if(Status != STATUS_SUCCESS)
425 1 return Status;
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 8
426 1
427 1 CurrentState = (SdRespBuf[3] >> 1) & 0x0F;
428 1 if(CurrentState == TRANSFER_STATE)
429 1 {
430 2 SdHiClk();
431 2 if(CardType == CARD_SD)
432 2 {
433 3 Status = SdChangeBusWidth(4); /////
434 3 if(Status != STATUS_SUCCESS)
435 3 return Status;
436 3 }
437 2 else // MMC 3.1,only 1bit Mode
438 2 {
439 3 Status = SdChangeBusWidth(8);
440 3 if(Status != STATUS_SUCCESS)
441 3 return Status;
442 3 }
443 2 }
444 1 else
445 1 return STATUS_FLASH_ERROR;
446 1
447 1 return STATUS_SUCCESS;
448 1 }
449
450 //----------------------------------------------------------------------------
451 STATUS SdChangeBusWidth(BYTE busWidth) //
452 {
453 1 STATUS Status;
454 1
455 1 if(CardType == CARD_SD)
456 1 {
457 2 if(busWidth==4)
458 2 *((INT32U *)(&SdCmdBuf[1])) = RCA | 0x02; //4bits bus width
459 2 else
460 2 *((INT32U *)(&SdCmdBuf[1])) = RCA;
461 2
462 2 Status = SdSendAppCmd(SET_BUS_WIDTH,SdCmdBuf);
463 2 if(Status == STATUS_SUCCESS)
464 2 {
465 3 if(busWidth==4)
466 3 {
467 4 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
468 4 SDMI_CTL|=bmSD_BUS_4BIT_EN;
469 4 }
470 3 else
471 3 {
472 4 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
473 4 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
474 4 }
475 3 }
476 2 }
477 1 else // MMC
478 1 {
479 2 if(MmcProtol) // MMC 4.0 surport 1/4/8 bits mode
480 2 {
481 3 if(busWidth==8)
482 3 *((INT32U *)(&SdCmdBuf[1])) = 0x03b70200;
483 3 else if(busWidth==4)
484 3 *((INT32U *)(&SdCmdBuf[1])) = 0x03b70100;
485 3 else
486 3 *((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
487 3 //*((INT32U *)(&SdCmdBuf[1])) = 0x03b70000;
C51 COMPILER V7.50 SD 04/17/2007 10:40:23 PAGE 9
488 3 Status = SdSendCmd(SWITCH, SdCmdBuf);
489 3
490 3 if(Status == STATUS_SUCCESS)
491 3 {
492 4 *((INT32U *)(&SdCmdBuf[1])) = RCA;
493 4 Status = SdSendCmd(SEND_STATUS, SdCmdBuf);
494 4
495 4 if(Status == STATUS_SUCCESS)
496 4 {
497 5 if(busWidth==8)
498 5 {
499 6 SDMI_CTL|=bmSD_BUS_8BIT_EN;
500 6 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
501 6 }
502 5 else if((busWidth==4))
503 5 {
504 6 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
505 6 SDMI_CTL|=bmSD_BUS_4BIT_EN;
506 6 }
507 5 else
508 5 {
509 6 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
510 6 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
511 6 }
512 5 }
513 4
514 4 }
515 3
516 3 }
517 2 else // MMC 3.1 surpport 1bit only
518 2 {
519 3 SDMI_CTL&=~bmSD_BUS_4BIT_EN;
520 3 SDMI_CTL&=~bmSD_BUS_8BIT_EN;
521 3 }
522 2 }
523 1 return Status;
524 1 }
525
526
527 //----------------------------------------------------------------------------
528 // Description:
529 // Stop the read or write command
530 //----------------------------------------------------------------------------
531 STATUS SdStopCmd()
532 {
533 1 STATUS Status;
534 1 int i;
535 1
536 1 SDMI_CTL&=~bmSD_AUTO_CLK_EN;
537 1
538 1 for(i = 1; i <= 4; i++)
539 1 SdCmdBuf[i] = 0;
540 1 Status = SdSendCmd(STOP_TRANS, SdCmdBuf);
541 1 if(Status != STATUS_SUCCESS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -