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

📄 sdfilelib.lst

📁 在单片机keil编辑其中如何创建自己的函数库。方便以后自己调用
💻 LST
📖 第 1 页 / 共 2 页
字号:
 179   2        }
 180   1        while(SPI0DAT != 1);    //Response 01h,Successful!
 181   1      
 182   1        cmd[0]=0x41;
 183   1        cmd[5]=0xff;
 184   1        retry = 0;
 185   1        do
 186   1        {
 187   2          SD_CMD(cmd);      //Send CMD1
 188   2          if(retry++>20)          /* 超时返回 */
 189   2          return 1;
 190   2        }
 191   1        while(SPI0DAT!=0);    //Response 00h,Successful!
 192   1        CS = 1;
 193   1        return 0; 
 194   1      }
 195          //--------------------------------------------------- 
 196          //Name :SD_SPI_init
 197          //Fun  :sd卡初始化 
 198          //In   :none 
 199          //Out  :none
 200          //--------------------------------------------------- 
 201          void SD_SPI_init() 
 202          { 
 203   1        unsigned char t;
 204   1        for(t=0;t<50;t++)
 205   1        {if(SD_SPI_init_1()==0)break;/*file_num=SD_SPI_init_1();*/}
 206   1        //ERROR();
 207   1      }
 208          //--------------------------------------------
 209          //Name :SD_CMD 
 210          //Fun  :Send SD Card Command
 211          //In   :unsigned char *cmd 
 212          //Out  :none
 213          //---------------------------------------------------
 214          void SD_CMD(unsigned char *cmd)
 215          {
 216   1        unsigned char i;
 217   1        CS = 1;
 218   1      
 219   1        SPI0DAT = 0xff;   //发送8个时钟信号 
 220   1          while(!SPIF);
 221   1        SPIF = 0;
 222   1      
 223   1        CS = 0;
 224   1        for(i=0;i<6;i++)
 225   1        {
 226   2            SPI0DAT = *(cmd++);
 227   2          while(!SPIF);
 228   2            SPIF = 0;
 229   2        } 
 230   1        i = 0;
 231   1        do
 232   1        {
 233   2            SPI0DAT = 0xff;    /* Wait for Response */
 234   2          while(!SPIF);
 235   2            SPIF = 0;
 236   2          if(i++>20)         /* 超时返回 */
 237   2          return;
 238   2        }
 239   1        while(SPI0DAT == 0xff);
 240   1      }
C51 COMPILER V7.06   SDFILELIB                                                             01/10/2009 12:18:21 PAGE 5   

 241          //--------------------------------------------------- 
 242          //函数名:Read_SD_Sector 
 243          //功  能:读 一个扇区寄存器
 244          //参  数:sector 
 245          //返回值:
 246          //---------------------------------------------------
 247          void Read_SD_Sector(unsigned long sectors)
 248          {
 249   1        unsigned int n = 0;
 250   1        unsigned long sector;
 251   1             
 252   1        sector=sectors;
 253   1        //  unsigned char response;
 254   1        //地址变换   由逻辑块地址转为字节地址
 255   1         sector = sector << 9; // sector = sector * 512
 256   1         cmd[0] = 0x51;
 257   1         cmd[1] = ((sector & 0xFF000000) >>24 );
 258   1         cmd[2] = ((sector & 0x00FF0000) >>16 );
 259   1         cmd[3] = ((sector & 0x0000FF00) >>8 );
 260   1         do
 261   1        {
 262   2        SD_CMD(cmd);//发送CMD16
 263   2        n++;
 264   2        if(n == 100);
 265   2      //  READ_BLOCK_ERROR=0x55;
 266   2      //  return(READ_BLOCK_ERROR);//CMD16 错误!
 267   2        }
 268   1        while(SPI0DAT!=0);    //回应00h,停止写入
 269   1        n = 0;
 270   1        do
 271   1        {
 272   2            SPI0DAT = 0xff;    //* 等待回复 *
 273   2          while(!SPIF){}
 274   2            SPIF = 0;
 275   2          if(n++>200);
 276   2      //    READ_BLOCK_START_ERROR=0x55;        //* 超时返回 *
 277   2      //    return(READ_BLOCK_START_ERROR);
 278   2        }
 279   1        while(SPI0DAT != 0xfe);
 280   1        for (n=0;n<512;n++)
 281   1        {
 282   2        SPI0DAT = 0xff; 
 283   2          while(!SPIF){}
 284   2        SPIF = 0;
 285   2          FAT32_Buffer[n] = SPI0DAT;
 286   2        }
 287   1        SPI0DAT = 0xff;         
 288   1        while(!SPIF);
 289   1        SPIF = 0; 
 290   1        SPI0DAT = 0xff;         
 291   1        while(!SPIF);
 292   1        SPIF = 0;
 293   1        CS = 1;
 294   1      }
 295          //--------------------------------------------------- 
 296          //Name :Write_SD_Sector 
 297          //Fun  :Write one Sector on SD Card
 298          //In   :unsigned long sector 
 299          //Out  :none
 300          //---------------------------------------------------
 301          void Write_SD_Sector(unsigned long sector)
 302          {
C51 COMPILER V7.06   SDFILELIB                                                             01/10/2009 12:18:21 PAGE 6   

 303   1        unsigned int n = 0;
 304   1         
 305   1        //地址变换   由逻辑块地址转为字节地址
 306   1          sector = sector << 9; //sector = sector * 512
 307   1          cmd[0] = 0x58;
 308   1          cmd[1] = ((sector & 0xFF000000) >>24 );
 309   1          cmd[2] = ((sector & 0x00FF0000) >>16 );
 310   1          cmd[3] = ((sector & 0x0000FF00) >>8 );
 311   1          do
 312   1        {SD_CMD(cmd);}      //Send CMD24
 313   1        while(SPI0DAT!=0);    //Response 00h,Successful!
 314   1      
 315   1        SPI0DAT = 0xff;         
 316   1        while(!SPIF);
 317   1        SPIF = 0;
 318   1      
 319   1        SPI0DAT = 0xfe;         //Start Byte
 320   1        while(!SPIF);
 321   1        SPIF = 0;
 322   1      
 323   1        for (n=0;n<512;n++)    //512+2 Bytes CRC(Don't Care)
 324   1        {
 325   2          SPI0DAT =FAT32_Buffer[n]; 
 326   2          while(!SPIF);
 327   2          SPIF = 0;
 328   2          }
 329   1        SPI0DAT = 0xff;         
 330   1        while(!SPIF);
 331   1        SPIF = 0; 
 332   1        SPI0DAT = 0xff;         
 333   1        while(!SPIF);
 334   1        SPIF = 0;
 335   1        SPI0DAT = 0xff;         
 336   1        while(!SPIF);
 337   1        SPIF = 0;
 338   1        if((SPI0DAT & 0x1F)!=0x05) // xxx0 0101b
 339   1        CS=1;           //Failed!
 340   1          do
 341   1        {
 342   2        SPI0DAT = 0xff;         
 343   2        while(!SPIF);
 344   2        SPIF = 0;
 345   2        }
 346   1        while (SPI0DAT!=0xff);   //Busy
 347   1        CS=1;
 348   1        /*if((SPI0DAT & 0x1F)==0x05)
 349   1          CS=1;
 350   1        SPI0DAT = 0xff;         
 351   1        while(!SPIF);
 352   1        SPIF = 0; 
 353   1        SPI0DAT = 0xff;         
 354   1        while(!SPIF);
 355   1        SPIF = 0;*/
 356   1      }
 357          //---------------------------------------------------------------------------
 358          /*void FAT32_Init(struct FAT32_Init_Arg *Arg ) 
 359          {
 360             struct FAT32_BPB *bpb=(struct FAT32_BPB *)(FAT32_Buffer);                  //将数据缓冲区指针转为struct
             - FAT32_BPB 型指针
 361             se=0;
 362             Read_SD_Sector(se);
 363             Arg->Total_Sectors   =Little_To_Big((bpb->BPB_TotSec32)   ,4);     //?????                      //FAT32
C51 COMPILER V7.06   SDFILELIB                                                             01/10/2009 12:18:21 PAGE 7   

             -_Get_Total_Size()可以返回磁盘的总容量,单位是兆
 364             Arg->FATsectors      =Little_To_Big((bpb->BPB_FATSz32)    ,4);                     //装入FAT表占用的扇

⌨️ 快捷键说明

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