搜索
bottom↓
123
返回列表 发新帖
楼主: hn_ny_dxs

一个简明扼要的SD卡操作资料(中文)

  [复制链接]

出0入0汤圆

发表于 2011-10-10 19:45:24 | 显示全部楼层
谢谢LZ的分享

出0入0汤圆

发表于 2011-11-1 17:25:21 | 显示全部楼层
求SD卡 源代码哦。。。- - 谁有?

出0入0汤圆

发表于 2011-11-18 01:24:53 | 显示全部楼层
现在在学FAT32 ,谢谢分享

出0入0汤圆

发表于 2011-11-18 10:33:26 | 显示全部楼层
这段时间正在学习AVR单片机使用SD卡存储txt文件的东西,好资料。
谢谢楼主。

出0入0汤圆

发表于 2011-11-18 10:40:39 | 显示全部楼层
先下载,在观看
谢谢

出0入0汤圆

发表于 2011-11-18 15:39:08 | 显示全部楼层
谢谢 mark

出0入0汤圆

发表于 2011-11-22 08:40:51 | 显示全部楼层
有用的资料。
谢谢!

出0入0汤圆

发表于 2011-11-22 10:45:55 | 显示全部楼层
多谢分享~~

出0入0汤圆

发表于 2011-11-22 12:12:43 | 显示全部楼层
我家里也有相关程序

#include "sd.h"
#include "myfun.h" //公共函数头文件

/*******************************************************

        阚平制作-转载请注明出处
********************************************************/

//变量定义
//--------------------------------------------------------------
bit is_init;        //在初始化的时候设置此变量为1,同步数据传输(SPI)会放慢
//---------------------------------------------------------------

unsigned char bdata _dat;
sbit _dat7=_dat^7;
sbit _dat6=_dat^6;
sbit _dat5=_dat^5;
sbit _dat4=_dat^4;
sbit _dat3=_dat^3;
sbit _dat2=_dat^2;
sbit _dat1=_dat^1;
sbit _dat0=_dat^0;

/******************************************************************
- 功能描述:IO模拟SPI,发送一个字节
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:x是要发送的字节
- 返回说明:无返回
- 注:其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高
******************************************************************/

void SD_spi_write(unsigned char x)
{
_dat=x;

SD_SI=_dat7;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat6;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat5;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat4;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat3;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat2;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat1;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat0;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);  
SD_SCL=1;
if(is_init) delay(DELAY_TIME);
}

/******************************************************************
- 功能描述:IO模拟SPI,读取一个字节
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:无
- 返回说明:返回读到的字节        阚平制作-转载请注明出处
******************************************************************/

unsigned char SD_spi_read() //SPI读一个字节
{  
SD_SO=1;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat7=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat6=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat5=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat4=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat3=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat2=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat1=SD_SO;

SD_SCL=1;
if(is_init) delay(DELAY_TIME);
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
_dat0=SD_SO;

return (_dat);
}

/******************************************************************
- 功能描述:向SD卡写命令
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
- 返回说明:命令写入后,SD卡的回应值,调用不成功,将返回0xff
        阚平制作-转载请注明出处
******************************************************************/

unsigned char SD_Write_Cmd(unsigned char *pcmd) //向SD卡写命令,pcmd是命令字节序列的首地址
{
unsigned char temp,time=0;

SD_CS=1;
SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持   
SD_CS=0;

SD_spi_write(pcmd[0]);
SD_spi_write(pcmd[1]);
SD_spi_write(pcmd[2]);
SD_spi_write(pcmd[3]);
SD_spi_write(pcmd[4]);
SD_spi_write(pcmd[5]);

do
{  
  temp = SD_spi_read();//一直读,直到读到的不是0xff或超时
  time++;
}while((temp==0xff)&&(time<TRY_TIME));

return(temp);
}

/******************************************************************
- 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:无
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sd.h中有定义)
        阚平制作-转载请注明出处
******************************************************************/

unsigned char SD_Reset()//SD卡复位,进入SPI模式,使用CMD0(0号命令)
{
unsigned char time,temp,i;
unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};

is_init=1; //Set the init flag

SD_CS=1;
for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
{
  SD_spi_write(0xff); //120 clk
}

SD_CS=0;
time=0;
do
{
  temp=SD_Write_Cmd(pcmd);//写入CMD0
  time++;
  if(time==TRY_TIME)
  {
   return(INIT_CMD0_ERROR);//CMD0写入失败
  }
}while(temp!=0x01);

SD_CS=1;
SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
return 0;//返回0,说明复位操作成功
}

/******************************************************************
- 功能描述:初始化SD卡,使用CMD1
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:无
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
        阚平制作-转载请注明出处
******************************************************************/

unsigned char SD_Init()        //初始化,使用CMD1(1号命令)
{  
unsigned char time,temp;
unsigned char pcmd[] = {0x41,0x00,0x00,0x00,0x00,0xff};

SD_CS=0;

time=0;
do
{
  temp=SD_Write_Cmd(pcmd);
  time++;
  if(time==TRY_TIME)
  {
   return(INIT_CMD1_ERROR);//CMD1写入失败
  }
}while(temp!=0);
                    
is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度
   
SD_CS=1;  //关装SD卡的片选

SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟

return(0); //返回0,说明初始化操作成功
}

/****************************************************************************
- 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:addr:扇区地址
             buffer:指向数据缓冲区的指针
- 返回说明:调用成功,返回0x00,否则返回WRITE_BLOCK_ERROR (sd.h中有定义)
- 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
        阚平制作-转载请注明出处
****************************************************************************/

unsigned char SD_Write_Sector(unsigned long addr,unsigned char *Buffer)        //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令)
{  
unsigned char temp,time;
unsigned int i;
unsigned char pcmd[] = {0x58,0x00,0x00,0x00,0x00,0xff}; //向SD卡中单个块(512字节,一个扇区)写入数据,用CMD24

addr<<=9; //addr = addr * 512        将块地址(扇区地址)转为字节地址 [这里就限制了SD卡的最大容量为4G]
       
pcmd[1]=((addr&0xff000000)>>24); //将字节地址写入到CMD24字节序列中
pcmd[2]=((addr&0x00ff0000)>>16);
pcmd[3]=((addr&0x0000ff00)>>8);

SD_CS=0;//打开SD卡片选

time=0;
do
{  
  temp=SD_Write_Cmd(pcmd);
  time++;
  if(time==TRY_TIME)
  {
   return(temp); //命令写入失败
  }
}while(temp!=0);

for(i=0;i<100;i++) //这里要插入若干时钟信号
{
  SD_spi_read();
}
       
SD_spi_write(0xfe);//写入开始字节 0xfe,后面就是要写入的512个字节的数据       
       
for (i=0;i<512;i++) //将缓冲区中要写入的512个字节写入SD卡
{
  SD_spi_write(*Buffer++);
}
  
SD_spi_write(0xFF);
SD_spi_write(0xFF); //两个字节的CRC校验码,不用关心
   
   
temp=SD_spi_read();   //读取返回值
if((temp & 0x1F)!=0x05) //如果返回值是 XXX00DELAY_TIME1 说明数据已经被SD卡接受了
{
  SD_CS=1;
  return(WRITE_BLOCK_ERROR); //写块数据失败
}

while(SD_spi_read()!=0xff);//等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间)
                                                 //忙时,读回来的值为0x00,不忙时,为0xff

SD_CS=1; //关闭片选

SD_spi_write(0xFF);//按照SD卡的操作时序在这里补8个时钟
return(0);                 //返回0,说明写扇区操作成功
}

/****************************************************************************
- 功能描述:读取addr扇区的512个字节到buffer指向的数据缓冲区
- 隶属模块:SD卡模块
- 函数属性:内部
- 参数说明:addr:扇区地址
             buffer:指向数据缓冲区的指针
- 返回说明:调用成功,返回0x00,否则返回READ_BLOCK_ERROR (sd.h中有定义)
- 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率
        阚平制作-转载请注明出处
****************************************************************************/

unsigned char SD_Read_Sector(unsigned long addr,unsigned char *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
{
unsigned int j;
unsigned char time,temp;
unsigned char pcmd[]={0x51,0x00,0x00,0x00,0x00,0xFF}; //CMD17的字节序列
   
addr<<=9; //sector = sector * 512           将块地址(扇区地址)转为字节地址

pcmd[1]=((addr&0xFF000000)>>24);
pcmd[2]=((addr&0x00FF0000)>>16);
pcmd[3]=((addr&0x0000FF00)>>8);

SD_CS=0;//打开片选

time=0;
do
{  
  temp=SD_Write_Cmd(pcmd); //写入CMD17
  time++;
  if(time==TRY_TIME)
  {
   return(READ_BLOCK_ERROR); //读块失败
  }
}while(temp!=0);
                          
while (SD_spi_read() != 0xfe); //一直读,当读到0xfe时,说明后面的是512字节的数据了

for(j=0;j<512;j++)         //将数据写入到数据缓冲区中
{       
  buffer[j]=SD_spi_read();
}

SD_spi_read();
SD_spi_read();//读取两个字节的CRC校验码,不用关心它们

SD_CS=1;  //SD卡关闭片选

SD_spi_write(0xFF);//按照SD卡的操作时序在这里补8个时钟

return 0;
}
//------------------        阚平制作-转载请注明出处-----SD卡驱动--------------------------------

出0入0汤圆

发表于 2011-12-27 21:18:20 | 显示全部楼层
回复【楼主位】hn_ny_dxs 夏风
-----------------------------------------------------------------------

谢谢!

出0入0汤圆

发表于 2011-12-27 21:42:36 | 显示全部楼层
收下了哈,谢谢

出0入0汤圆

发表于 2011-12-28 21:09:21 | 显示全部楼层
mark个

出0入0汤圆

发表于 2012-1-11 11:48:44 | 显示全部楼层
收下了哈,谢谢

出0入0汤圆

发表于 2012-2-3 16:38:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-20 11:43:59 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2012-9-5 10:45:44 | 显示全部楼层
收藏下来,慢慢看

出0入0汤圆

发表于 2012-9-5 11:33:04 | 显示全部楼层
谢谢楼主的分享

出0入0汤圆

发表于 2012-9-6 12:03:17 | 显示全部楼层
mark



出0入0汤圆

发表于 2012-9-6 12:34:03 | 显示全部楼层
好资料。收藏先,应该会用到的:)

出0入0汤圆

发表于 2012-9-29 14:57:01 | 显示全部楼层
学习了,谢谢!!!

出0入0汤圆

发表于 2012-10-7 10:44:05 | 显示全部楼层
谢谢啊  不错的

出0入0汤圆

发表于 2012-10-7 11:32:33 | 显示全部楼层
看看

出0入0汤圆

发表于 2012-10-7 12:08:59 来自手机 | 显示全部楼层
mark      

出0入0汤圆

发表于 2012-10-21 20:24:15 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2012-10-21 22:59:45 | 显示全部楼层
谢谢了    正需要呀!!!

出0入0汤圆

发表于 2012-10-21 23:14:48 来自手机 | 显示全部楼层
太好了,终于有好的资料了

出0入0汤圆

发表于 2012-10-24 14:50:12 | 显示全部楼层
来学习下,收藏了!

出0入0汤圆

发表于 2012-11-1 14:13:18 | 显示全部楼层
MARK II                        

出0入0汤圆

发表于 2012-11-3 15:23:21 | 显示全部楼层
好好      

出0入0汤圆

发表于 2012-11-4 21:31:03 | 显示全部楼层
谢谢,收了

出0入0汤圆

发表于 2012-11-4 22:33:24 | 显示全部楼层
收下了!!!

出0入0汤圆

发表于 2012-11-4 22:49:05 | 显示全部楼层
学习ing   谢谢分享

出0入0汤圆

发表于 2012-11-11 23:10:01 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-11-12 11:48:03 | 显示全部楼层
收入囊中

出0入0汤圆

发表于 2012-11-12 12:29:24 | 显示全部楼层
相当的不错的

出0入0汤圆

发表于 2012-11-15 09:24:21 | 显示全部楼层
相当不错的资料

出0入0汤圆

发表于 2012-12-7 15:12:16 | 显示全部楼层
楼主辛苦了,正在研究这部分

出0入24汤圆

发表于 2012-12-7 15:53:09 | 显示全部楼层
下载来看一下~谢谢楼主

出0入0汤圆

发表于 2012-12-8 13:38:15 | 显示全部楼层
正好需要,谢谢

出0入0汤圆

发表于 2012-12-8 13:45:33 | 显示全部楼层
谢谢楼主           

出0入0汤圆

发表于 2012-12-10 17:35:59 | 显示全部楼层
好东西,谢谢!

出0入0汤圆

发表于 2012-12-10 18:51:49 | 显示全部楼层
收下先~看起来不错~

出0入0汤圆

发表于 2012-12-11 09:22:22 | 显示全部楼层
收藏,正准备用了。。

出0入0汤圆

发表于 2012-12-11 10:13:45 | 显示全部楼层
收藏一下

出0入0汤圆

发表于 2012-12-11 10:19:43 | 显示全部楼层
留下瞅瞅,还不错

出0入0汤圆

发表于 2012-12-11 10:23:08 | 显示全部楼层
学习,谢谢!!!

出0入0汤圆

发表于 2013-1-16 09:57:52 | 显示全部楼层
烟酒烟酒去。。。。

出0入0汤圆

发表于 2013-1-16 10:04:08 | 显示全部楼层
看看,,,,

出0入0汤圆

发表于 2013-1-16 10:12:59 | 显示全部楼层
备用留档!

出0入0汤圆

发表于 2013-3-27 17:43:19 | 显示全部楼层
先收藏额v呃呃娃被

出0入0汤圆

发表于 2013-3-27 21:12:29 | 显示全部楼层
收藏了,谢谢

出0入0汤圆

发表于 2013-4-24 00:22:13 | 显示全部楼层
SD卡的操作弄好久了,还没有弄出门路,谢谢楼主的无私奉献

出0入0汤圆

发表于 2013-4-24 10:17:28 | 显示全部楼层
好东东 mark

出0入0汤圆

发表于 2013-4-26 07:40:39 | 显示全部楼层
学习了

出0入0汤圆

发表于 2013-5-21 16:57:15 | 显示全部楼层
收藏,以后再看看

出0入0汤圆

发表于 2013-5-23 14:20:27 | 显示全部楼层
感谢分享!

出0入0汤圆

发表于 2013-5-28 15:25:46 | 显示全部楼层
谢谢 收藏了 学习中

出0入0汤圆

发表于 2013-6-24 21:59:51 | 显示全部楼层
非常好, 收藏

出0入0汤圆

发表于 2013-6-24 22:37:21 | 显示全部楼层
不错,留下看看

出0入0汤圆

发表于 2013-6-25 22:10:19 | 显示全部楼层
SD操作,折腾了许久也没有解决。。

出0入0汤圆

发表于 2013-6-26 11:06:17 | 显示全部楼层
网上资料,早就有了!

出0入0汤圆

发表于 2013-6-27 13:09:22 | 显示全部楼层
下载先,谢谢!

出0入17汤圆

发表于 2013-6-28 08:52:04 | 显示全部楼层
收藏,以后用的着~~~~~~~~~

出0入0汤圆

发表于 2013-7-13 23:13:14 | 显示全部楼层
谢谢啊,先收藏啊,估计那天应该会用到!

出0入8汤圆

发表于 2013-9-7 19:42:47 | 显示全部楼层
收藏,谢谢分享                     

出0入0汤圆

发表于 2013-9-7 21:35:53 | 显示全部楼层
在进行TF卡的操作,学习了。谢谢分享

出0入0汤圆

发表于 2013-9-8 14:30:34 | 显示全部楼层
学习了。。。

出0入95汤圆

发表于 2013-9-9 11:28:20 | 显示全部楼层
不错,收了先

出0入0汤圆

发表于 2013-9-9 14:42:22 | 显示全部楼层

收下了,谢谢。

出0入0汤圆

发表于 2013-10-8 09:09:07 | 显示全部楼层
hn_ny_dxs 发表于 2008-4-19 23:05
【6楼】 gwh1128  

赞,那是用什么软件开发的啊?IDE

出0入0汤圆

发表于 2013-10-8 12:57:33 | 显示全部楼层
不错,收藏

出0入0汤圆

发表于 2013-10-13 19:04:10 | 显示全部楼层
谢谢,先看看

出0入0汤圆

发表于 2013-10-21 10:53:57 | 显示全部楼层
回复楼主 sd卡

出0入0汤圆

发表于 2013-10-31 16:11:36 | 显示全部楼层
好东西,正好看SD卡的内容,谢谢楼主

出0入0汤圆

发表于 2013-10-31 17:12:59 | 显示全部楼层
不错,收藏

出0入0汤圆

发表于 2013-11-4 09:17:34 | 显示全部楼层
先收藏了

出0入0汤圆

发表于 2013-11-4 19:54:33 | 显示全部楼层
好东西,收藏了

出0入0汤圆

发表于 2013-11-6 17:13:57 | 显示全部楼层
只有讲SPI模式的吗?

出0入0汤圆

发表于 2013-11-14 22:33:23 | 显示全部楼层
好资料,收下了,谢谢!!!

出0入0汤圆

发表于 2013-11-16 00:17:09 | 显示全部楼层
看看啊,这个可以收了慢慢研究

出0入0汤圆

发表于 2013-11-20 14:18:05 | 显示全部楼层
好东西,正需要!

出0入0汤圆

发表于 2013-11-24 21:09:48 | 显示全部楼层
先收藏了

出0入0汤圆

发表于 2013-11-24 21:23:26 | 显示全部楼层
一直在找sd卡的资料,,,,看看这个怎么样
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 11:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表