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

📄 sd.lst

📁 SD卡调试所用的资料
💻 LST
字号:
C51 COMPILER V7.50   SD                                                                    05/18/2010 22:18:56 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN sd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sd.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "sd.h"
   2          #include "myfun.h" //公共函数头文件
   3          
   4          /*******************************************************
   5          
   6                  
   7          ********************************************************/
   8          
   9          //变量定义
  10          //--------------------------------------------------------------
  11          bit is_init;        //在初始化的时候设置此变量为1,同步数据传输(SPI)会放慢
  12          //---------------------------------------------------------------
  13          
  14          unsigned char bdata _dat;
  15          sbit _dat7=_dat^7;
  16          sbit _dat6=_dat^6;
  17          sbit _dat5=_dat^5;
  18          sbit _dat4=_dat^4;
  19          sbit _dat3=_dat^3;
  20          sbit _dat2=_dat^2;
  21          sbit _dat1=_dat^1;
  22          sbit _dat0=_dat^0;
  23          
  24          /******************************************************************
  25           - 功能描述:IO模拟SPI,发送一个字节
  26           - 隶属模块:SD卡模块
  27           - 函数属性:内部
  28           - 参数说明:x是要发送的字节
  29           - 返回说明:无返回
  30           - 注:其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高
  31           ******************************************************************/
  32          
  33          void SD_spi_write(unsigned char x) 
  34          {
  35   1       _dat=x;
  36   1       
  37   1       SD_SI=_dat7;
  38   1       SD_SCL=0; 
  39   1       if(is_init) delay(DELAY_TIME); 
  40   1       SD_SCL=1;
  41   1       if(is_init) delay(DELAY_TIME);
  42   1      
  43   1       SD_SI=_dat6;
  44   1       SD_SCL=0; 
  45   1       if(is_init) delay(DELAY_TIME); 
  46   1       SD_SCL=1;
  47   1       if(is_init) delay(DELAY_TIME);
  48   1      
  49   1       SD_SI=_dat5;
  50   1       SD_SCL=0;
  51   1       if(is_init) delay(DELAY_TIME);
  52   1       SD_SCL=1;
  53   1       if(is_init) delay(DELAY_TIME);
  54   1      
  55   1       SD_SI=_dat4;
C51 COMPILER V7.50   SD                                                                    05/18/2010 22:18:56 PAGE 2   

  56   1       SD_SCL=0;
  57   1       if(is_init) delay(DELAY_TIME); 
  58   1       SD_SCL=1;
  59   1       if(is_init) delay(DELAY_TIME);
  60   1      
  61   1       SD_SI=_dat3;
  62   1       SD_SCL=0; 
  63   1       if(is_init) delay(DELAY_TIME); 
  64   1       SD_SCL=1;
  65   1       if(is_init) delay(DELAY_TIME);
  66   1      
  67   1       SD_SI=_dat2;
  68   1       SD_SCL=0;
  69   1       if(is_init) delay(DELAY_TIME); 
  70   1       SD_SCL=1;
  71   1       if(is_init) delay(DELAY_TIME);
  72   1      
  73   1       SD_SI=_dat1;
  74   1       SD_SCL=0; 
  75   1       if(is_init) delay(DELAY_TIME); 
  76   1       SD_SCL=1;
  77   1       if(is_init) delay(DELAY_TIME);
  78   1      
  79   1       SD_SI=_dat0;
  80   1       SD_SCL=0;
  81   1       if(is_init) delay(DELAY_TIME);  
  82   1       SD_SCL=1;
  83   1       if(is_init) delay(DELAY_TIME);
  84   1      }
  85          
  86          /******************************************************************
  87           - 功能描述:IO模拟SPI,读取一个字节
  88           - 隶属模块:SD卡模块
  89           - 函数属性:内部
  90           - 参数说明:无
  91           - 返回说明:返回读到的字节
  92           ******************************************************************/
  93          
  94          unsigned char SD_spi_read() //SPI读一个字节
  95          {  
  96   1       SD_SO=1;
  97   1      
  98   1       SD_SCL=1;
  99   1       if(is_init) delay(DELAY_TIME);
 100   1       SD_SCL=0;
 101   1       if(is_init) delay(DELAY_TIME); 
 102   1       _dat7=SD_SO; 
 103   1      
 104   1       SD_SCL=1;
 105   1       if(is_init) delay(DELAY_TIME);
 106   1       SD_SCL=0;
 107   1       if(is_init) delay(DELAY_TIME);
 108   1       _dat6=SD_SO; 
 109   1      
 110   1       SD_SCL=1;
 111   1       if(is_init) delay(DELAY_TIME);
 112   1       SD_SCL=0;
 113   1       if(is_init) delay(DELAY_TIME);
 114   1       _dat5=SD_SO; 
 115   1      
 116   1       SD_SCL=1;
 117   1       if(is_init) delay(DELAY_TIME);
C51 COMPILER V7.50   SD                                                                    05/18/2010 22:18:56 PAGE 3   

 118   1       SD_SCL=0;
 119   1       if(is_init) delay(DELAY_TIME);
 120   1       _dat4=SD_SO; 
 121   1      
 122   1       SD_SCL=1;
 123   1       if(is_init) delay(DELAY_TIME);
 124   1       SD_SCL=0;
 125   1       if(is_init) delay(DELAY_TIME); 
 126   1       _dat3=SD_SO; 
 127   1      
 128   1       SD_SCL=1;
 129   1       if(is_init) delay(DELAY_TIME);
 130   1       SD_SCL=0;
 131   1       if(is_init) delay(DELAY_TIME);
 132   1       _dat2=SD_SO; 
 133   1      
 134   1       SD_SCL=1;
 135   1       if(is_init) delay(DELAY_TIME);
 136   1       SD_SCL=0;
 137   1       if(is_init) delay(DELAY_TIME);
 138   1       _dat1=SD_SO;
 139   1      
 140   1       SD_SCL=1;
 141   1       if(is_init) delay(DELAY_TIME);
 142   1       SD_SCL=0;
 143   1       if(is_init) delay(DELAY_TIME);
 144   1       _dat0=SD_SO; 
 145   1       
 146   1       return (_dat);
 147   1      }
 148          
 149          /******************************************************************
 150           - 功能描述:向SD卡写命令
 151           - 隶属模块:SD卡模块
 152           - 函数属性:内部
 153           - 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
 154           - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
 155           ******************************************************************/
 156          
 157          unsigned char SD_Write_Cmd(unsigned char *pcmd) //向SD卡写命令,pcmd是命令字节序列的首地址
 158          {
 159   1       unsigned char temp,time=0;
 160   1      
 161   1       SD_CS=1;
 162   1       SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持   
 163   1       SD_CS=0;
 164   1      
 165   1       SD_spi_write(pcmd[0]);
 166   1       SD_spi_write(pcmd[1]);
 167   1       SD_spi_write(pcmd[2]);
 168   1       SD_spi_write(pcmd[3]);
 169   1       SD_spi_write(pcmd[4]);
 170   1       SD_spi_write(pcmd[5]);
 171   1      
 172   1       do 
 173   1       {  
 174   2        temp = SD_spi_read();//一直读,直到读到的不是0xff或超时
 175   2        time++;
 176   2       }while((temp==0xff)&&(time<TRY_TIME)); 
 177   1      
 178   1       return(temp);
 179   1      }
C51 COMPILER V7.50   SD                                                                    05/18/2010 22:18:56 PAGE 4   

 180          
 181          /******************************************************************
 182           - 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
 183           - 隶属模块:SD卡模块
 184           - 函数属性:内部
 185           - 参数说明:无
 186           - 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sd.h中有定义)
 187           ******************************************************************/
 188          
 189          unsigned char SD_Reset()//SD卡复位,进入SPI模式,使用CMD0(0号命令)
 190          {
 191   1       unsigned char time,temp,i;
 192   1       unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95}; 
 193   1      
 194   1       is_init=1; //Set the init flag
 195   1      
 196   1       SD_CS=1;
 197   1       for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
 198   1       {
 199   2        SD_spi_write(0xff); //120 clk
 200   2       }
 201   1      
 202   1       SD_CS=0;
 203   1       time=0;
 204   1       do
 205   1       { 
 206   2        temp=SD_Write_Cmd(pcmd);//写入CMD0
 207   2        time++;
 208   2        if(time==TRY_TIME) 
 209   2        { 
 210   3         return(INIT_CMD0_ERROR);//CMD0写入失败
 211   3        }
 212   2       }while(temp!=0x01);
 213   1      
 214   1       SD_CS=1;
 215   1       SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟 
 216   1       return 0;//返回0,说明复位操作成功
 217   1      }
 218          
 219          /******************************************************************
 220           - 功能描述:初始化SD卡,使用CMD1
 221           - 隶属模块:SD卡模块
 222           - 函数属性:内部
 223           - 参数说明:无
 224           - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
 225           ******************************************************************/
 226          
 227          unsigned char SD_Init() //初始化,使用CMD1(1号命令)
 228          {  
 229   1       unsigned char time,temp;
 230   1       unsigned char pcmd[] = {0x41,0x00,0x00,0x00,0x00,0xff};
 231   1      
 232   1       SD_CS=0;
 233   1      
 234   1       time=0;
 235   1       do
 236   1       { 
 237   2        temp=SD_Write_Cmd(pcmd);
 238   2        time++;
 239   2        if(time==TRY_TIME) 
 240   2        { 
 241   3         return(INIT_CMD1_ERROR);//CMD1写入失败
C51 COMPILER V7.50   SD                                                                    05/18/2010 22:18:56 PAGE 5   

 242   3        }
 243   2       }while(temp!=0);
 244   1                       
 245   1       is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度 
 246   1         
 247   1       SD_CS=1;  //关装SD卡的片选 
 248   1      
 249   1       SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
 250   1      
 251   1       return(0); //返回0,说明初始化操作成功
 252   1      } 
 253          
 254          /****************************************************************************
 255           - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中
 256           - 隶属模块:SD卡模块
 257           - 函数属性:内部
 258           - 参数说明:addr:扇区地址
 259                       buffer:指向数据缓冲区的指针
 260           - 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义)
 261           - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
 262           ****************************************************************************/
 263          
 264          unsigned char SD_Write_Sector(unsigned long addr,unsigned char *Buffer) //向SD卡中的指定地址的扇区写入512

⌨️ 快捷键说明

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