⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.h~

📁 用Mega32+VS1003做的MP3(FAT32文件系统浏览)——源代码
💻 H~
字号:
/************************************************************/
/*		         HEAD FILE  for   sd					    */
/*				   By   pasyong								*/
/*				   2006-4									*/
/*				   Base ICC6.31A					        */
/************************************************************/
#ifndef _SD_INCLUDED_
#define _SD_INCLUDED_ 
#include <mega32.h>   
#include <delay.h> 
#include "uart.h"  
#include "myspi.h" 

#define MMC_CS_PIN     0X10    // BIT(4)    //PORTB.4 cs位
#define MMC_PORT       PORTB  
        
uchar BUFFER[512]; //扇区缓冲区 
bit reading=0;     //标记读写,1:读

void  spi_init(void);    //初始化spi
uchar SD_Write_Command(uchar cmd,unsigned long arg);//写命令到sd卡
void  sd_port_init(void);//初始化sd卡的io
uchar SD_Init(void);     //sd卡初始化             
uchar SD_Read_Block(unsigned long address); //读取一个块数据  
void  sd_port_init()     //把cs端口放到sd卡上去
{
    MMC_PORT|=MMC_CS_PIN;
} 
//****************************************************************************
//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);  
    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 
    do //Read_Byte_MMC(); //read the first byte,ignore it. 
    { 
        tmp = Read_Byte_SPI(); //Only last 8 bit is used here.Read it out. 
        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_us(250);         //Wait MMC/SD ready...
    for (i=0;i<0x0f;i++) 
    {
        Write_Byte_SPI(0xff); //send 74 clock at least!!!
    } 
    retry=0; 
    do//Send Command CMD0 to MMC/SD Card
    { 
        temp=SD_Write_Command(0,0);//retry 200 times to send CMD0 command 
        retry++;
        if(retry==100)return 0xff;//CMD0 Error!  
    } 
    while(temp!=1);  
    retry=0;
    do//Send Command CMD1 to MMC/SD-Card
    { 
        temp=SD_Write_Command(1,0);//retry 100 times to send CMD1 command 
        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.  
//address:所在的物理扇区编号
//返回值:!0xff
//****************************************************************************
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)PORTA.1=1; //直到读取到了数据的开始头0XFE,才继续
    PORTA.1=0;
    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);
}  
//****************************************************************************
//从SD卡读一个扇区  Return 0 if no Error.
//****************************************************************************
uchar SD_Read_Block2(unsigned long address,unsigned char *buf)
{ 
    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++)
	{
        buf[i]=Read_Byte_SPI();
	}
    Read_Byte_SPI();//CRC - Byte 
    Read_Byte_SPI();//CRC - Byte
    reading=0; 
    MMC_PORT|=MMC_CS_PIN;        //关闭SD卡
    return(temp);
}  

//从指定位置读取一个字
unsigned int SD_Read_Word(unsigned long address,unsigned int offset)
{
    uchar temp=0;uint i=0;
    uchar k=0; 
    uchar buf[2]; 
    reading=1;
    temp=SD_Write_Command(17,address<<9);     //读出RESPONSE     
    while (Read_Byte_SPI()!= 0xfe);//直到读取到了数据的开始头0XFE,才继续
    for(i=0;i<offset;i++)Read_Byte_SPI();
    for(;i<offset+2;i++)buf[k++]=Read_Byte_SPI();	
    for(;i<512;i++)Read_Byte_SPI();
    Read_Byte_SPI();
    Read_Byte_SPI();
    reading=0; 
    MMC_PORT|=MMC_CS_PIN;        //关闭SD卡         
    return (*((unsigned int*) &((char*)buf)[0])) ; 
}      
//连续读取指定扇区offset偏移位置,bytes个数据
void SD_Read_Bytes(unsigned long address,unsigned char *buf,unsigned int offset,unsigned int bytes)
{
    uchar temp=0;uint i=0;
    reading=1;
    temp=SD_Write_Command(17,address<<9);     //读出RESPONSE     
    while (Read_Byte_SPI()!= 0xfe);//直到读取到了数据的开始头0XFE,才继续
 	for(i=0;i<offset;i++)  Read_Byte_SPI();
    for(;i<offset+bytes;i++)   *buf++=Read_Byte_SPI();	
    for(;i<512;i++) Read_Byte_SPI();
    Read_Byte_SPI();
    Read_Byte_SPI();
    reading=0; 
    MMC_PORT|=MMC_CS_PIN;        //关闭SD卡
} 
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -