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

📄 sd.c

📁 可以兼容MS-DOS的文件系统和指令的S3C2410平台的DOS部分源代码,加以修改可以使用在S3C2440 S3C44B0等ARM7、ARM9上
💻 C
字号:
#ifndef __SD_C__
#define __SD_C__
#include "dos.h"
#if(SUPPORT_SD==1)

int SD_inserted=0;
int delay_time=0x100;

/*硬件相关连线*/
#define CS_LOW()		rGPEDAT&=~(1<<10)
#define CS_HIGH()		rGPEDAT|=(1<<10)
#define DI_LOW()		rGPEDAT&=~(1<<6)
#define DI_HIGH()		rGPEDAT|=(1<<6)
#define CLK_LOW()		rGPEDAT&=~(1<<5)
#define CLK_HIGH()		rGPEDAT|=(1<<5)	
#define DO()			(rGPEDAT&(1<<7))

#define _400KHZ_	0x100
#define _10MHZ_		_400KHZ_/25
 
static void delay(int i)
{
	while(i--);
} 
 
static void SPI_send(char cmd)
{
	int i;
	for(i=0;i<8;i++)
	{
		CLK_LOW();
		delay(delay_time);
		if(cmd&0x80)
			DI_HIGH();
		else
			DI_LOW();
		cmd<<=1;
		CLK_HIGH();
		delay(delay_time);
	}
}

static unsigned char SPI_receive()
{
	int i;
	unsigned char ret=0;
	for(i=0;i<8;i++)
	{
		CLK_LOW();
		delay(delay_time);
		ret<<=1;
		if(DO()) ret++;
		CLK_HIGH();
		delay(delay_time);
	}
	return ret;
}

static unsigned int SendCommand(unsigned char cmd,int arg)
{
	unsigned int status;
	int i;
	SPI_send(cmd|0x40);
	SPI_send(arg>>24);
	SPI_send(arg>>16);
	SPI_send(arg>>8);
	SPI_send(arg);
	SPI_send(cmd?0xff:0x95);
	for(i=0;i<100;i++)
	{
		status=SPI_receive();
		if(!(status&0x80)) break;
	}
	return status;
}

static int Reset()
{
	int status;
	CS_LOW();
	status=SendCommand(0x00,0x00);
	CS_HIGH();
	return status;
}

static int IsSD()
{
	int i,status;
	CS_LOW();
	for(i=0;i<100;i++)
	{
		SendCommand(55,0x0000);
		status=SendCommand(41,0x0000);
		if(!status) break;
		delay(0x100);
	}
	CS_HIGH();
	return i!=100;	
}

static int IsMMC()
{
	int i,status;
	CS_LOW();
	for(i=0;i<100;i++)
	{
		status=SendCommand(1,0x0000);
		if(!status) break;
		delay(0x100);
	}
	CS_HIGH();
	return i!=100;	
}

static int Erase(int block)
{
	CS_LOW();
	printf("CMD32=0x%x\n",SendCommand(32,block));
	printf("CMD33=0x%x\n",SendCommand(33,block));
	printf("CMD38=0x%x\n",SendCommand(38,0x0000));
	while(!DO())
	{
		SPI_send(0xff);
		printf("Busying....\n");
	}
	CS_HIGH();
	return 1;
}

static int OCR()
{
	CS_LOW();
	printf("CMD58=%d\n",SendCommand(58,0x0000));
	printf("OCR=0x%02x",SPI_receive());
	printf("%02x",SPI_receive());
	printf("%02x",SPI_receive());
	printf("%02x\n",SPI_receive());
	CS_HIGH();
}

static int CSD()
{
	int i;
	CS_LOW();
	printf("CMD9=%d\n",SendCommand(0x09,0x0000));
	SPI_send(0xff);
	printf("CSD=0x");
	for(i=0;i<17;i++)
		printf("%02x",SPI_receive());
	CS_HIGH();	
}

static int Read(int sector,char *buff)
{
	int i;
	CS_LOW();
	if(SendCommand(17,sector)&0x80)
	{
		CS_HIGH();
		return 0;
	}
	for(i=0;i<100;i++)
	{	
		if(SPI_receive()==0xfe) break;
	}
	if(i==100)
	{
		CS_HIGH();
		return 0;
	}
	for(i=0;i<512;i++,buff++)
	{
		*buff=SPI_receive();
	}
	SPI_receive();
	SPI_receive();
	CS_HIGH();
	return 1;		
}

int SD_read(DWORD sector,char*buff,DWORD sector_size,void*unused)
{
	return Read(sector,buff);
}
int SD_write(DWORD sector,char*buff,DWORD sector_size,void*unused)
{
	return 0;
}
void SD_install()
{
	char buff[512];
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);
	SPI_send(0xff);/*80 blocks*/
	Reset();
	if(IsSD())
	{
		printf("SD card!\n");
	}
	else if(IsMMC())
	{
		printf("MMC card!\n");
	}
	else
	{
		printf("NO card!\n");
		return ;
	}
	if(FAT_install(0x0000,(SECTOR_ERASE)0,(SECTOR_READ)SD_read,(SECTOR_WRITE)SD_write,(void*)0))
		printf("SD install successed!\n");
	else
		printf("SD install failed!\n");
}


void SD_init()
{
	/*开始检测SD卡是否插入*/
	rGPGCON&=~(3u<<20);
	rGPGUP=0x0000;
	SD_inserted=rGPGDAT&(1<<10)?0:1;
	if(SD_inserted)/*当前已插入则设置为rising中断*/
	{
		rEXTINT2|=0x0c<<8;
	}
	else
	{
		rEXTINT2|=0x0a<<8;
	}
	rGPGCON|=2u<<20;
	rEINTMASK&=~(1u<<18);
	SD_install();
}
#endif

#endif

⌨️ 快捷键说明

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