davylee 发表于 2011-10-10 19:45:24

谢谢LZ的分享

iom16v.h 发表于 2011-11-1 17:25:21

求SD卡 源代码哦。。。- - 谁有?

201130 发表于 2011-11-18 01:24:53

现在在学FAT32 ,谢谢分享

dlldz1 发表于 2011-11-18 10:33:26

这段时间正在学习AVR单片机使用SD卡存储txt文件的东西,好资料。
谢谢楼主。

dlldz1 发表于 2011-11-18 10:40:39

先下载,在观看
谢谢

jubin999 发表于 2011-11-18 15:39:08

谢谢 mark

akmp 发表于 2011-11-22 08:40:51

有用的资料。
谢谢!

schwxd 发表于 2011-11-22 10:45:55

多谢分享~~

kanpingya 发表于 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);
SD_spi_write(pcmd);
SD_spi_write(pcmd);
SD_spi_write(pcmd);
SD_spi_write(pcmd);
SD_spi_write(pcmd);

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=((addr&0xff000000)>>24); //将字节地址写入到CMD24字节序列中
pcmd=((addr&0x00ff0000)>>16);
pcmd=((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=((addr&0xFF000000)>>24);
pcmd=((addr&0x00FF0000)>>16);
pcmd=((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=SD_spi_read();
}

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

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

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

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

willianlong 发表于 2011-12-27 21:18:20

回复【楼主位】hn_ny_dxs 夏风
-----------------------------------------------------------------------

谢谢!

fantasticmask 发表于 2011-12-27 21:42:36

收下了哈,谢谢

sxdy99 发表于 2011-12-28 21:09:21

mark个

jianggp 发表于 2012-1-11 11:48:44

收下了哈,谢谢

BURABURA 发表于 2012-2-3 16:38:35

mark

gaobao_1 发表于 2012-8-20 11:43:59

谢谢分享!

yfgww 发表于 2012-9-5 10:45:44

收藏下来,慢慢看

zhuisuoji 发表于 2012-9-5 11:33:04

谢谢楼主的分享

chengying 发表于 2012-9-6 12:03:17

mark



doolheey 发表于 2012-9-6 12:34:03

好资料。收藏先,应该会用到的:)

ygr9017204 发表于 2012-9-29 14:57:01

学习了,谢谢!!!

海风 发表于 2012-10-7 10:44:05

谢谢啊不错的

jilz88 发表于 2012-10-7 11:32:33

看看{:smile:}

meirenai 发表于 2012-10-7 12:08:59

mark      

feng110 发表于 2012-10-21 20:24:15

学习了!{:smile:}

point110 发表于 2012-10-21 22:59:45

谢谢了    正需要呀!!!

kevin.lee 发表于 2012-10-21 23:14:48

太好了,终于有好的资料了

tt98 发表于 2012-10-24 14:50:12

来学习下,收藏了!

880705lpdhr 发表于 2012-11-1 14:13:18

MARK II                        

司马朝阳007 发表于 2012-11-3 15:23:21

好好      

kxb 发表于 2012-11-4 21:31:03

谢谢,收了

zq6220 发表于 2012-11-4 22:33:24

收下了!!!

qooop2010 发表于 2012-11-4 22:49:05

学习ing   谢谢分享

wangly209 发表于 2012-11-11 23:10:01

谢谢分享

czp123123 发表于 2012-11-12 11:48:03

收入囊中

chinaboy25 发表于 2012-11-12 12:29:24

相当的不错的

tobo 发表于 2012-11-15 09:24:21

相当不错的资料

xiaozi022121 发表于 2012-12-7 15:12:16

楼主辛苦了,正在研究这部分

ycwjl728 发表于 2012-12-7 15:53:09

下载来看一下~谢谢楼主

czp123123 发表于 2012-12-8 13:38:15

正好需要,谢谢

feiyuekuhai 发表于 2012-12-8 13:45:33

谢谢楼主         

nsj21n 发表于 2012-12-10 17:35:59

好东西,谢谢!

javabean 发表于 2012-12-10 18:51:49

收下先~看起来不错~

huanggong 发表于 2012-12-11 09:22:22

收藏,正准备用了。。

wadsny 发表于 2012-12-11 10:13:45

收藏一下

WLZXZPLOVE 发表于 2012-12-11 10:19:43

留下瞅瞅,还不错

dory_m 发表于 2012-12-11 10:23:08

学习,谢谢!!!{:smile:}

hwp 发表于 2013-1-16 09:57:52

{:2_33:}烟酒烟酒去。。。。

丅輩孑_变壊 发表于 2013-1-16 10:04:08

看看,,,,

nir4516 发表于 2013-1-16 10:12:59

备用留档!

wangjintao 发表于 2013-3-27 17:43:19

先收藏额v呃呃娃被

deeplly 发表于 2013-3-27 21:12:29

收藏了,谢谢

234918154 发表于 2013-4-24 00:22:13

SD卡的操作弄好久了,还没有弄出门路,谢谢楼主的无私奉献

wangjintao 发表于 2013-4-24 10:17:28

好东东 mark

依米 发表于 2013-4-26 07:40:39

学习了{:biggrin:}

IT农民工 发表于 2013-5-21 16:57:15

收藏,以后再看看

jacc2008 发表于 2013-5-23 14:20:27

感谢分享!

songjing1228 发表于 2013-5-28 15:25:46

谢谢 收藏了 学习中

drz2146 发表于 2013-6-24 21:59:51

非常好, 收藏

dongfo 发表于 2013-6-24 22:37:21

不错,留下看看

234918154 发表于 2013-6-25 22:10:19

SD操作,折腾了许久也没有解决。。

guowanling8061 发表于 2013-6-26 11:06:17

网上资料,早就有了!

sinc_mark 发表于 2013-6-27 13:09:22

下载先,谢谢!

llysc 发表于 2013-6-28 08:52:04

收藏,以后用的着~~~~~~~~~

cycle 发表于 2013-7-13 23:13:14

谢谢啊,先收藏啊,估计那天应该会用到!

Feco 发表于 2013-9-7 19:42:47

收藏,谢谢分享                     

phil 发表于 2013-9-7 21:35:53

在进行TF卡的操作,学习了。谢谢分享

大哈欠E 发表于 2013-9-8 14:30:34

学习了。。。

zzj2009a1 发表于 2013-9-9 11:28:20

不错,收了先{:smile:}

hmily241 发表于 2013-9-9 14:42:22


收下了,谢谢。

磊磊映画 发表于 2013-10-8 09:09:07

hn_ny_dxs 发表于 2008-4-19 23:05 static/image/common/back.gif
【6楼】 gwh1128




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

JESTER9 发表于 2013-10-8 12:57:33

不错,收藏

wsgj0 发表于 2013-10-13 19:04:10

谢谢,先看看

烂泥桑 发表于 2013-10-21 10:53:57

回复楼主 sd卡

wangchenwc 发表于 2013-10-31 16:11:36

好东西,正好看SD卡的内容,谢谢楼主

xiaoge 发表于 2013-10-31 17:12:59

不错,收藏

潇湘Boy 发表于 2013-11-4 09:17:34

先收藏了

hd7a27 发表于 2013-11-4 19:54:33

好东西,收藏了

jzhang123 发表于 2013-11-6 17:13:57

只有讲SPI模式的吗?

NewKing 发表于 2013-11-14 22:33:23

好资料,收下了,谢谢!!!

yuanbao502 发表于 2013-11-16 00:17:09

看看啊,这个可以收了慢慢研究

hubinghuandi 发表于 2013-11-20 14:18:05

好东西,正需要!

Eric321 发表于 2013-11-24 21:09:48

先收藏了

Arthur244 发表于 2013-11-24 21:23:26

一直在找sd卡的资料,,,,看看这个怎么样
页: 1 2 [3]
查看完整版本: 一个简明扼要的SD卡操作资料(中文)