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

2025-10-10 15:35:47

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.发送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<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卡的读写单块的实现方法

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢