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

📄 sdcard.lst

📁 PDIUSB12+51做 U盘程序,可以将自己的系统单做U盘跟 电脑通信
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.10   SDCARD                                                                09/18/2007 10:28:29 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE SDCARD
OBJECT MODULE PLACED IN SDCard.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE SDCard.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //创建日期:2007/5/5
   2          //作者:龚志
   3          
   4          
   5          //
   6          #include "SDCard.h"
   7          
   8          //int1 HaveActSd = 0;
   9          
  10          void delay8ms()
  11          {
  12   1              unsigned char i,j;
  13   1              for(i=0;i<100;i++)
  14   1              for(j=0;j<30;j++)
  15   1              ;
  16   1      }
  17          
  18          
  19          //函数说明
  20          //参数
  21          //返回
  22          void Assert_SPI_CS(char value)
  23          {
  24   1              SD_CS = value?1:0;      
  25   1      }
  26          
  27          
  28          
  29          //函数说明     写一个字节到spi
  30          //参数         写数据
  31          //返回         成功返回NO_ERROR 失败返回超时
  32          char WriteToSPI(unsigned char databyte)
  33          { 
  34   1       unsigned char i;
  35   1       unsigned char temp;
  36   1       temp = databyte;
  37   1       for(i=0;i<8;i++)
  38   1       {
  39   2        SD_SCK = 0;                 //SCK为低的时候准备传输的数据,为高的时候发送数据
  40   2        if((temp & 0x80) != 0)  
  41   2              SD_MOSI = 1;
  42   2        else
  43   2          SD_MOSI = 0;
  44   2        temp = temp << 1;  
  45   2        SD_SCK = 1;
  46   2       }
  47   1       SD_MOSI = 1;
  48   1       return NO_ERROR;
  49   1        
  50   1      }
  51          
  52          //函数说明  从spi读一个数据
  53          //参数      接受数据的指针
  54          //返回       成功返回NO_ERROR 失败返回超时
  55          char RdFromSPI(unsigned char *pdatabyte)
C51 COMPILER V7.10   SDCARD                                                                09/18/2007 10:28:29 PAGE 2   

  56          {
  57   1       int i;
  58   1       bit bt;
  59   1       unsigned char temp = 0;
  60   1       for(i=0;i<8;i++)
  61   1       {
  62   2        SD_MISO = 1;              //上跳沿读数据
  63   2        SD_SCK = 0;
  64   2        SD_SCK = 1;
  65   2        temp = temp << 1;  
  66   2        bt = SD_MISO;
  67   2        if(bt == 1)  temp = temp | 0x1;
  68   2        else  temp = temp & 0xfe;
  69   2       }
  70   1       *pdatabyte = temp;
  71   1       return NO_ERROR;
  72   1      }
  73          
  74          
  75          
  76          void ConvertInt4ToChar4(unsigned long length,unsigned char *para)
  77          {
  78   1              *para   =       (unsigned char)length;
  79   1              *(para+1)       =       (unsigned char)(length>>8);     
  80   1              *(para+2)       =       (unsigned char)(length>>16);
  81   1              *(para+3)       =       (unsigned char)(length>>24);    
  82   1      }
  83          
  84          //函数说明   设置块长度
  85          //参数       块长度
  86          //返回       统一
  87          char SetBlockLen(unsigned int length)
  88          {
  89   1        char ret; 
  90   1        unsigned char para[4];
  91   1        unsigned char respond;
  92   1        SD_CS = 0     ;                            //  置CS低
  93   1         ConvertInt4ToChar4(length,para);          //把长度转化为四字节参数
  94   1        ret = SendCmd(16,para,R1,&respond);    //发送CMD16即设置块长度命令 
  95   1        if(ret != NO_ERROR)                                    //出错处理 
  96   1        {  
  97   2              SD_CS = 1;
  98   2          return ERROR;
  99   2        }
 100   1        if(respond != 0)   {SD_CS = 1;return ERROR;}   //命令响应不为0表示有错误
 101   1        SD_CS = 1;
 102   1        return NO_ERROR;
 103   1      }
 104          
 105          
 106          
 107          
 108          //函数说明 读数据块
 109          //参数
 110          //返回值正确返回NO_ERROR ,不正确返回ERROR
 111          char RDBlock(unsigned long addr, unsigned char *rbuf)
 112          {
 113   1        char ret;
 114   1        unsigned char  temp;
 115   1      
 116   1        int i;
 117   1        char respond, para[4];
C51 COMPILER V7.10   SDCARD                                                                09/18/2007 10:28:29 PAGE 3   

 118   1        Assert_SPI_CS(0); 
 119   1        ConvertInt4ToChar4(addr,para);                                        //参数转化
 120   1        ret = SendCmd(17,para,R1,&respond);                                   //发送读命令
 121   1        if(ret != NO_ERROR) {Assert_SPI_CS(1);return ERROR;} //出错处理
 122   1        if(respond != 0)  {Assert_SPI_CS(1);return ERROR;}    //响应错误 
 123   1        ret = RdFromSPI(&temp);                                                       //从spi读同步字节
 124   1        while(temp == 0xff)   //为FF表示SD忙
 125   1        {
 126   2          RdFromSPI(&temp);
 127   2        }
 128   1        if(temp != 0xfe)   //同步字节错误后就重启SD卡
 129   1        {
 130   2                delay8ms();
 131   2                Assert_SPI_CS(1);
 132   2      
 133   2                InitialSD();
 134   2                return ERROR;
 135   2        }
 136   1        for(i=0; i<=512-1; i++)          //读512字节数据,数据出来的顺序  注意数据的顺序(应该是先低位后高位)
 137   1        {
 138   2          RdFromSPI(&rbuf[i]);
 139   2        }
 140   1         RdFromSPI(&temp);                //读两字节的校验
 141   1         RdFromSPI(&temp);
 142   1              Assert_SPI_CS(1);
 143   1        return NO_ERROR;
 144   1      
 145   1      }
 146          
 147          
 148          
 149          
 150          
 151          
 152          
 153          
 154          
 155          
 156          
 157          
 158          
 159          
 160          //函数说明  写一512字节到sd卡
 161          //返回值    统一
 162          //参数说明  addr地址  wbuf数据指针
 163          char WriteBlock(unsigned long  addr, unsigned char *wbuf)    
 164          {
 165   1        char  temp;
 166   1        unsigned int  j=0 ;
 167   1        char ret;
 168   1        int i;
 169   1        char respond;
 170   1        unsigned char para[4];
 171   1        //print("addr:");
 172   1       // printhex(addr);
 173   1        //print("\r\n");
 174   1        delay8ms();
 175   1        Assert_SPI_CS(0);
 176   1        ConvertInt4ToChar4(addr,para);   //参数转化
 177   1        ret = SendCmd(24,para,R1,&respond);  //发送写命令   
 178   1        if(ret != NO_ERROR) {delay8ms();delay8ms();Assert_SPI_CS(1);InitialSD();return ERROR;}  //注意:这两个时
             -间延迟是需要的
C51 COMPILER V7.10   SDCARD                                                                09/18/2007 10:28:29 PAGE 4   

 179   1        if(respond != 0x0 ) {Assert_SPI_CS(1);InitialSD();return ERROR;}
 180   1      
 181   1        WriteToSPI(0xff);        //写8个高脉冲 
 182   1      
 183   1        WriteToSPI(0xfe);            //写同步字节
 184   1        
 185   1        for(i=0; i<512; i++)   //写512字节数据    注意写数据的顺序(应该是先低后高)
 186   1        {
 187   2          ret = WriteToSPI(wbuf[i]);
 188   2      
 189   2        }
 190   1        ret = WriteToSPI(0xff);                        
 191   1        ret = WriteToSPI(0xff);
 192   1        
 193   1        RdFromSPI(&temp);      //数据回应正确值为OX1F
 194   1                          
 195   1         
 196   1              if((temp & 0x1f) == 0xb) //后面都为错处处理
 197   1              {
 198   2                delay8ms();
 199   2                WriteToSPI(0xff);       
 200   2                Assert_SPI_CS(1);
 201   2                InitialSD();
 202   2                return ERROR;
 203   2              }
 204   1      
 205   1              else if((temp & 0x1f) == 0xd)
 206   1              {
 207   2                delay8ms();
 208   2                WriteToSPI(0xff);
 209   2                Assert_SPI_CS(1);
 210   2                InitialSD();
 211   2                return ERROR;
 212   2              }
 213   1      
 214   1              else if((temp & 0x1f) != 0x5)
 215   1              {
 216   2                 delay8ms(); 
 217   2                 WriteToSPI(0xff);
 218   2      
 219   2                 Assert_SPI_CS(1); 
 220   2                 InitialSD();
 221   2                 return ERROR;
 222   2              }

⌨️ 快捷键说明

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