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

📄 sd.lst

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -