?? sd.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 + -