|
我是通过串口调试的,还没涉及到FAT,可以确认初始化是成功的,但是当我要读扇区0时,发现读出的数具都是0x78,可是扇区0应该是启动扇区的内容啊
#define uchar unsigned char
#define uint unsigned int
#define cs PORTB.0
uchar BUFFER[512]; //扇区缓冲区
uint i=0;
///////////////////////////////////////////////////////////////////////////
//
//
void spi_init(void)
{
DDRB = 0xf7; //SI输入,SO,SCK,SS输出
SPCR = 0x51; //setup SPI
SPSR = 0x00; //setup SPI
}
///////////////////////////////////////////////////////////////////////////
//
//
void Write_Byte_SPI(unsigned char byte)
{
SPDR = byte;
while (!(SPSR & (1<<7)));
}
uchar reading=0,a=0,pointer=0;
void high_spi(void)
{SPCR = 0x50; //提速
SPSR = 0x01; //setup SPI
}
///////////////////////////////////////////////////////////////////////////
//
//
unsigned char Read_Byte_SPI(void)
{
SPDR = 0xFF;
while (!(SPSR &(1<<7)));
return SPDR;
}
//****************************************************************************
//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;
cs=1; //关闭SD
//send 8 Clock Impulse
Write_Byte_SPI(0xFF);
//set MMC_Chip_Select to low (MMC/SD-Card active)
cs=0; //打开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)); //当没有收到有效的命令的时候
cs=1; //SD卡关闭
//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)
{ unsigned long int retry,temp;
uchar i;
spi_init();
delay_us(300); //Wait MMC/SD ready...
for (i=0;i<20;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>500)
{
return(4);//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_Commnd(1,0);
retry++;
if(retry>500)
{
return(9);
}
}
while(temp!=0);
retry=0;
SD_Write_Command(16,512);//设置一次读写BLOCK的长度为512个字节
// SD_Write_Command(59,0);
high_spi();
cs=1; //MMC_CS_PIN=1; //关闭SD
return(80); //初试化成功
}
//****************************************************************************
//从SD卡读一个扇区 Return 0 if no Error.
//****************************************************************************
uchar SD_Read_Block(unsigned long address)
{
unsigned int retry,temp=0;uint i=0;
address=(address<<9);
//reading=1;
cs=0; //打开SD
temp=SD_Write_Command(17,address); //读出RESPONSE
while (Read_Byte_SPI()!=0xfe)
{retry++;if(retry>200) return 9;};//直到读取到了数据的开始头0XFE,才继续
for(i=0; i<512; i++)
{
BUFFER=Read_Byte_SPI();
//printf("%x",BUFFER);
}
Read_Byte_SPI();//CRC - Byte
Read_Byte_SPI();//CRC - Byte
reading=0;
cs=1; //关闭SD卡
return(temp);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|