AVR的SD卡接口程序
2012-10-26
标签: AVR


/************************************************************/
/*SD卡接口程序 SD Code forM32L*/
/*Bypasyong*/
/*2006-4*/
/*Base ICC6.31A*/
/************************************************************/
#include<avr/io.h>
#include "1011.h"
#define uchar unsigned char
#define uint unsigned int
#define MMC_CS_PINBIT(4)//PORTB.4 
#define MMC_PORTPORTB
uchar reading = 0, a = 0, pointer = 0;
void sd_port_init()
{
    MMC_PORT |= MMC_CS_PIN;
}
uchar BUFFER[512];//扇区缓冲区
uint i = 0;
void delay_nus(uint n)
{
    unsigned charb;
    for (b = 1; b
         ;
}

//****************************************************************************
//Send a Command to MMC/SD-Card
//Return: the second byte of response register of MMC/SD-Card
//****************************************************************************
uchar SD_Write_Command(uchar cmd, unsigned long arg)
{
    uchar tmp;
    uchar retry = 0;
//MMC_PORT|=MMC_CS_PIN;//SD卡关闭
//send 8 Clock Impulse
    Write_Byte_SPI(0xFF);
//set MMC_Chip_Select to low (MMC/SD-Card active)
    MMC_PORT &= ~MMC_CS_PIN; //SD卡使能
    Write_Byte_SPI(cmd | 0x40); //送头命令
    Write_Byte_SPI(arg >> 24);
    Write_Byte_SPI(arg >> 16); //send 6 Byte Command to MMC/SD-Card
    Write_Byte_SPI(arg >> 8);
    Write_Byte_SPI(arg & 0xff);
    Write_Byte_SPI(0x95);//仅仅对RESET有效的CRC效验码
//get 8 bit response
//Read_Byte_MMC(); //read the first byte,ignore it.
    do {
        //Only last 8 bit is used here.Read it out.
        tmp = Read_Byte_SPI();
        retry++;
    }
    while ((tmp == 0xff) && (retry < 100)); //当没有收到有效的命令的时候
    if (reading == 0) {
        MMC_PORT |= MMC_CS_PIN;    //MMC_CS_PIN=1;
    }
    else {
        MMC_PORT &= ~MMC_CS_PIN;    //MMC_CS_PIN=0;
    }
    return (tmp);
}

//****************************************************************************
//SD卡初始化(SPI-MODE)
//****************************************************************************
uchar SD_Init(void)
{
    uchar retry, temp;
    uchar i;
    MMC_PORT &= ~MMC_CS_PIN; //SD卡使能
    delay_nus(250);//Wait MMC/SD ready...
    for (i = 0; i < 0x0f; i++) {
        Write_Byte_SPI(0xff); //send 74 clock at least!!!
    }
//Send Command CMD0 to MMC/SD Card
    retry = 0;
    do {
        //retry 200 times to send CMD0 command
        temp = SD_Write_Command(0, 0);
        retry++;
        if (retry == 100) {
            ;//CMD0 Error!
        }
    }
    while (temp != 1);
//Send Command CMD1 to MMC/SD-Card
    retry = 0;
    do {
        //retry 100 times to send CMD1 command
        temp = SD_Write_Command(1, 0);
        retry++;
        if (retry == 100) {
            ;
        }
    }
    while (temp != 0);
    retry = 0;
    SD_Write_Command(16, 512); //设置一次读写BLOCK的长度为512个字节
    MMC_PORT |= MMC_CS_PIN; //MMC_CS_PIN=1;//set MMC_Chip_Select to high
    return (0); //All commands have been taken.
}

//****************************************************************************
//从SD卡读一个扇区Return 0 if no Error.
//****************************************************************************
uchar SD_Read_Block(unsigned long address)
{
    uchar temp = 0;
    uint i = 0;
    reading = 1;
    temp = SD_Write_Command(17, address); //读出RESPONSE
    while (Read_Byte_SPI() != 0xfe)
    {;}//直到读取到了数据的开始头0XFE,才继续
    for (i = 0; i < 512; i++) {
        BUFFER[i] = Read_Byte_SPI();
    }
    Read_Byte_SPI();//CRC - Byte
    Read_Byte_SPI();//CRC - Byte
    reading = 0;
    MMC_PORT |= MMC_CS_PIN; //关闭SD卡
    return (temp);
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号