51单片机读写SD卡

上传人:woxinch****an2018 文档编号:38637239 上传时间:2018-05-05 格式:DOC 页数:15 大小:438.50KB
返回 下载 相关 举报
51单片机读写SD卡_第1页
第1页 / 共15页
51单片机读写SD卡_第2页
第2页 / 共15页
51单片机读写SD卡_第3页
第3页 / 共15页
51单片机读写SD卡_第4页
第4页 / 共15页
51单片机读写SD卡_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《51单片机读写SD卡》由会员分享,可在线阅读,更多相关《51单片机读写SD卡(15页珍藏版)》请在金锄头文库上搜索。

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

2、并对其读写速度进行了评估。下面先来讲解 SD 卡的读写时序。(1) SD 卡的引脚定义卡的引脚定义:(2) SD 卡引脚功能详述:SD 模式SPI 模式引脚编号名称类型描述名称类型描述1CD/DAT3IO 或 PP卡检测/数据线 3#CSI片选2CMDPP命令/回应DII数据输入3VSS1S电源地VSSS电源地4VDDS电源VDDS电源5CLKI时钟SCLKI时钟6VSS2S电源地VSS2S电源地7DAT0IO 或 PP数据线 0DOO 或 PP数据输出8DAT1IO 或 PP数据线 1RSV9DAT2IO 或 PP数据线 2RSV注:S:电源供给 I:输入 O:采用推拉驱动的输出 PP:采用

3、推拉驱动的输入输出SD 卡与单片机的连接图:SD 卡 SPI 模式下与单片机的连接图:SD 卡支持两种总线方式:SD 方式与 SPI 方式。其中 SD 方式采用 6 线制,使用CLK、CMD、DAT0DAT3 进行数据通信。而 SPI 方式采用 4 线制,使用CS、CLK、DataIn、DataOut 进行数据通信。SD 方式时的数据传输速度与 SPI 方式要快,采用单片机对 SD 卡进行读写时一般都采用 SPI 模式。采用不同的初始化方式可以使SD 卡工作于 SD 方式或 SPI 方式。这里只对其 SPI 方式进行介绍。(2) SPI 方式驱动方式驱动 SD 卡的方法卡的方法SD 卡的 SP

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

5、三种应答格式,如下表所示:字节 位含义7开始位,始终为 06参数错误5地址错误4擦除序列错误3CRC 错误2非法命令1擦除复位10闲置状态字节位含义7开始位,始终为 06参数错误5地址错误4擦除序列错误3CRC 错误2非法命令1擦除复位10闲置状态7溢出,CSD 覆盖6擦除参数5写保护非法4卡 ECC 失败3卡控制器错误2未知错误1写保护擦除跳过,锁解锁失败20锁卡字节位含义7开始位,始终为 06参数错误5地址错误4擦除序列错误3CRC 错误2非法命令1擦除复位10闲置状态25全部操作条件寄存器,高位在前写命令的例程:1./- 2. 向 SD 卡中写入命令,并返回回应的第二个字节 3./- 4

6、.unsigned char Write_Command_SD(unsigned char *CMD) 5. 6. unsigned char tmp; 7. unsigned char retry=0; 8. unsigned char i; 9. 10. /禁止 SD 卡片选 11. SPI_CS=1; 12. /发送 8 个时钟信号 13. Write_Byte_SD(0xFF); 14. /使能 SD 卡片选 15. SPI_CS=0; 16. 17. /向 SD 卡发送 6 字节命令 18. for (i=0;isector_count = sectorBuffer.dat6 18.

7、 vinf-sector_count sector_count += sectorBuffer.dat7; 20. vinf-sector_count sector_count += (sectorBuffer.dat8 22. / 获取 multiplier 23. vinf-sector_multiply = sectorBuffer.dat9 24. vinf-sector_multiply sector_multiply += (sectorBuffer.dat10 26. /获取 SD 卡的容量 27. vinf-size_MB = vinf-sector_count (9-vinf

8、-sector_multiply); 28. / get the name of the card 29. Read_CID_SD(sectorBuffer.dat); 30. vinf-name0 = sectorBuffer.dat3; 31. vinf-name1 = sectorBuffer.dat4; 32. vinf-name2 = sectorBuffer.dat5; 33. vinf-name3 = sectorBuffer.dat6; 34. vinf-name4 = sectorBuffer.dat7; 35. vinf-name5 = 0x00; /end flag 36

9、. 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 name6; 44. VOLUME_INFO_TYPE; 5) 扇区读扇区读是对 SD 卡驱动的目的之一。SD 卡的每一个扇区中有 512 个字节,一次扇区读操作将把某一个扇区内的 512 个字节全部

10、读出。过程很简单,先写入命令,在得到相应的回应后,开始数据读取。扇区读的时序:扇区读的程序例程: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 24 ); 12. CMD2 = (s

11、ector 13. CMD3 = (sector 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.

12、 /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

13、int j; 42. for (j=0;j24 ); 13. CMD2 = (addr 14. CMD3 = (addr 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;i100;i+) 32. 33. Read_Byte_SD(); 34. 3

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 高中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号