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卡的资料,,,,看看这个怎么样