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

📄 sd.lst

📁 SD卡-SDHC卡扇区读写测试
💻 LST
📖 第 1 页 / 共 2 页
字号:
 165           - 隶属模块:SD/SDHC模块
 166           - 函数属性:内部
 167           - 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
 168           - 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
 169           ******************************************************************/
 170          
 171          unsigned char SD_Write_Cmd(unsigned char *pcmd) 
 172          {
 173   1       unsigned char temp,time=0;
 174   1       
 175   1       //SD_LED=~SD_LED;
 176   1      
 177   1       SD_CS=1;
 178   1       SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持   
 179   1       SD_CS=0;
C51 COMPILER V8.05a   SD                                                                   11/03/2010 20:17:47 PAGE 4   

 180   1      
 181   1       SD_spi_write(pcmd[0]);
 182   1       SD_spi_write(pcmd[1]);
 183   1       SD_spi_write(pcmd[2]);
 184   1       SD_spi_write(pcmd[3]);
 185   1       SD_spi_write(pcmd[4]);
 186   1       SD_spi_write(pcmd[5]);
 187   1      
 188   1       do 
 189   1       {  
 190   2        temp = SD_spi_read();//一直读,直到读到的不是0xff或超时
 191   2        time++;
 192   2       }while((temp==0xff)&&(time<TRY_TIME)); 
 193   1      
 194   1       //SD_LED=~SD_LED;
 195   1       return(temp);
 196   1      }
 197          
 198          /******************************************************************
 199           - 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
 200           - 隶属模块:SD/SDHC模块
 201           - 函数属性:内部
 202           - 参数说明:无
 203           - 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sd.h中有定义)
 204           ******************************************************************/
 205          
 206          unsigned char SD_Reset()
 207          {
 208   1       unsigned char time,temp,i;
 209   1       unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95}; 
 210   1      
 211   1       is_init=1; //is_init置为1,让SPI速度慢下来
 212   1      
 213   1       SD_CS=1;
 214   1       for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
 215   1       {
 216   2        SD_spi_write(0xff); //120个时钟
 217   2       }
 218   1      
 219   1       SD_CS=0;
 220   1       time=0;
 221   1       do
 222   1       { 
 223   2        temp=SD_Write_Cmd(pcmd);//写入CMD0
 224   2        time++;
 225   2        if(time==TRY_TIME) 
 226   2        { 
 227   3         return(INIT_CMD0_ERROR);//CMD0写入失败
 228   3        }
 229   2       }while(temp!=0x01);
 230   1      
 231   1       SD_CS=1;
 232   1       SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟 
 233   1       return 0;//返回0,说明复位操作成功
 234   1      }
 235          
 236          /******************************************************************
 237           - 功能描述:检测SD卡版本,SD卡分为SD与SDHC,通过CMD8进行判断,SD与
 238                       SDHC的初始化以及寻址方法都不尽相同
 239           - 隶属模块:SD/SDHC模块
 240           - 函数属性:内部
 241           - 参数说明:无
C51 COMPILER V8.05a   SD                                                                   11/03/2010 20:17:47 PAGE 5   

 242           - 返回说明:SD卡的版本号,0x05为SD1.0 0x01为SD2.0
 243           ******************************************************************/
 244          
 245          unsigned char SD_Check_Version() 
 246          {
 247   1       unsigned char pcmd[]={0x48,0x00,0x00,0x01,0xaa,0x87}; //CMD8
 248   1       SD_CS=0;
 249   1       sd_ver=SD_Write_Cmd(pcmd);
 250   1       SD_CS=1; //关闭片选
 251   1       SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
 252   1       return sd_ver; //返回版本值
 253   1      }
 254          
 255          /******************************************************************
 256           - 功能描述:初始化SD卡,使用CMD1
 257           - 隶属模块:SD/SDHC模块
 258           - 函数属性:内部
 259           - 参数说明:无
 260           - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
 261           ******************************************************************/
 262          
 263          unsigned char SD_Init() 
 264          {  
 265   1       unsigned char time,temp;
 266   1       unsigned char pcmd[] = {0x41,0x40,0x00,0x00,0x00,0xff};//第2个字节为0x40  HCS置位,说明主机支持高容量卡
 267   1      
 268   1       SD_CS=0;
 269   1      
 270   1       time=0;
 271   1       do
 272   1       { 
 273   2        temp=SD_Write_Cmd(pcmd);
 274   2        time++;
 275   2        if(time==TRY_TIME) 
 276   2        { 
 277   3         return(INIT_CMD1_ERROR);//CMD1写入失败
 278   3        }
 279   2       }while(temp!=0);
 280   1                       
 281   1       is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度 
 282   1         
 283   1       SD_CS=1;  //关闭SD卡的片选 
 284   1      
 285   1       SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
 286   1      
 287   1       return(0); //返回0,说明初始化操作成功
 288   1      }
 289          
 290          /******************************************************************
 291           - 功能描述:获取SD卡的寻址方式
 292           - 隶属模块:SD/SDHC模块
 293           - 函数属性:内部
 294           - 参数说明:无
 295           - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
 296           ******************************************************************/
 297          
 298          unsigned char SD_Get_Addr_Mode() //获取SD卡的寻址方式,是字节寻址,还是块寻址
 299          {
 300   1       unsigned char pcmd[]={0x7a,0x00,0x00,0x00,0x00,0x00}; //CMD58  读取OCR的命令
 301   1       SD_CS=0;
 302   1       SD_Write_Cmd(pcmd); //写入CMD58
 303   1       addr_mode=SD_spi_read();SD_spi_read();SD_spi_read();SD_spi_read(); //后三次读取空读
C51 COMPILER V8.05a   SD                                                                   11/03/2010 20:17:47 PAGE 6   

 304   1       SD_CS=1;
 305   1       SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
 306   1       return addr_mode&0x40; //返回版本值 
 307   1      }
 308          
 309          /******************************************************************
 310           - 功能描述:让SD卡就绪,调用成功后,我们就可以对SD卡进行随心所欲的读写了
 311           - 隶属模块:SD/SDHC模块
 312           - 函数属性:内部
 313           - 参数说明:无
 314           - 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
 315           ******************************************************************/
 316          
 317          unsigned char SD_Ready_Go()
 318          {
 319   1       SD_Reset(); //复位SD卡,使其进入SPI接口模式
 320   1       SD_Check_Version(); //检查SD卡版本,是SD还是SDHC
 321   1       SD_Get_Addr_Mode();
 322   1       return SD_Init();       //初始化SD卡
 323   1      } 
 324          
 325          /****************************************************************************
 326           - 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中
 327           - 隶属模块:SD/SDHC模块
 328           - 函数属性:内部
 329           - 参数说明:addr:扇区地址
 330                       buffer:指向数据缓冲区的指针
 331           - 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义)
 332           - 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
 333           ****************************************************************************/
 334          
 335          unsigned char SD_Write_Sector(unsigned long addr,unsigned char *buffer) //向SD卡中的指定地址的扇区写入512

⌨️ 快捷键说明

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