SD card reader MMC memory based on 51 single chip microcomputer

Publisher:郑哥Latest update time:2022-03-05 Source: eefocus Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

hardware design

insert image description here

programming

#include


#define F_OSC 11059200 // crystal oscillator frequency Hz

#define F_BAUD 9600

#define RELOAD 256-F_OSC/12/32/F_BAUD

#define CR 0x0D //Enter


//Define the 4 signal lines required by the SD card

sbit SD_CLK = P1^4;

sbit SD_DI = P1^6;

sbit SD_DO = P1^5;

sbit SD_CS = P1^7;


unsigned char xdata DATA[512];

//Define a 512-byte buffer. Note that you need to use the xdata keyword.



//===========================================================

//Write one byte to the SD card, simulating the SPI bus mode

void SdWrite(unsigned char n)

{


    unsigned char i;

    

    for(i=8;i;i--)

    {

        SD_CLK=0;

        SD_DI=(n&0x80);

        n<<=1;

        SD_CLK=1;

        }

        SD_DI=1; 

    } 

//===========================================================

//Read one byte from the SD card, simulating the SPI bus mode

unsigned char SdRead()

{

    unsigned char n,i;

    for(i=8;i;i--)

    {

        SD_CLK=0;

        SD_CLK=1;

        n<<=1;

        if(SD_DO) n|=1;

    

    }

    return n;

}

//============================================================

//Detect the response of SD card

unsigned char SdResponse()

{

    unsigned char i=0,response;

    

    while(i<=8)

    {

        response = SdRead();

        if(response==0x00)

        break;

        if(response==0x01)

        break;

        i++;

    }

    return response;

//================================================================

//Send command to SD card

void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)

{


    SdWrite(command|0x40);

    SdWrite(((unsigned char *)&argument)[0]);

    SdWrite(((unsigned char *)&argument)[1]);

    SdWrite(((unsigned char *)&argument)[2]);

    SdWrite(((unsigned char *)&argument)[3]);

    SdWrite(CRC);

}

//================================================================

// Initialize SD card

unsigned char SdInit(void)

{

    int delay=0, trials=0;

    unsigned char i;

    unsigned char response=0x01;

    

    SD_CS=1;

    for(i=0;i<=9;i++)

    SdWrite(0xff);

    SD_CS=0;

    

    //Send Command 0 to put MMC in SPI mode

    SdCommand(0x00,0,0x95);

    

    

    response=SdResponse();

    

    if(response!=0x01)

    {

        return 0;

    } 


    while(response==0x01)

    {

        SD_CS=1;

        SdWrite(0xff);

        SD_CS=0;

        SdCommand(0x01,0x00ffc000,0xff);

        response=SdResponse();

    } 


    SD_CS=1;

    SdWrite(0xff);

    return 1; 

}

//================================================================

//Write data to the specified address of the SD card, up to 512 bytes at a time

unsigned char SdWriteBlock(unsigned char *Block, unsigned long address,int len)

{

    unsigned int count;

    unsigned char dataResp;

    //Block size is 512 bytes exactly

    //First Lower SS

    

    SD_CS=0;

    //Then send write command

    SdCommand(0x18,address,0xff);

    

    if(SdResponse()==00)

    {

        SdWrite(0xff);

        SdWrite(0xff);

        SdWrite(0xff);

        //command was a success - now send data

        //start with DATA TOKEN = 0xFE

        SdWrite(0xfe);

        //now send data

        for(count=0;count        

        for(;count<512;count++) SdWrite(0);

        //data block sent - now send checksum

        SdWrite(0xff); //Two-byte CRC check, 0XFFFF means CRC is not considered

        SdWrite(0xff);

        //Now read in the DATA RESPONSE token

        dataResp=SdRead();

        //Following the DATA RESPONSE token

        //are a number of BUSY bytes

        //a zero byte indicates the MMC is busy

        

        while(SdRead()==0);

        

        dataResp=dataResp&0x0f; //mask the high byte of the DATA RESPONSE token

        SD_CS=1;

        SdWrite(0xff);

        if(dataResp==0x0b)

        {

        //printf("DATA WAS NOT ACCEPTED BY CARD -- CRC ERRORn");

        return 0;

        }

        if(dataResp==0x05)

        return 1;

        

        //printf("Invalid data Response token.n");

        return 0;

    }

    //printf("Command 0x18 (Write) was not received by the MMC.n");

    return 0;

}


Documents are for reference only


Link: https://pan.baidu.com/s/1h3ZnGUPP5o_8_NsVMwVQuA

Extraction code: 4ebs

Reference address:SD card reader MMC memory based on 51 single chip microcomputer

Previous article:Multi-point 8-channel temperature acquisition system based on 51 single-chip microcomputer
Next article:Intelligent temperature control fan based on 51 single chip microcomputer

Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号