⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.lst

📁 SdCard_V2.1TinyFatFs.rar是单片机实现SD卡功能的FAT文件系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\Output\Sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sd.c LARGE OPTIMIZE(9,SIZE) BROWSE ORDER DEBUG OBJECTEXTEND PRINT(.\Output\
                    -Sd.lst) OBJECT(.\Output\Sd.obj)

stmt level    source

   1          /*
   2          **********************************************************************************************
   3          * Project:      FS7805 SD CARD READER
   4          * File:         main.c
   5          * Contents: 
   6          *           The main function is SD and MMC card reader.
   7          *
   8          * $Date: 12/15/06    Derek    V1.0  
   9          *  
  10          * Coments: This is the SD/MMC card reader firmware.
  11          *                  When read sector,the 512 pingpong FIFO mechanism
  12          *                  is used to improve performance.But when write sector,
  13          *                  only single FIFO is used.
  14          *
  15          * $Date: 12/27/06    Derek    V1.1
  16          *
  17          *                  The 512 pingpong FIFO mechanism is also used when 
  18          *                  writting sectors.
  19          *
  20          * $Date: 01/09/07    Derek    V1.11
  21          *
  22          *                  Fix read sector error bug . 
  23          *                  Don't set FIFO_FULL bit in SetBulkInFull() function.
  24          *                  Setting it in BulkSetDmaIn() function.
  25          *
  26          * $Date: 01/18/07    Derek    V1.11
  27          *
  28          *                  Ignor the OUT_OF_RANGE error in SdSendCmd() when
  29          *                  multi read the last block.
  30          *
  31          * Copyright (c) 2006 Fameg, Inc. All rights reserved
  32          *
  33          * 
  34          ***********************************************************************************************
  35          */
  36          #include "include\Include.h"
  37          
  38          #define MAX_CMD_LEN          6
  39          #define MAX_RESP_LEN         17 // Max response length = 136 bits
  40          #define RSP_LEN              6     
  41          #define LONG_RSP_LEN         17
  42          #define CARD_CMD_START       0x40
  43          #define CARD_PWRUP_FINISH    0x80
  44          #define OPERATION_VOL_RANGE  0x00FF0000
  45          #define GOOD_CRC16_STS       0x02
  46          
  47          /* SD_COMMAND */
  48          #define SD_CMD_ONLY         1
  49          #define SD_CMD_SHORT_RSP    2 
  50          #define SD_CMD_LONG_RSP     3
  51          #define SD_CMD_TX_DATA      4
  52          #define SD_CMD_TX_DATA_ONLY 5 
  53          #define SD_CMD_RX_DATA      6
  54          #define SD_CMD_RX_DATA_ONLY 7 
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 2   

  55          
  56          #define IDLE_STATE          0  
  57          #define READY_STATE         1
  58          #define IDENTIFY_STATE      2
  59          #define STANDBY_STATE       3
  60          #define TRANSFER_STATE      4  
  61          #define DATA_STATE          5
  62          #define RECEIVE_STATE       6
  63          #define PRGROGAM_STATE      7
  64          #define DISCONNECT_STATE    8  
  65          
  66          #define BUS_WIDTH_1BIT      0x00
  67          #define BUS_WIDTH_4BIT      0x02
  68          
  69          //      Command Name      Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
  70          #define GO_IDLE_STATE        0    //  V      V      V      -
  71          #define SEND_OP_COND         1    //  V      V             R3 (OCR)
  72          #define ALL_SEND_CID         2    //  V      V      V      R2
  73          #define SEND_RELATIVE_ADDR   3    //  R1     R1     R6     See SdGetRespType()
  74          #define SET_DSR              4    //  V      V      V      - 
  75          #define SWITCH               6    //         V             R1b
  76          #define CMD6                             6   //                                                                 R1(SD 1.10,2.0)
  77          #define SELECT_CARD          7    //  V      V      V      R1
  78          #define SEND_EXT_CSD         8    //         V             R1
  79          #define SEND_IF_COND         8    //                                            R7(SD2.0)
  80          #define SEND_CSD             9    //  V      V      V      R2
  81          #define SEND_CID             10   //  V      V      V      R2
  82          #define READ_DAT_UNTIL_STOP  11   //  V      V             R1
  83          #define STOP_TRANS           12   //  V      V      V      R1
  84          #define SEND_STATUS          13   //  V      V      V      R1
  85          #define GO_INACTIVE_STATE    15   //  V      V      V      - 
  86          #define SET_BLOCKLEN         16   //  V      V      V      R1
  87          #define READ_BLOCK           17   //  V      V      V      R1
  88          #define READ_MUL_BLOCK       18   //  V      V      V      R1
  89          #define WRITE_DAT_UNTIL_STOP 20   //  V      V             R1
  90          #define SET_BLOCK_COUNT      23   //  V      V             R1
  91          #define WRITE_BLOCK          24   //  V      V      V      R1
  92          #define WRITE_MUL_BLOCK      25   //  V      V      V      R1
  93          #define PROGRAM_CID          26   //  V      V             R1
  94          #define PROGRAM_CSD          27   //  V      V      V      R1
  95          #define SET_WRITE_PROT       28   //  V      V      V      R1
  96          #define CLR_WRITE_PROT       29   //  V      V      V      R1
  97          #define SEND_WRITE_PROT      30   //  V      V      V      R1
  98          #define ERASE_WR_BLK_START   32   //                V      R1
  99          #define ERASE_WR_BLK_END     33   //                V      R1
 100          #define ERASE_GROUP_START    35   //  V      V             R1
 101          #define ERASE_GROUP_END      36   //  V      V             R1
 102          #define ERASE                38   //  V      V      V      R1
 103          #define FAST_IO              39   //  V      V             R4
 104          #define GO_IRQ_STATE         40   //  V      V             R5
 105          #define LOCK_UNLOCK          42   //  V      V      V      R1
 106          #define APP_CMD              55   //  V      V      V      R1
 107          #define GEN_CMD              56   //  V      V      V      R1
 108          
 109          //      ACMD Name         Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
 110          #define SET_BUS_WIDTH        6    //                V      R1
 111          #define SEND_SD_STATUS       13   //                V      R1
 112          #define SEND_NUM_WR_BLOCKS   22   //                V      R1
 113          #define SET_WR_BLK_ERASE_CNT 23   //                V      R1
 114          #define SD_SEND_OP_COND      41   //                V      R3 (OCR)
 115          #define SET_CLR_CARD_DETECT  42   //                V      R1
 116          #define SEND_SCR             51   //                V      R1
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 3   

 117          
 118          // ??? According to Spec of MMC3.1, MultiMediaCard returns response of
 119          //     type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01 
 120          //     page 23, MultiMediaCard will not respond to APP_CMD - CMD55. 
 121          //     Is this a confliction ? 
 122          
 123          
 124          #define SdHiClk()  SDMI_CTL=(SDMI_CTL|bmSD_CLK_SEL)|bmSD_CLK_EN;
 125          #define SdLoClk()  SDMI_CTL=(SDMI_CTL&~bmSD_CLK_SEL)|bmSD_CLK_EN; 
 126          #define SdStopClk() SDMI_CTL=SDMI_CTL&~bmSD_CLK_EN & ~bmSD_AUTO_CLK_EN; //06.08.22                     
 127          #define IsCardBusy() (SDMI_ST&bmSD_BUSY)     
 128          #define SdWriteProtect() ((SDMI_ST & bmSD_WR_PROTECT))
 129          
 130          
 131          #define SdWaitCard()\
 132          {\
 133            CmdTimer = SD_CMD_TIMEOUT;\
 134            while (IsCardBusy() && CmdTimer);\
 135          }
 136          
 137          #define SdPowerOn()
 138          #define SdPowerOff()
 139          
 140          
 141          typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;
 142          
 143          /*************************************************
 144             Global Variables
 145          *************************************************/
 146          xdata BYTE SdGetFlashInfoTimer = 0;
 147          //BYTE xdata SdRespBufForProgCsd[17];
 148          /*************************************************
 149             Local Variables
 150          *************************************************/
 151          static xdata UINT32 SdAvailableBlocks = 0;
 152          static xdata TCARD_TYPE CardType = CARD_SD;
 153          static xdata BYTE SdCmdBuf[MAX_CMD_LEN];
 154          xdata BYTE SdRespBuf[MAX_RESP_LEN]; 
 155          static xdata UINT32 RCA = 0;
 156          static BOOL MmcProtol;//控制是3.1的卡还是4.0的卡。
 157          xdata BYTE SdHcFlag = 0;//Derek 2007.06.29
 158          xdata BYTE SdVer2Flag = 0;//是否2.00的SD卡
 159          #define TYPE_RESP_NO      0
 160          #define TYPE_RESP_R1      1
 161          #define TYPE_RESP_R2      2
 162          #define TYPE_RESP_R3      3
 163          #define TYPE_RESP_R4      4
 164          #define TYPE_RESP_R5      5
 165          #define TYPE_RESP_R6      6
 166          #define TYPE_RESP_R7      7
 167          
 168          /*
 169          *********************************************************************************************************
 170          *                                    SdGetRespType()
 171          *
 172          * Description: Return response type of every command.
 173          *
 174          * Arguments  : CmdIndex
 175          *                          
 176          * Returns    : none
 177          *********************************************************************************************************
 178          */
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 4   

 179          BYTE SdGetRespType(BYTE CmdIndex)
 180          {
 181   1          if(CmdIndex == SEND_RELATIVE_ADDR)
 182   1          {
 183   2              ////if(CardType == CARD_SD)
 184   2                  return TYPE_RESP_R6;
 185   2              ////else
 186   2              ////    return TYPE_RESP_R1;//对MMC,若返回R1会出现illegal command 错误标志
 187   2          }
 188   1          switch(CmdIndex)
 189   1          {
 190   2              case GO_IDLE_STATE        : return TYPE_RESP_NO; break;
 191   2              case SEND_OP_COND         : return TYPE_RESP_R3; break;
 192   2              case ALL_SEND_CID         : return TYPE_RESP_R2; break;
 193   2              case SET_DSR              : return TYPE_RESP_NO; break;
 194   2      //        case SWITCH               : return TYPE_RESP_R1; break;
 195   2                      case CMD6                 : return TYPE_RESP_R1; break;   //Derek 2007.07.02
 196   2              case SELECT_CARD          : return TYPE_RESP_R1; break;
 197   2      //        case SEND_EXT_CSD         : return TYPE_RESP_R1; break;
 198   2                      case SEND_IF_COND                 : return TYPE_RESP_R7; break;//2007.06.29
 199   2              case SEND_CSD             : return TYPE_RESP_R2; break;
 200   2              case SEND_CID             : return TYPE_RESP_R2; break;
 201   2              case READ_DAT_UNTIL_STOP  : return TYPE_RESP_R1; break;
 202   2              case STOP_TRANS           : return TYPE_RESP_R1; break;
 203   2              case SEND_STATUS          : return TYPE_RESP_R1; break;
 204   2              case GO_INACTIVE_STATE    : return TYPE_RESP_NO; break;
 205   2              case SET_BLOCKLEN         : return TYPE_RESP_R1; break;
 206   2              case READ_BLOCK           : return TYPE_RESP_R1; break;
 207   2              case READ_MUL_BLOCK       : return TYPE_RESP_R1; break;
 208   2              case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
 209   2              case SET_BLOCK_COUNT      : return TYPE_RESP_R1; break;
 210   2              case WRITE_BLOCK          : return TYPE_RESP_R1; break;
 211   2              case WRITE_MUL_BLOCK      : return TYPE_RESP_R1; break;
 212   2              case PROGRAM_CID          : return TYPE_RESP_R1; break;
 213   2              case PROGRAM_CSD          : return TYPE_RESP_R1; break;
 214   2              case SET_WRITE_PROT       : return TYPE_RESP_R1; break;
 215   2              case CLR_WRITE_PROT       : return TYPE_RESP_R1; break;
 216   2              case SEND_WRITE_PROT      : return TYPE_RESP_R1; break;
 217   2              case ERASE_WR_BLK_START   : return TYPE_RESP_R1; break;
 218   2              case ERASE_WR_BLK_END     : return TYPE_RESP_R1; break;
 219   2              case ERASE_GROUP_START    : return TYPE_RESP_R1; break;
 220   2              case ERASE_GROUP_END      : return TYPE_RESP_R1; break;
 221   2              case ERASE                : return TYPE_RESP_R1; break;
 222   2              case FAST_IO              : return TYPE_RESP_R4; break;
 223   2              case GO_IRQ_STATE         : return TYPE_RESP_R5; break;
 224   2              case LOCK_UNLOCK          : return TYPE_RESP_R1; break;
 225   2              case APP_CMD              : return TYPE_RESP_R1; break;
 226   2              case GEN_CMD              : return TYPE_RESP_R1; break;
 227   2      
 228   2              // APP_CMDs
 229   2              case SEND_NUM_WR_BLOCKS   : return TYPE_RESP_R1; break;
 230   2              case SD_SEND_OP_COND      : return TYPE_RESP_R3; break;
 231   2              case SEND_SCR             : return TYPE_RESP_R1; break;
 232   2              default                   : return TYPE_RESP_NO; break;
 233   2          }
 234   1          // Following commands are with identical index and response type:
 235   1          //   1. SET_BUS_WIDTH        (ACMD6)    Response R1
 236   1          //      SWITCH               (CMD6)     Response R1
 237   1          //   2. SEND_SD_STATUS       (ACMD13)   Response R1
 238   1          //      SEND_STATUS          (CMD13)    Response R1
 239   1          //   3. SET_WR_BLK_ERASE_CNT (ACMD23)   Response R1
 240   1          //      SET_BLOCK_COUNT      (CMD23)    Response R1
C51 COMPILER V7.02b   SD                                                                   03/24/2008 15:52:29 PAGE 5   

 241   1          //   4. SET_CLR_CARD_DETECT  (ACMD42)   Response R1
 242   1          //      LOCK_UNLOCK          (CMD42)    Response R1
 243   1      }
 244          /*
 245          *********************************************************************************************************
 246          *                                    SdSendCmd()
 247          *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -