单片机操作SD/MMC卡的读写

时间:2024-10-13 07:11:54

1、SD卡的引脚定义和不同可见下图。

单片机操作SD/MMC卡的读写

2、SD卡各引脚定义,不同模式功能都不一样。

单片机操作SD/MMC卡的读写

3、SD卡硬件连接由于使用的控制器工作电压为5V,而SD卡的工作电压有1.8V或3.3V等。通过串联电阻分压转换5V电平,硬件电路经过实测,可以正常使用。

单片机操作SD/MMC卡的读写

4、用控制器模拟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;}

5、SD卡的软件驱动和指令集。SD卡的命令格式如下,6字节共48位,传输时最高位(MSB)先传输

单片机操作SD/MMC卡的读写

6、复位方法:1.拉高CS,发送至少74个clk周期来使SD卡达到正常工作电压和进行同步2.选低CS,发送CMD0(0x40+0),需要收到回应0x01表示成功进入idle状态3.拉高CS,发送8个时钟

单片机操作SD/MMC卡的读写

7、初始化SD卡为SPI工作模式发送CMD55+ACMD41,后收到0x00表示成功注意SD卡的初始化速度不能太快,不能大于400kHz,一开始复位和初始化时SPI的速率要设置低一点。

单片机操作SD/MMC卡的读写

8、读单块 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; }

单片机操作SD/MMC卡的读写

9、写单块 1.发送C怡觎现喾MD24,收到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<len;i++) SPI_Write_byte(Block[i]); for(;i<512;i++) SPI_Write_byte(0x00); SPI_Write_byte(0xff); SPI_Write_byte(0xff); R_Write = SPI_Read_byte() & 0x0f; while(SPI_Read_byte() == 0); CS = 1; SPI_Write_byte(0xff); if(R_Write == 0x05) return 1; else return 0;}

单片机操作SD/MMC卡的读写

10、介绍了SD卡的硬件连接,SD卡的复位、SD卡的初始化、SD卡的读写单块的实现方法

© 手抄报圈