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

📄 halsd.lst

📁 威望公司MP3 + USB MCU 的参考软件
💻 LST
📖 第 1 页 / 共 2 页
字号:

 240   2                      SPI_WRITE(0xFF);                        
 241   2                      UartOutText("-I-: CMD8 SD2.0 \r\n");
 242   2      
 243   2                      //halSDSPIACMD41(SD_CARD, 250);
 244   2                      halSDSPIACMD41(SDHC_CARD, 250);
 245   2                      
 246   2                      if(sdmmc == SDHC_CARD){
 247   3                              //Distinguish SDHC/SD
 248   3                              halSDSPICmdResp(CMD58_READ_OCR, 0x95); // Response R3
 249   3                              while(!(SPI_STA0&SPI_RRDY));                    
 250   3                              resp = SPI_DATA;
 251   3      
 252   3                              SPI_WRITE(0xFF);
 253   3                              SPI_WRITE(0xFF);
 254   3                              SPI_WRITE(0xFF);
 255   3                              SPI_WRITE(0xFF);        
 256   3      
 257   3                              if(0X00 == (resp&0x40)){
 258   4                                      sdmmc = SD_CARD;
 259   4                              }
 260   3                      }
 261   2              //}else if(SDMMC_RESPONSE_ILLEGAL== resp){
 262   2                      }else{
 263   2                      //SD1.0: CMD8 Not Supported     
 264   2                      UartOutText("-I-: CMD8 SD1.0 \r\n");
 265   2      
 266   2                      WDT = 0X1F;
 267   2                      while(SDMMC_RESPONSE_IDLE != halSDSPICmdResp(CMD0_GO_IDLE_STATE, 0x95));
 268   2                      //Distinguish SD/MMC Card
 269   2                      halSDSPIACMD41(SD_CARD, 250);//How many retry times?
 270   2      
 271   2              }
 272   1      //      else{
 273   1      //              UartOutText("-E-: CMD8 unknown response \r\n");
 274   1                      //while(1);
 275   1      //      }
 276   1      
 277   1              //It's MMC card, or no SD card is attached.
 278   1              rept = 0;
 279   1              if(sdmmc == UNKW_CARD){
 280   2                      //MMC card init should be added here!!!!
 281   2                      *((DWORD *)cmdarg) = 0;
 282   2      
 283   2                      WDT = 0X1F;
 284   2                      while(SDMMC_RESPONSE_IDLE != halSDSPICmdResp(CMD0_GO_IDLE_STATE, 0x95 ));       
 285   2      
 286   2                      WDT = 0X1F;
 287   2                      //while(SDMMC_RESPONSE_READY != halSDSPICmdResp(CMD1_SEND_OP_COND, cmdarg, 0x95));                      
 288   2                      while(1){
 289   3                              if(SDMMC_RESPONSE_READY == 
 290   3                                      halSDSPICmdResp(CMD1_SEND_OP_COND, 0x95)){
 291   4                                      sdmmc = MMC_CARD;
 292   4                                      UartOutText("MMC CMD1 done \r\n");
 293   4                                      break;
 294   4                              }
 295   3      
 296   3                              rept ++;
 297   3                              if(rept > 250){
 298   4                                      break;
 299   4                              }
 300   3                      }
 301   2              }
C51 COMPILER V8.01   HALSD                                                                 04/17/2008 09:46:24 PAGE 6   

 302   1      
 303   1              while(sdmmc == UNKW_CARD); //Killed by watchdog
 304   1              
 305   1              //Set block length
 306   1              *((DWORD *)cmdarg) = 512;
 307   1              while(SDMMC_RESPONSE_READY != halSDSPICmdResp(CMD16_SET_BLOCKLEN, 0xff));
 308   1              UartOutText("CMD16_SET_BLOCKLEN done \r\n");
 309   1      
 310   1              UartOutText("-I-: sd init done \r\n\r\n");
 311   1              WDT = 0X00; //Disable watchdog
 312   1      
 313   1      #ifdef SDENUM_RETRY_ENABLE      
                      Write_One_Byte(SDENUM_PAGE_ADDR<<E2PROM_PAGE_SIZEEXP,SD_ENUMDONE_FLAG); 
              #endif
 316   1      
 317   1              SysTicks = 0;
 318   1              while(SysTicks < 10);
 319   1              
 320   1              return TRUE;
 321   1      }
 322          
 323          BYTE halSDRead(BYTE* buffer, UDWORD lba)
 324          //######################################################
 325          {
 326   1              BYTE bRet;
 327   1              WORD j;
 328   1              UDWORD startadr;
 329   1      
 330   1      //      SPI_CTL1 = SPI_750K; // set high speed
 331   1              SPI_CTL1 = SD_SPI_CLK;  // set speed
 332   1      
 333   1              //calculate startadress of the sector
 334   1              //startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
 335   1              if(sdmmc == SDHC_CARD)
 336   1                      startadr=(lba);//lba: for high capacity cards, the memory address is in block(512B) address format
 337   1              else
 338   1                      startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
 339   1      
 340   1      //      halT1Reset();
 341   1              //UartOutText("-I-: CMD17_READ_SINGLE_BLOCK \r\n");
 342   1              //Command and response
 343   1              *((DWORD *)cmdarg) = startadr;
 344   1              //while(SDMMC_RESPONSE_READY != halSDSPICmdResp(CMD17_READ_SINGLE_BLOCK, 0xff));
 345   1              WDT = 0X1F;
 346   1              do{
 347   2                      bRet = halSDSPICmdResp(CMD17_READ_SINGLE_BLOCK, 0xff);
 348   2      #if 0
                              if (halSDCheck() == FALSE){ //SD Card is disattached
                                      WDT = 0X00;
                                      return FALSE;
                              }               
              #endif          
 354   2              }while(SDMMC_RESPONSE_READY != bRet);
 355   1              
 356   1              WDT = 0X1F;     
 357   1              //what's this??????????
 358   1              SDSS_ENABLE();
 359   1              //Error token should be checked here.??????
 360   1              do{
 361   2                      SPI_WRITE(0xFF);
 362   2              
 363   2              }while (SPI_DATA & 0x1); // waitting for Data Start Token and Consuming the NAC
C51 COMPILER V8.01   HALSD                                                                 04/17/2008 09:46:24 PAGE 7   

 364   1              //Data block
 365   1              for(j=0; j<BYTE_PER_SEC; j++){
 366   2                      SPI_WRITE(0xFF);         // shift out a byte into SPI_DATA
 367   2                      buffer[j]=SPI_DATA;  // store byte in buffer
 368   2              } //One more SPI_WRITE(0XFF) will be used to shift bus data into SPI_DATA, and at the same time write a C
             -RC byte
 369   1              //CRC16
 370   1              SPI_WRITE(0xFF);  // 16 bit crc follows data    
 371   1              SPI_WRITE(0xFF); //This is not CRC byte
 372   1      
 373   1              SDSS_DISABLE();
 374   1      
 375   1              //UartOutText("halSDReadSector() \r\n");
 376   1              WDT = 0X00;
 377   1              return TRUE;
 378   1      }
 379          
 380          #ifdef WRITE_ENABLE_FLAG
              BYTE halSDWriteSector(BYTE* buffer, UDWORD lba)
              //######################################################
              {
                      WORD i;
                      DWORD startadr;
              
                      if (halSDCheck() == FALSE){ //SD Card is disattached
                              return FALSE;
                      }
              
              //      SPI_CTL1 = SPI_750K; // set high speed
                      SPI_CTL1 = SD_SPI_CLK;  // set speed
              
                      if(sdmmc == SDHC_CARD)
                              startadr=(lba);//lba: for high capacity cards, the memory address is in block(512B) address format
                      else
                              startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
              
                      *((DWORD *)cmdarg) = startadr;
                      while(SDMMC_RESPONSE_READY != halSDSPICmdResp(SD_WRITE_BLOCK, 0xff));
              
                      SPI_WRITE(0xFE); // start block token
                      for(i=0; i<BYTE_PER_SEC; i++){
                        SPI_WRITE(*buffer++);
                      }
                      SPI_WRITE(0xFF); // 16 bit crc follows data
                      SPI_WRITE(0xFF);
              
                      WDT = 0X1F;
                      SPI_WRITE(0xFF); // read data response
                      SPI_WRITE(0xFF); //Now the data response will be in register SPI_DATA
                      //UartOutText("-I-: SPI_DATA 0x"); UartOutValue(SPI_DATA, 2);
                      if((SPI_DATA&0x1F) != 0x05){     // data block rejected
                              UartOutText("-E-: SD Write data Resp. Error 0x"); UartOutValue(SPI_DATA, 2);
                              //return 1;
                      }else{  // data block accepted
                              UartOutText("-I-: SD Write data Resp. OK 0x"); UartOutValue(SPI_DATA, 2);
                       }
              
                      do {
                              SPI_WRITE(0xFF);
                      }while(SPI_DATA == 0x00); //A zero value of R1b is busy, a non-zero value is ready      
                       //}while(SPI_DATA !=0xFF); // wait til busy is gone
              
C51 COMPILER V8.01   HALSD                                                                 04/17/2008 09:46:24 PAGE 8   

                      UartOutText("-I-: halSDWriteSector() \r\n");
                      WDT = 0X00;
              
                      return TRUE;
              }
              #endif
 431          
 432          //This function will send size sectors from lba to mp3 dec
 433          BYTE halSDReadMp3(DWORD lba)
 434          {
 435   1              DWORD startadr;
 436   1      
 437   1              SPI_CTL1 = SPI_3M; // set high speed
 438   1              if(sdmmc == SDHC_CARD)
 439   1                      startadr=(lba);//lba: for high capacity cards, the memory address is in block(512B) address format
 440   1              else
 441   1                      startadr=(lba) << 9;//lba * (UDWORD)BYTE_PER_SEC;
 442   1      
 443   1              SD_CMD = SD_READ_BLOCK;
 444   1              SD_DATA0 = ((BYTE *)(&startadr))[0];
 445   1              SD_DATA1 = ((BYTE *)(&startadr))[1];
 446   1              SD_DATA2 = ((BYTE *)(&startadr))[2];
 447   1              SD_DATA3 = ((BYTE *)(&startadr))[3];
 448   1              SD_CKSUM = 0xFF;
 449   1              SD_CTL0 = 0x83;                 // enable SD transfer
 450   1      
 451   1              WDT = 0X1F;
 452   1              while(1){
 453   2                      if(SD_STA1 & 0x2){
 454   3                              SD_STA1 = 0x2;
 455   3                              break;
 456   3                      }
 457   2      #if 0
                              if (halSDCheck() == FALSE){ //SD Card is disattached
                                      UartOutText("-W-: SD DisAttach! \r\n");
                                      return FALSE;
                              }
              #endif                  
 463   2              }
 464   1              //UartOutText("halSDReadMp3() done\r\n");
 465   1              //UartOutText("-A-");
 466   1      
 467   1              WDT = 0X00;
 468   1              return TRUE;
 469   1      }
 470          #endif
 471          
 472          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    776    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =      4      24
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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