当前位置:文档之家› SD卡读写操作详细说明

SD卡读写操作详细说明

SD卡读写操作详细说明
SD卡读写操作详细说明

51单片机实现对SD卡的读写

SD卡SPI模式下与单片机的连接图:

22.

23.//获得16位的回应

24. Read_Byte_SD(); //read the first byte,ignore it.

25.do

26. { //读取后8位

27. tmp = Read_Byte_SD();

28. retry++;

29. }

30.while((tmp==0xff)&&(retry<100));

31.return(tmp);

32.}

2)初始化

SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。在初始化成功后,应尽量提高SPI的速率。在刚开始要先发送至少74个时钟信号,这是必须的。在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式

初始化时序图:

初始化例程:

1.//-------------------------------------------------------------------------

-

2.初始化SD卡到SPI模式

3.//-------------------------------------------------------------------------

-

4.unsigned char SD_Init()

5.{

6.unsigned char retry,temp;

7.unsigned char i;

8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};

9. SD_Port_Init(); //初始化驱动端口

10.

11. Init_Flag=1; //将初始化标志置1

12.

13.for (i=0;i<0x0f;i++)

14. {

15. Write_Byte_SD(0xff); //发送至少74个时钟信号

16. }

17.

18.//向SD卡发送CMD0

19. retry=0;

20.do

21. { //为了能够成功写入CMD0,在这里写200次

22. temp=Write_Command_SD(CMD);

23. retry++;

24.if(retry==200)

25. { //超过200次

26.return(INIT_CMD0_ERROR);//CMD0 Error!

27. }

28. }

29.while(temp!=1); //回应01h,停止写入

30.

31.//发送CMD1到SD卡

32. CMD[0] = 0x41; //CMD1

33. CMD[5] = 0xFF;

34. retry=0;

35.do

36. { //为了能成功写入CMD1,写100次

37. temp=Write_Command_SD(CMD);

38. retry++;

39.if(retry==100)

40. { //超过100次

41.return(INIT_CMD1_ERROR);//CMD1 Error!

4.unsigned char Read_CSD_SD(unsigned char *Buffer)

5.{

6.//读取CSD寄存器的命令

7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};

8.unsigned char temp;

9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes

10.return(temp);

11.}

4)读取SD卡信息

综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。如下:

1.//-------------------------------------------------------------------------

----------------------

2.//返回

3.// SD卡的容量,单位为M

4.// sector count and multiplier MB are in

5.u08 == C_SIZE / (2^(9-C_SIZE_MULT))

6.// SD卡的名称

7.//-------------------------------------------------------------------------

----------------------

8.void SD_get_volume_info()

9.{

10.unsigned char i;

11.unsigned char c_temp[5];

12. VOLUME_INFO_TYPE SD_volume_Info,*vinf;

13. vinf=&SD_volume_Info; //Init the pointoer;

14./读取CSD寄存器

15. Read_CSD_SD(sectorBuffer.dat);

16.//获取总扇区数

17. vinf->sector_count = sectorBuffer.dat[6] & 0x03;

18. vinf->sector_count <<= 8;

19. vinf->sector_count += sectorBuffer.dat[7];

20. vinf->sector_count <<= 2;

21. vinf->sector_count += (sectorBuffer.dat[8] & 0xc0) >> 6;

22.// 获取multiplier

23. vinf->sector_multiply = sectorBuffer.dat[9] & 0x03;

24. vinf->sector_multiply <<= 1;

25. vinf->sector_multiply += (sectorBuffer.dat[10] & 0x80) >> 7;

26.//获取SD卡的容量

27. vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply);

28.// get the name of the card

29. Read_CID_SD(sectorBuffer.dat);

30. vinf->name[0] = sectorBuffer.dat[3];

31. vinf->name[1] = sectorBuffer.dat[4];

32. vinf->name[2] = sectorBuffer.dat[5];

33. vinf->name[3] = sectorBuffer.dat[6];

34. vinf->name[4] = sectorBuffer.dat[7];

35. vinf->name[5] = 0x00; //end flag

36.}

37.以上程序将信息装载到一个结构体中,这个结构体的定义如下:

38.typedef struct SD_VOLUME_INFO

39.{ //SD/SD Card info

40.unsigned int size_MB;

41.unsigned char sector_multiply;

42.unsigned int sector_count;

43.unsigned char name[6];

44.} VOLUME_INFO_TYPE;

5)扇区读

扇区读是对SD卡驱动的目的之一。SD卡的每一个扇区中有512个字节,一次扇区读操作将把某一个扇区内的512个字节全部读出。过程很简单,先写入命令,在得到相应的回应后,开始数据读取。

扇区读的时序:

扇区读的程序例程:

1.unsigned char SD_Read_Sector(unsigned long sector,unsigned char *buffer)

2.{

3.unsigned char retry;

4.//命令16

5.unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF};

6.unsigned char temp;

7.

8.//地址变换由逻辑块地址转为字节地址

9. sector = sector << 9; //sector = sector * 512

10.

11. CMD[1] = ((sector & 0xFF000000) >>24 );

12. CMD[2] = ((sector & 0x00FF0000) >>16 );

13. CMD[3] = ((sector & 0x0000FF00) >>8 );

14.

15.//将命令16写入SD卡

16. retry=0;

17.do

18. { //为了保证写入命令一共写100次

19. temp=Write_Command_MMC(CMD);

20. retry++;

21.if(retry==100)

22. {

23.return(READ_BLOCK_ERROR); //block write Error!

24. }

25. }

26.while(temp!=0);

27.

28.//Read Start Byte form MMC/SD-Card (FEh/Start Byte)

29.//Now data is ready,you can read it out.

30.while (Read_Byte_MMC() != 0xfe);

31. readPos=0;

32. SD_get_data(512,buffer) ; //512字节被读出到buffer中

33.return 0;

34.}

35.其中SD_get_data函数如下:

36.//-------------------------------------------------------------------------

---

37.获取数据到buffer中

38.//-------------------------------------------------------------------------

---

39.void SD_get_data(unsigned int Bytes,unsigned char *buffer)

40.{

41.unsigned int j;

42.for (j=0;j

43. *buffer++ = Read_Byte_SD();

44.}

45.

6)扇区写

扇区写是SD卡驱动的另一目的。每次扇区写操作将向SD卡的某个扇区中写入512个字节。过程与扇区读相似,只是数据的方向相反与写入命令不同而已。

扇区写的时序:

扇区写的程序例程:

1.//-------------------------------------------------------------------------

-------------------

2.写512个字节到SD卡的某一个扇区中去返回0说明写入成功

3.//-------------------------------------------------------------------------

-------------------

4.unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)

5.{

6.unsigned char tmp,retry;

7.unsigned int i;

8.//命令24

9.unsigned char CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF};

10. addr = addr << 9; //addr = addr * 512

11.

12. CMD[1] = ((addr & 0xFF000000) >>24 );

13. CMD[2] = ((addr & 0x00FF0000) >>16 );

14. CMD[3] = ((addr & 0x0000FF00) >>8 );

15.

16.//写命令24到SD卡中去

17. retry=0;

18.do

19. { //为了可靠写入,写100次

20. tmp=Write_Command_SD(CMD);

21. retry++;

22.if(retry==100)

23. {

24.return(tmp); //send commamd Error!

25. }

26. }

27.while(tmp!=0);

28.

29.

30.//在写之前先产生100个时钟信号

31.for (i=0;i<100;i++)

32. {

33. Read_Byte_SD();

34. }

35.

36.//写入开始字节

37. Write_Byte_MMC(0xFE);

38.

39.//现在可以写入512个字节

40.for (i=0;i<512;i++)

41. {

42. Write_Byte_MMC(*Buffer++);

43. }

44.

45.//CRC-Byte

46. Write_Byte_MMC(0xFF); //Dummy CRC

47. Write_Byte_MMC(0xFF); //CRC Code

48.

49.

50. tmp=Read_Byte_MMC(); // read response

51.if((tmp & 0x1F)!=0x05) // 写入的512个字节是未被接受

52. {

53. SPI_CS=1;

54.return(WRITE_BLOCK_ERROR); //Error!

55. }

56.//等到SD卡不忙为止

57.//因为数据被接受后,SD卡在向储存阵列中编程数据

58.while (Read_Byte_MMC()!=0xff){};

59.

60.//禁止SD卡

61. SPI_CS=1;

62.return(0);//写入成功

63.}

64.

此上内容在笔者的实验中都已调试通过。单片机采用STC89LE单片机(SD卡的初始化

演讲稿

尊敬的老师们,同学们下午好:

我是来自10级经济学(2)班的学习委,我叫张盼盼,很荣幸有这次机会和大家一起交流担任学习委员这一职务的经验。

转眼间大学生活已经过了一年多,在这一年多的时间里,我一直担任着学习委员这一职务。回望这一年多,自己走过的路,留下的或深或浅的足迹,不仅充满了欢愉,也充满了淡淡的苦涩。一年多的工作,让我学到了很多很多,下面将自己的工作经验和大家一起分享。

学习委员是班上的一个重要职位,在我当初当上它的时候,我就在想一定不要辜负老师及同学们我的信任和支持,一定要把工作做好。要认真负责,态度踏实,要有一定的组织,领导,执行能力,并且做事情要公平,公正,公开,积极落实学校学院的具体工作。作为一名合格的学习委员,要收集学生对老师的意见和老师的教学动态。在很多情况下,老师无法和那么多学生直接打交道,很多老师也无暇顾及那么多的学生,特别是大家刚进入大学,很多人一时还不适应老师的教学模式。学习委员是老师与学生之间沟通的一个桥梁,学习委员要及时地向老师提出同学们的建议和疑问,熟悉老师对学生的基本要求。再次,学习委员在学习上要做好模范带头作用,要有优异的成绩,当同学们向我提出问题时,基本上给同学一个正确的回复。

总之,在一学年的工作之中,我懂得如何落实各项工作,如何和班委有效地分工合作,如何和同学沟通交流并且提高大家的学习积极性。当然,我的工作还存在着很多不足之处。比日:有的时候得不到同学们的响应,同学们不积极主动支持我的工作;在收集同学们对自己工作意见方面做得不够,有些事情做错了,没有周围同学的提醒,自己也没有发觉等等。最严重的一次是,我没有把英语四六级报名的时间,地点通知到位,导致我们班有4名同学错过报名的时间。这次事使我懂得了做事要脚踏实地,不能马虎。

在这次的交流会中,我希望大家可以从中吸取一些好的经验,带动本班级的学习风气,同时也相信大家在大学毕业后找到好的工作。谢谢大家!

SD卡的使用经验总结

由于自己也在使用SD卡,使用的过程中也遇到了一些问题,通过各方的总结,现将其整理一下,调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。 3. 理论上要求发送CMD58获得SD卡电压参数,但实际过程中由于事先都知道了SD 卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要用这个命令。 4. SD卡读写超时时间要按照协议说明书书上的给定值(读超时:100ms;写超时:250ms),这个值要在程序中准确计算出来,否则将会出现不能正常读写数据的问题。我自己定义了一个计算公式:超时时间=(8/clk)*arg。 5. 2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节,对其进行字节操作将会出错。 6. 对某一块要进行写操作时最好先执行擦出命令,这样写入的速度就能大大提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。 7. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。 8. 在写数据块前要先写入若干个dummy data字节,写完一个块数据时,主机要监测MISO数据线,如果从机处于忙状态这根数据线会保持低电平,这样主机就可以根据这根数据线的状态以决定是否发送下一个命令,在从机没有释放MISO数据线之前,主机绝对不能执行其他命令,否则将会导致写入的数据出错,而且从机也不会响应主机的命令。 9. 在SPI模式下,CRC校验是被忽略的,但依然要求主从机发送CRC码,只是数值可以是任意值,一般主机的CRC码通常设为0x00或0xFF。 读多块操作和写多块操作的传输停止形式不一样,读多块操作时用用命令CMD12终止传输,而写多块操作时用Stop Tran Token(停止传输令牌,值为0xFD)终止传输。

单片机读写SD卡API模式读写

单片机读写SD卡最简单最基本的程序 处理器:s3c44b0 (arm7) SD卡与处理器的引脚连接:MISO -->SIORxD MOSI -->SIOTxD CLK -->SCLK CS -->PE5 四个文件::用户API函数,移植时不需修改 :中间层函数,移植时不需修改 :硬件层函数,移植时需修改 :一些功能的宏定义,移植时需修改 第一次读写SD卡时,需调用SD_Init(void),然后就可以条用Read_Single_Block或者Write_Single_Block进行读写操作 注意:进行写操作时,最好不要写前700个扇区,应为这些扇区都是FAT文件系统的重要扇区,一旦误写则可能会导致SD无法被电脑识别,需格式化。 /******************************************************* 文件名: 作用:用户API函数,包括四个函数, 读取一块扇区(512字节)U8 Read_Single_Block(U32 blk_addr, U8 *rx_buf) 写一个扇区(512字节)U8 Write_Single_Block(U32 blk_addr, U8 *tx_buf) 获取SD卡基本信息,即读CSD寄存器信息(16字节):void SD_info() SD卡初始化:U8 SD_Init(void) ********************************************************/

/******************************************** 功能:读取一个block 输入:blk_addr为第几个block,rx_buf为数据缓存区首地址输出:返回NO_ERR则成功,其它则读取失败 ********************************************/ U8 Read_Single_Block(U32 blk_addr, U8 *rx_buf) { U16 rsp = 1; U8 i = 0; SD_sel(); //使能SD卡 while(rsp && (i < 100)) { write_cmd(CMD17, blk_addr << 9); //写命令CMD17 rsp = Get_rsp(R1); //获取答应 send_clk(); } if(i > 99) //如果命令超时,则执行超时处理 {

SD卡-中文学习笔记

SD卡操作 一、概述 1、简介 SD卡是基于flash的存储卡。 SD卡和MMC卡的区别在于初始化过程不同。 SD卡的通信协议包括SD和SPI两类。 SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。

2、功能介绍 2.1 特点 1)主机无关的FLASH内存擦除和编程 读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。当采用新型的FLASH时,主机代码无需更新。 2)缺陷管理 3)错误恢复 4)电源管理 Flash每个扇区有大约10万次的写寿命,读没有限制。 擦除操作可以加速写操作,因为在写之前会进行擦除。 3 SD总线模式 3.1 Negotiating Operation Conditions 当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。要退出非活动状态唯一的方法就是重新上电。 3.2 SD卡获取和识别 SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。 主机通过READ_CID命令读取CID寄存器。CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。 DAT3线上内置的上拉电阻用来侦测卡。在数据传输时电阻断开(使用ACMD42)。

3.3 卡状态 卡状态分别存放在下面两个区域: 卡状态(Card Status),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。 SD状态(SD_Status),当主机使用SD_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。 3.4 内存组织 数据读写的基本单元是一个字节,可以按要求组织成不同的块。

STM32读写SD卡要点

3.20SD卡实验 很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有U盘,FLASH芯片,SD卡等。他们各有优点,综合比较,最适合单片机系统的莫过于SD卡了,它不仅容量可以做到很大(32Gb以上),而且支持SPI接口,方便移动,有几种体积的尺寸可供选择(标准的SD 卡尺寸,以及TF卡尺寸),能满足不同应用的要求。只需要4个IO口,就可以外扩一个最大达32GB以上的外部存储器,容量选择尺度很大,更换也很方便,而且方便移动,编程也比较简单,是单片机大容量外部存储器的首选。 ALIENTKE MiniSTM3开发板就带有SD卡接口,利用STM32自带的SPI接口,最大通信速度可达18Mbps,每秒可传输数据2M字节以上,对于一般应用足够了。本节将向大家介绍,如何在ALIENTEK MiniSTM32开发板上读取SD卡。本节分为如下几个部分: 3.20.1 SD卡简介 3.20.2 硬件设计 3.20.3 软件设计 3.20.4 下载与测试

3.20.1 SD卡简介 SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。 SD卡一般支持2种操作模式: 1,SD卡模式; 2,SPI模式; 主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。 SD卡的引脚排序如下图所示: 图3.20.1.1 SD卡引脚排序图 SD卡引脚功能描述如下表所示: 表3.20.1.1 SD卡引脚功能表 SD卡只能使用3.3V的IO电平,所以,MCU一定要能够支持3.3V的IO端口输出。 注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10~100K左右的上拉电阻。 SD卡要进入SPI模式很简单,就是在SD卡收到复位命令(CMD0)时,CS为有效电平(低电平)则SPI模式被启用。不过在发送CMD0之前,要发送>74个时钟,这是因为SD卡内部有个供电电压上升时间,大概为64个CLK,剩下的10个CLK用于SD卡同步,之后才能开始CMD0的操作,在卡初始化的时候,CLK时钟最大不能超过400Khz!。 ALENTEK MiniSTM32开发板使用的是SPI模式来读写SD卡,下面我们就重点介绍一下SD卡在SPI模式下的相关操作。 首先介绍SPI模式下几个重要的操作命令,如下表所示:

SD卡读写包括两种模式

SD卡读写包括两种模式:SD模式和SPI模式。其中SD模式又可以分为1bit 和4bit两种传输模式。SD卡缺省使用专有的SD模式。SD卡规范中主要讲了一些命令,响应和CRC效验等等,整个规范的内容还是很多的。 SD卡上电后,卡处于空闲状态,主机发送CMD0复位SD卡,然后通过CMD55和ACMD41判断当前电压是否在卡的工作范围内。在得到了正确的响应后,主机可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据块长度,通过CMD9读取卡的CSD寄存器。从CSD寄存器中,主机可以获知卡容量,支持的命令集等重要参数。此时,卡以进入了传输状态,主机就可以通过CMD17/18和CMD24/25对卡进行读写。CRC校验是为了防止SD卡的命令,应答,数据传输出现错误。每个命令和应答信号都会产生CRC效验码,每个数据块的传输也会长生CRC效验码。 这段程序是友善之臂推出的mini2440开发板中带的ADS测试源码。整个阅读代码的过程是对这S3C2440的芯片手册和SD卡规范来看的,对于MMC卡没有给出注释,其实和SD卡是大同小异。由于是初次接触ARM,对SD规范的认识也不是很深入,再加上自己水平有限,还不能完全读懂源代码,其中的肯定存在一些错误,欢迎大家一起交流讨论。

#define INT 1 #define DMA 2 int CMD13(void);// Send card status int CMD9(void); unsigned int*Tx_buffer;//128[word]*16[blk]=8192[byte] unsigned int*Rx_buffer;//128[word]*16[blk]=8192[byte] volatile unsigned int rd_cnt;//读数据计数器 volatile unsigned int wt_cnt;//写数据计数器 volatile unsigned int block;//读写块总数 volatile unsigned int TR_end=0; int Wide=0;// 0:1bit, 1:4bit int MMC=0;// 0:SD , 1:MMC int Maker_ID; char Product_Name[7]; int Serial_Num; volatile int RCA; void Test_SDI(void) { U32 save_rGPEUP, save_rGPECON; RCA=0;

sd卡电路图学习

,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI 控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下: 每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

SD卡初始化及读写流程

SD卡初始化及读写流程 默认分类2010-03-03 21:03:00 阅读264 评论0 字号:大中小 SD卡调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程 序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8, 返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也会出现SD卡无法正常工作的问题。 3. 理论上要求发送CMD58获得SD卡电压参数,但实际过程中 由于事先都知道了SD卡的工作电压,因此可省略这一步简化程序。协议书上也建议尽量不要用这个命令。 4. SD卡读写超时时间要按照协议说明书书上的给定值(读超时: 100ms;写超时:250ms),这个值要在程序中准确计算出来,否

则将会出现不能正常读写数据的问题。我自己定义了一个计算公 式:超时时间=(8/clk)*arg。 5. 2GB以内的SD卡(标准卡)和2GB以上的SD卡(大容量卡)在 地址访问形式上不同,这一点尤其要注意,否则将会出现无法读写数据的问题。如标准卡在读写操作时,对读或写命令令牌当中的地址域符初值0x10,表示对第16个字节以后的地址单元进行操作(前提是此SD卡支持偏移读写操作),而对大容量卡读或写命令令牌当中的地址域符初值0x10时,则表示对第16块进行读写操作,而且大容量卡只支持块读写操作,块大小固定为512字节, 对其进行字节操作将会出错。 6. 对某一块要进行写操作时最好先执行擦出命令,这样写入的速 度就能大大提高。进行擦除操作时不管是标准卡还是大容量卡都按块操作执行,也就是一次擦除至少512字节。 7. 对标准卡进行字节操作时,起始和终止必须在一个物理扇区 内,否则将不能进行读写操作。实际操作过程中建议用块操作以提高效率。不管是标准卡还是大容量卡一个读写命令只能对一个块进行操作,不允许跨物理层地址操作。

SD卡读写操作 SD卡电路

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述:

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI 方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下: 每一个命令都有自己命令应答格式。在SPI模式中定义了三种应答格式,如下表所示:

sd卡读写程序(SDcardreadandwriteprogram)

sd 卡读写程序( SD card read and write program ) SD card read and write program Objective: To study the SD card / / operation Design / software 1, using SPI communication / / SD card 2, go to SD / / in order to 0-255 a total of 256 data, and then read back LCD1602 display / / hardware requirements: S11 ON / / dial switch Jumper J18 / / all connected #include //dsPIC30F6014 standard header file _FOSC( CSW_FSCM_O&F FX T_PLL4); //4 doubler crystal oscillator, Failsafe clock closed _FWDT (WDT_OFF); / / close the watchdog timer _FBORPO(RP BOR_OFF& MCLR_EN);/ / reset prohibited MCLRr eset enable. _FGS (CODE_PROT_OFF); / / code protection against #define CS PORTGbits.RG9 / / SD card selection pin definition #define RSL https://www.doczj.com/doc/075633410.html,TB4 / / definition LCDc ontrol bits (note here can only register with LATB, you cannot directly use the

SD卡引脚及spi模式基本操作过程

SD卡引脚及spi模式基本操作过程 (摘自网络) 对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 SD卡的引脚定义 SD卡引脚功能详述: 引脚编号 SD模式SPI模式 名称类型描述名称类型描述 1 CD/DAT3 IO或PP 卡检测/ 数据线3 #CS I 片选 2 CMD PP 命令/ 回应 DI I 数据输入 3 VSS1 S 电源地VSS S 电源地 4 VDD S 电源VDD S 电源 5 CLK I 时钟SCLK I 时钟 6 VSS2 S 电源地VSS2 S 电源地 7 DAT0 IO或PP 数据线0 DO O或PP 数据输出 8 DAT1 IO或PP 数据线1 RSV 9 DAT2 IO或PP 数据线2 RSV 注:S:电源供给I:输入O:采用推拉驱动的输出 PP:采用推拉驱动的输入输出 SD卡SPI模式下与单片机的连接图:

SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI 方式。这里只对其SPI方式进行介绍。 SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下:

单片机读写SD卡教程

郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开winhex软件,用读卡器读SD卡,在winhex中查看SD卡

点击查找(ctrl+F) 输入FAT(找到DBR处)

发现DBR起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含512BYTE,所以在程序中读一个扇区时一定要是512整数倍,否则会出错。11200地址对应的值是0xEB,本程序读一下这个地址的值看看是否正确。注意有的winhex编址是十进制 看看程序吧 #include #define uchar unsigned char #define uint unsigned int //============================================================= //定义SD卡需要的4根信号线 sbit SD_CLK = P1^1; sbit SD_DI = P1^2; sbit SD_DO = P1^0; sbit SD_CS = P1^3; sbit Beep=P2^0;//用来调程序标志 //=========================================================== //=========================================================== //定义512字节缓冲区,,89C52直接定义成unsigned char DATA[80];,太大了RAM不够unsigned char xdata DATA[512]; void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--); for(y=110;y>0;y--); }

基于Atmega128单片机SD卡读写程序(免费分享)

基于Atmega128单片机SD卡读写程序实物图对照 接线图

以下是一个简单的测试SD卡读写的程序,程序是基于Atmega128单片机编写的,对于Atmega的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。 sd.h //********************************************************** ******** //SPI各线所占用的端口 #define SD_SS PB6 #define SD_SCK PB1 #define SD_MOSI PB2 #define SD_MISO PB3 //********************************************************** ******** #define SD_DDR DDRB #define SD_PORT PORTB #define SD_PIN PINB #define SD_SS_H SD_PORT |= (1<#define SDSS_L SD_PORT &= ~(1<#define SD_SCK_H SD_PORT |= (1<#define SD_SCK_L SD_PORT &= ~(1<#define SD_MOSI_H SD_PORT |= (1<#define SD_MOSI_L SD_PORT

&= ~(1< #define SD_MISO_IN (SD_PIN&(1

SD卡SPI读写中文资料

7S P I模式 本文是小弟自己翻译的(处女作哦~~~~~),难免有不妥之处,望交流指教! 联系方式 QQ:286225453 Email:ioro55555@https://www.doczj.com/doc/075633410.html, 7.1介绍 SPI模式 SPI模式由二次传递协议组成,这个协议由Flash(基于SD卡)提供。本模式是SD卡协议的子协议,目的是用SPI信道通讯。SPI模式在SD卡上电后第一个复位指令(CMD0)执行后被选择,并且在接通电源时不能改变。SPI标准定义 7.2 SPI总线 SD卡信道由指令和数据位(起始位和结束位)组成,SPI信道由字节定向。每一个指令或数据块由8位的字节和CS标志构成。类似SD卡协议, SPI通讯由指令、响应和数据组成。全部的主机与SD卡之间的通信由主机控制。主机执行每一跟CS标志为低的总线。SPI模式与SD模式的响应特性有以下三方面不同∶ 1、被选择的卡始终对指令作出反应。 2、一个附加的(8BIT)响应产生。 3、在SD卡遇到数据检索问题时,它会作出错误反应,而不是像在SD模式中一样执行一次空操作。 除命令响应之外,每一个数据块在写操作期间会作出专门的信息响应标志反应发送给SD卡。数据块可以大到一个扇区小到一个字节。读/写操作由CSD(指令信号译码器)寄存器操作。 7.2.1模式选择 SD卡在上电后自动SD模式。如果CS标志在接受复位指令(CMD0)期间为低,它将进入SPI模式并且处于空闲状态。如果SD卡识别到需要保持SD模式,它不会对指令作出任何反应并且保持在SD模式中。如果需要SPI模式,SD卡将转到SPI模式并且进行SPI模式R1响应。回到SD模式的必须重新上电。在SPI 模式下,SD卡遵守部分协议系统。支持SPI模式的SD卡指令始终有效。 7.2.2总线传送保护 SPI模式

读写SD卡的设计及其程序硬件

前言 长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用SD作为存储媒质。本文主要介绍了SD卡在电能监测及无功补偿数据采集系统中的应用方案。 设计方案 应用AT89C52读写SD卡有两点需要注意。首先,需要寻找一个实现AT89C52单片机与SD卡通讯的解决方案;其次,SD卡所能接受的逻辑电平与AT89C52提供的逻辑电平不匹配,需要解决电平匹配问题。 通讯模式 SD卡有两个可选的通讯协议:SD模式和SPI模式。SD模式是SD卡标准的读写方式,但是在选用SD模式时,往往需要选择带有SD卡控制器接口的MCU,或者必须加入额外的SD 卡控制单元以支持SD卡的读写。然而,AT89C52单片机没有集成SD卡控制器接口,若选用SD模式通讯就无形中增加了产品的硬件成本。在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。因为在SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用SPI模式对SD卡进行读写操作可大大简化硬件电路的设计。 虽然AT89C52不带SD卡硬件控制器,也没有现成的SPI接口模块,但是可以用软件模拟出SPI总线时序。本文用SPI总线模式读写SD卡。 电平匹配 SD卡的逻辑电平相当于3.3V TTL电平标准,而控制芯片AT89C52的逻辑电平为5V CMOS 电平标准。因此,它们之间不能直接相连,否则会有烧毁SD卡的可能。出于对安全工作的考虑,有必要解决电平匹配问题。 要解决这一问题,最根本的就是解决逻辑器件接口的电平兼容问题,原则主要有两条:一为输出电平器件输出高电平的最小电压值,应该大于接收电平器件识别为高电平的最低电压值;另一条为输出电平器件输出低电平的最大电压值,应该小于接收电平器件识别为低电平的最高电压值。 一般来说,通用的电平转换方案是采用类似SN74ALVC4245的专用电平转换芯片,这类芯片不仅可以用作升压和降压,而且允许两边电源不同步。但是,这个方案代价相对昂贵,而且一般的专用电平转换芯片都是同时转换8路、16路或者更多路数的电平,相对本系统仅仅需要转换3路来说是一种资源的浪费。

SD卡读写的方式(用SD模式)

大家读写SD卡怎么不用SD模式方式读取,是SPI方式读取简单? 下面贴一段代码,是在FPGA上程序,只能用SD模式进行读,没有文件系统,没有用AVR硬件实现,电路图: 电路说明,SD_DAT3一直给高电平 程序: #ifndef __SD_Card_H__ #define __SD_Card_H__ #define High 1 #define Low 0 //------------------------------------------------------------------------- // SD Card Set I/O Direction #define SD_CMD_IN DDRX.1 = Low #define SD_CMD_OUT DDRX.1 = High #define SD_DAT_IN DDRX.2 = Low #define SD_DAT_OUT DDRX.2 = High #define SD_CLK_OUT DDRX.3 = High #define SD_DAT3_OUT DDRX.0 = High // SD Card Output High/Low #define SD_CMD_LOW PORTX.1 = Low

#define SD_CMD_HIGH PORTX.1 = High #define SD_DAT_LOW PORTX.2 = Low #define SD_DAT_HIGH PORTX.2 = High #define SD_CLK_LOW PORTX.3 = Low #define SD_CLK_HIGH PORTX.3 = High #define SD_DAT3_HIGH PORTX.0 = High // SD Card Input Read #define SD_TEST_CMD PINX.1 #define SD_TEST_DAT PINX.2 //------------------------------------------------------------------------- #define BYTE unsigned char #define UINT16 unsigned int #define UINT32 unsigned long //------------------------------------------------------------------------- void Ncr(void); void Ncc(void); BYTE response_R(BYTE); BYTE send_cmd(BYTE *); BYTE SD_read_lba(BYTE *,UINT32,UINT32); BYTE SD_card_init(void); //------------------------------------------------------------------------- BYTE read_status; BYTE response_buffer[20]; BYTE RCA[2]; BYTE cmd_buffer[5]; const BYTE cmd0[5] = {0x40,0x00,0x00,0x00,0x00}; const BYTE cmd55[5] = {0x77,0x00,0x00,0x00,0x00}; const BYTE cmd2[5] = {0x42,0x00,0x00,0x00,0x00}; const BYTE cmd3[5] = {0x43,0x00,0x00,0x00,0x00}; const BYTE cmd7[5] = {0x47,0x00,0x00,0x00,0x00}; const BYTE cmd9[5] = {0x49,0x00,0x00,0x00,0x00}; const BYTE cmd16[5] = {0x50,0x00,0x00,0x02,0x00}; const BYTE cmd17[5] = {0x51,0x00,0x00,0x00,0x00}; const BYTE acmd6[5] = {0x46,0x00,0x00,0x00,0x02}; const BYTE acmd41[5] = {0x69,0x0f,0xf0,0x00,0x00}; const BYTE acmd51[5] = {0x73,0x00,0x00,0x00,0x00}; //------------------------------------------------------------------------- void Ncr(void) { SD_CMD_IN; SD_CLK_LOW; SD_CLK_HIGH; SD_CLK_LOW; SD_CLK_HIGH;

SD卡接口设计

SD卡接口设计 时间:2011-11-21 20:59:04 来源:作者: 1 SD卡标准 SD卡标准是SD卡协会针对可移动存储设备设计专利并授权的一种标准,主要用于制定卡的外形尺寸、电气接口和通信协议。 1.1 SD卡引脚功能 SD卡的外形如图1所示,引脚功能如表1所列。SD卡的引脚具有双重功能,既可工作在SD模式,也可工作在SPI模式。不同的模式下,引脚的功能不同。 SD模式多用于对SD卡读写速度要求较高的场合,SPI模式则是以牺牲读写速度换取更好的硬件接口兼容性。由于SPI协议是目前广泛流行的通信协议,大多数高性能单片机都配备了SPI硬件接口,硬件连接相对简单,因此,在对SD卡读写速度要求不高的情况下,采用SPI模式无疑是一个不错的选择。 1.2 SPI模式 SPI模式是一种简单的命令响应协议,主控制器发出命令后,SD卡针对不S同的命令返

回对应的响应。 SD卡的命令列表都是以CMD和ACMD开头,分别指通用命令和专用命令,后面接命令的编号。例如,CMD17就是一个通用命令,用来读单块数据。 在SPI模式中,命令都是以如下的6字节形式发送的: 每帧命令都以“01”开头,然后是6位命令号和4字节的参数(高位在前,低位在后),最后是7位CRC校验和1位停止位“1”。 SD卡的每条命令都会返回对应的响应类型。在SPI模式下,共有3种响应类型:R1、R2和R3,分别占1、2和3个字节。这里仅列出了R1响应的格式,如表2所列。当出现表中所描述的状态时,相应的位置1。R2和R3的第1个字节格式与R1完全一样,详细内容请参考SD卡标准。 2 硬件设计 本设计选用Freescale公司的32位低功耗微控制器MCF51QE128,采用SPI模式实现与SD卡的接口。 由于MCF51QE128是一款低功耗的微控制器,工作电压的典型值为3.6 V,与SD卡的

SD卡存储应用解决方案文档

目录 第1章 SD/MMC卡读写模块 (1) 1.1 SD/MMC卡的外部物理接口 (1) 1.1.1 SD模式 (2) 1.1.2 SPI模式 (3) 1.2 访问SD/MMC卡的SPI模式硬件电路设计 (4) 1.2.1 SPI总线 (5) 1.2.2 卡供电控制 (5) 1.2.3 卡检测电路 (5) 1.3 SD/MMC卡读写模块的文件结构及整体构架 (5) 1.3.1 SD/MMC卡读写模块的文件组成 (5) 1.3.2 SD/MMC读写模块整体框架 (6) 1.4 SD/MMC卡读写模块的使用说明 (6) 1.4.1 SD/MMC卡读写模块的硬件配置 (6) 1.4.2 SD/MMC卡读写模块提供的API函数 (9) 1.5 SD/MMC卡读写模块的应用示例一 (11) 1.5.1 硬件连接与配置 (11) 1.5.2 实现方法 (11) 1.6 SD/MMC卡读写模块的使用示例二 (18) 1.6.1 实现方法 (18) 1.6.2 例子建立与运行步骤 (20) 1.6.3 参考程序 (24) 1.7 SD/MMC软件包应用总结 (27)

第1章SD/MMC卡读写模块 SD/MMC卡是一种大容量(最大可达4GB)、性价比高、体积小、访问接口简单的存储卡。SD/MMC卡大量应用于数码相机、MP3机、手机、大容量存储设备,作为这些便携式设备的存储载体,它还具有低功耗、非易失性、保存数据无需消耗能量等特点。 SD卡接口向下兼容MMC(MutliMediaCard多媒体卡)卡,访问SD卡的SPI协议及部分命令也适用于MMC卡。 SD/MMC卡读写模块是ZLG 系列中间件的重要成员之一,又称为ZLG/SD。该模块是一个用来访问SD/MMC卡的软件读写模块,目前最新版本为2.00,本版本不仅能读写SD卡,还可以读写MMC卡;不仅能在前后台系统(无实时操作系统)中使用,还可以在嵌入式操作系统μC/OS-II中使用。本文模块只支持SD/MMC卡的SPI模式。 在本章中,除了特别说明以外,“卡”都是指SD卡或MMC卡。 1.1 SD/MMC卡的外部物理接口 SD和MMC卡的外形和接口触点如图 1.1所示。其中SD卡的外形尺寸为:24mm x 32mm x 2.1mm(普通)或24mm x 32mm x 1.4mm(薄SD存储卡),MMC卡的外形尺寸为24mm x 32mm x 1.4mm。 图 1.1 SD卡和MMC卡实物图 图1.2 SD卡和MMC卡接口示意图(上视图) 表1.1为SD/MMC卡各触点的名称及作用,其中MMC卡只使用了1 ~ 7触点。 表1.1 SD/MMC卡的焊盘分配 引 SD模式SPI模式 脚名称1类型描述名称类型描述 1 CD/DAT3 2 I/O/PP3卡的检测/数据线[Bit 3]CS I 片选(低电平有效) 2 CMD PP4命令/响应DI I5数据输入 3 V SS1 S 电源地VSS S 电源地

相关主题
文本预览
相关文档 最新文档