SD 卡初始化及读取程序
首先是 SD 卡的初始化问题。SD 卡的初始化很简单,各个论坛上写的也很详细,个人认
为基本不存在太大问题。首先是 74 个 clk,然 后 CS_LOW;发 送 CMD0,收到的应答是 0x01;
接着发送 CMD1,收到的应答应该是 0x00;最后 CS_HIGH。至此,初始化完成。需要注意的
问题:初始化的时钟不宜太快,可以在 SD 卡初始化完成后可提高数据读写速度;在发送命
令之前和收到应答位之后,主控制器应该发送 8 个时钟完成相应操作;CMD0 的 CRC 是 0x95,
其余命令的 CRC 无所谓。
读取单块数据流程:CS_LOW‐‐>8 个 clk‐‐>发送 CMD17‐‐>接收响应 R1‐‐>接收读数据起始
令牌 0xFE‐‐>接收数据‐‐>接收 CRC‐‐>8 个 clk‐‐>CS_HIGH;
写入单块数据流程:CS_LOW‐‐>8 个 clk‐‐>发送 CMD24‐‐>接收响应 R1‐‐>写入读数据起始
令牌 0xFE‐‐>写入数据‐‐>接收 CRC‐‐
>8 个 clk‐‐>CS_HIGH;
读写操作指令:单块写命令 CMD24,多块写命令 CMD25;单块读命令 CMD17,多块 读
命令 CMD18。单块读写时,数据块的长度为 512 字节,多块读写时 SD 卡收到 1 个停止命令
CMD12 后停止读写。
本程序参考自 bozai 的 SD 卡驱动程序, 增加了 SD、MMC 卡判断的功能,SD、MMC
初始化成功后能返回卡的类型参数供主程序使用。
//‐‐‐‐‐‐‐‐SD_MMC.H‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
#ifndef__SD_MMC_H__
#define__SD_MMC_H__
// 数据宏定义
#defineuint8 unsignedchar
#define int8 signedchar
#defineuint16unsignedint
#define int16 signedint
#defineuint32unsignedlong
#define int32 signedlong
//C8051F015 与 SD_MMC 的接口定义
sbitSDCS =P3^0;
sbitSDDET =P3^1;
sbitSDWP =P3^2;
voidSPI_SendWreit(uchartemp); //VS1003BDATA 发送
uint8SPI_SendByte(uint8val); //SPI 传送一个字节
uint8MMC_SD_SendCmd(uint8Cmd,uint32arg); //发送卡命令
uint8MMC_SD_ReadSingleBlock(uint32sector,uint8*buffer); //读一个扇区
uint8MMC_SD_WriteSingleBlock(uint32sector,uint8*buffer);
//写一个扇区