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

📄 sd.lst

📁 KZS1212-102Y_stc60s2双485单片机开发板
💻 LST
字号:
C51 COMPILER V8.05a   SD                                                                   06/15/2011 17:32:42 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN sd.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE sd.c BROWSE DEBUG OBJECTEXTEND TABS(5)

line level    source

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

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

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

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

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

⌨️ 快捷键说明

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