单片机操作SD/MMC卡的读写
的有关信息介绍如下:SD卡是一种基于半导体快闪记忆器开发的新一代记忆设备,目前SD卡被广泛应用于各种便携式装置上,一般重量约为2 g,拥有较好的安全性、移动灵活性、快速数据传输率和高记忆容量。许多嵌入式设备都选择使用SD卡以提高系统的稳定性、降低成本。
采用SPI 模式方法,实现对SD/MMC 的控制。
SD卡的引脚定义和不同可见下图。
SD卡各引脚定义,不同模式功能都不一样。
SD卡硬件连接
由于使用的控制器工作电压为5V,而SD卡的工作电压有1.8V或3.3V等。
通过串联电阻分压转换5V电平,硬件电路经过实测,可以正常使用。
用控制器模拟SPI读写时序
void SPI_Write_byte(u8 dat){ unsigned char i; for (i=0;i<8;i++) { if (dat&0x80) //总是发送最高位 MOSI=1; else MOSI=0; SCK=1; dat<<=1; delay_spi(SPI_Speed); SCK=0; delay_spi(SPI_Speed); } MOSI=1;}
u8 SPI_Read_byte(void){ unsigned char j; unsigned char R_data; for (j=0;j<8;j++) { R_data<<=1; SCK=1; if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节 R_data|=1; delay_spi(SPI_Speed); SCK=0; delay_spi(SPI_Speed); } return R_data;}
SD卡的软件驱动和指令集。
SD卡的命令格式如下,6字节共48位,传输时最高位(MSB)先传输
复位方法:
1.拉高CS,发送至少74个clk周期来使SD卡达到正常工作电压和进行同步
2.选低CS,发送CMD0(0x40+0),需要收到回应0x01表示成功进入idle状态
3.拉高CS,发送8个时钟
初始化SD卡为SPI工作模式
发送CMD55+ACMD41,后收到0x00表示成功
注意SD卡的初始化速度不能太快,不能大于400kHz,一开始复位和初始化时SPI的速率要设置低一点。
读单块
1.发送CMD17,收到0x00表示成功
2.连续读直到读到开始字节0xFE
3.读512个字节
4.读两个CRC字节
unsigned char *SD_Block_Read(unsigned long address){ unsigned int i=0 while(SD_Cmd_NoFault(0x11,address,0xff) != 0x00); while(SPI_Read_byte() != 0xfe); for(i=0;i<512;i++) SD_Buffer[i] = SPI_Read_byte(); SPI_Read_byte(); SPI_Read_byte(); CS = 1; SPI_Read_byte(); return SD_Buffer; }
写单块
1.发送CMD24,收到0x00表示成功
2.发送若干时钟
3.发送写单块开始字节0xFE
4.发送512个字节数据
5.发送2字节CRC(可以均为0xff)
6.连续读直到读到XXX00101表示数据写入成功
7.继续读进行忙检测(读到0x00表示SD卡正忙),当读到0xff表示写操作完成
unsigned char SD_Block_Write(unsigned char *Block,unsigned long address,unsigned int len){ unsigned int i; unsigned char R_Write while(SD_Cmd_NoFault(0x18,address,0xff) != 0x00); for(i=0;i<10;i++) SPI_Write_byte(0xff); SPI_Write_byte(0xfe) for(i=0;i 介绍了SD卡的硬件连接,SD卡的复位、SD卡的初始化、SD卡的读写单块的实现方法