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

📄 sd_spi.lst

📁 本源码是c8051f330使用spi口在spi模式下读写SD卡
💻 LST
📖 第 1 页 / 共 2 页
字号:
 279   2      
 280   2              
 281   2              }while((tmp == 0xff) && (i<SD_READREG_TIMEOUT));
 282   1      
 283   1              if(i >= SD_READREG_TIMEOUT)
 284   1              {
 285   2              
 286   2                      spi_cs_set();
 287   2                      return SD_ERR_TIMEOUT_READ;                                        //超时错误
 288   2      
 289   2              }
 290   1      
 291   1      
 292   1              for(i=0;i<len;i++)
 293   1              {
 294   2      //              recbuf[i] = spi_recbyte();
 295   2              tmp = spi_recbyte();
 296   2              }
 297   1                      
 298   1              tmp = spi_recbyte();
 299   1              tmp = spi_recbyte();
 300   1      
 301   1              spi_sendbyte(0xFF);                                                                      //返回前发送8个CLK
 302   1              spi_sendbyte(0xFF);
 303   1              spi_cs_set();
C51 COMPILER V7.50   SD_SPI                                                                06/04/2008 15:52:40 PAGE 6   

 304   1              sd_delay(20);
 305   1      
 306   1              return(SD_NO_ERR);
 307   1      
 308   1                      
 309   1      
 310   1      }
*** WARNING C280 IN LINE 267 OF SD_SPI.C: 'recbuf': unreferenced local variable
 311          
 312          
 313          
 314          uint8 sd_write(uint8 bmulti,uint32 len,char* sendbuf)           //写SD卡,len为长度,sendbuf为发送缓冲,
 315          {                                                                                                                       //bmulti为发送多块单块选择:1多块,0单块
 316   1      
 317   1              uint32 i = 0;
 318   1              uint8 tmp;
 319   1      
 320   1              spi_cs_clr();
 321   1      
 322   1      //      spi_sendbyte(0xff);                                                                       //先发送8个CLK
 323   1      
 324   1              if( bmulti == 1 )
 325   1                      spi_sendbyte(SD_TOK_WRITE_STARTBLOCK_M);                        //写多块开始令牌
 326   1              else                                                                                                    //写单块开始令牌
 327   1                      spi_sendbyte(SD_TOK_WRITE_STARTBLOCK);
 328   1      
 329   1              for(i=0;i<len;i++)
 330   1              {
 331   2              
 332   2      //              spi_sendbyte(sendbuf[i]);               
 333   2                      spi_sendbyte(0x55);
 334   2      
 335   2              }
 336   1              
 337   1              spi_sendbyte(0xFF);                                               //16位CRC
 338   1              spi_sendbyte(0xFF);
 339   1              
 340   1              do
 341   1              {
 342   2                      tmp = spi_recbyte();
 343   2              
 344   2      
 345   2              }while(tmp == 0xFF);
 346   1      
 347   1              do
 348   1              {
 349   2              tmp = spi_recbyte();     
 350   2               
 351   2               }while(tmp == 0);
 352   1              
 353   1              spi_cs_set();
 354   1              sd_delay(20);
 355   1      
 356   1              
 357   1              return SD_NO_ERR;
 358   1      
 359   1      }
*** WARNING C280 IN LINE 314 OF SD_SPI.C: 'sendbuf': unreferenced local variable
 360          
 361          
 362          void sd_sendmulti_stop(void)                                                            //发送停止数据传输令牌
 363          {
C51 COMPILER V7.50   SD_SPI                                                                06/04/2008 15:52:40 PAGE 7   

 364   1      
 365   1              spi_sendbyte(0xff);
 366   1              spi_sendbyte(SD_TOK_STOP_MULTI);                                           
 367   1              spi_recbyte();
 368   1      
 369   1              spi_cs_set();
 370   1      
 371   1      }
 372          
 373          uint8 sd_en_acmd()
 374          {
 375   1              uint8 param[4] = {0,0,0,0},resp,ret;
 376   1      
 377   1              ret = sd_send_cmd(CMD55,param,CMD55_R,&resp);
 378   1      
 379   1              spi_cs_set();   
 380   1      
 381   1              return ret;
 382   1      }
 383          
 384          uint8 sd_activates()
 385          {
 386   1              uint8 param[4] = {0,0,0,0},resp,ret;
 387   1      
 388   1              ret = sd_send_cmd(ACMD41,param,ACMD41_R,&resp);
 389   1      
 390   1              spi_cs_set();
 391   1              
 392   1              return ret;
 393   1      
 394   1      }
 395          
 396          uint8 sd_read_ocr()
 397          {
 398   1              uint8 param[4] = {0,0,0,0},resp,ret;
 399   1      
 400   1              ret = sd_send_cmd(CMD58,param,CMD58_R,&resp);
 401   1      
 402   1              spi_cs_set();
 403   1      
 404   1              return ret;
 405   1      
 406   1      }
 407          
 408          uint8 sd_readcard_status(uint8*buffer)                          //读card status寄存器
 409          {
 410   1              
 411   1              uint8 param[4] ={0,0,0,0};
 412   1              uint8 ret;
 413   1      
 414   1              ret = sd_send_cmd(CMD13,param,CMD13_R,buffer);
 415   1      
 416   1              sd_read(statuslen,recbuf);
 417   1      
 418   1              spi_cs_set();
 419   1      
 420   1              return ret;
 421   1      }
 422          
 423          uint8 sd_read_csd()
 424          {
 425   1          uint8 param[4] = {0,0,0,0},resp,ret;
C51 COMPILER V7.50   SD_SPI                                                                06/04/2008 15:52:40 PAGE 8   

 426   1        
 427   1          ret = sd_send_cmd(CMD9, param, CMD9_R, &resp);              /* 读CSD寄存器命令 command that read CSD register */
 428   1              
 429   1              sd_read(cidlen,&recbuf);
 430   1              
 431   1              spi_cs_set();
 432   1                                      
 433   1              return ret;    
 434   1      
 435   1      }
 436          
 437          
 438          uint8 sd_read_cid()
 439          {
 440   1          uint8 param[4] = {0,0,0,0},resp,ret;
 441   1       
 442   1          ret = sd_send_cmd(CMD10, param, CMD10_R, &resp);            /* 读CID寄存器命令 command that read CID register */
 443   1                                                      
 444   1              sd_read(cidlen,&recbuf);        
 445   1              
 446   1              spi_cs_set();
 447   1      
 448   1              return ret;      
 449   1      //      return (sd_read(cidlen, recbuf));
 450   1      }
 451          
 452          
 453          void sd_delay(uint8 value)                                                                       //延时函数
 454          {
 455   1              
 456   1      uint8 i,j;  
 457   1        for(i=0;i<value;i++)
 458   1          for(j=0;j<10;j++)
 459   1                {
 460   2      //         _NOP_();
 461   2            }
 462   1      
 463   1      
 464   1      }
 465          
 466          uint8 sd_reset(void)                                                                      //复位SD卡
 467          {
 468   1              uint8 param[4] = {0,0,0,0},resp,ret;
 469   1              
 470   1      
 471   1              ret = sd_send_cmd(CMD0,param,CMD0_R,&resp);
 472   1              
 473   1              spi_cs_set();
 474   1      
 475   1              return ret;
 476   1      }
 477          
 478          
 479          uint8 sd_check(void)                                                                                                             //发出CMD1,查询卡的状态
 480          {
 481   1              
 482   1              uint8 param[4] = {0,0,0,0},ret,resp;
 483   1                      
 484   1              ret = sd_send_cmd(CMD1,param,CMD1_R,&resp);
 485   1              
 486   1              spi_cs_set();
 487   1      
C51 COMPILER V7.50   SD_SPI                                                                06/04/2008 15:52:40 PAGE 9   

 488   1              return ret;
 489   1      
 490   1      }
 491          
 492          
 493          uint8 sd_init(void)                                                                                             //SD卡初始化进入SPI模式
 494          {
 495   1              uint8 tmp;      
 496   1              uint8 i = 0;
 497   1      
 498   1              spi_cs_set();
 499   1      
 500   1              for(i=0;i<13;i++)
 501   1              {
 502   2                      spi_sendbyte(0xFF);
 503   2              }
 504   1              spi_cs_clr();
 505   1                                                                                                                              
 506   1              sd_reset();                                                                                             //发送CMD0复位SD卡
 507   1              sd_delay(2);
 508   1              
 509   1              do
 510   1              {
 511   2                      sd_en_acmd();
 512   2                      tmp = sd_activates();
 513   2                      sd_delay(20);
 514   2                      i++;
 515   2                                                                              //激活初始化
 516   2              }while( (tmp!= 0)&&(i<SD_CMD_TIMEOUT));
 517   1              
 518   1              if(i>=SD_CMD_TIMEOUT)
 519   1                      i = 1;                  //超时
 520   1              else
 521   1                      i = 0;
 522   1      
 523   1              sd_check();                                                                                             //发送CMD1查询SD卡状态
 524   1              sd_delay(1);
 525   1      
 526   1      //      sd_crc(0);
 527   1      //      sd_delay(1);
 528   1      
 529   1              sd_set_blocklen(SD_BLOCKSIZE);                                  //设置BLOCK长度
 530   1              sd_delay(5);
 531   1      
 532   1              sd_clear_protect();
 533   1              sd_delay(5);
 534   1      
 535   1              sd_readcard_status(recbuf);                             //读card status寄存器
 536   1              sd_delay(10);
 537   1      
 538   1              sd_read_cid();
 539   1              sd_delay(10);
 540   1      
 541   1              sd_read_csd();
 542   1              sd_delay(10);
 543   1                      
 544   1              return SD_NO_ERR;
 545   1      }
 546          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.50   SD_SPI                                                                06/04/2008 15:52:40 PAGE 10  

   CODE SIZE        =   1630    ----
   CONSTANT SIZE    =     36    ----
   XDATA SIZE       =     24    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----     158
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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