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

📄 sd.lst

📁 FS7805 使用SD卡的demo
💻 LST
📖 第 1 页 / 共 3 页
字号:
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

⌨️ 快捷键说明

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