本帖最后由 yjhdddf 于 2011-12-15 10:19 编辑
51读SD卡复位成功,初始化不成功,请求大家帮忙。
#include "STC12C5A32S2.H"
#include "string.h"
sbit SD_CS =P2^0; //SD卡片选 输入
sbit SD_DI =P2^1; //SD卡同步数据 输入
sbit SD_CLK=P2^2; //SD卡同步时钟 输入
sbit SD_DO =P2^3; //SD卡同步数据 输出
//函数声明
void delay(unsigned int time); //延时函数
void senddata(char dat);
//延时函数
void delay(unsigned int time)
{
while(time--);
}
//串口发送一个字节
void senddata(char dat) //send a data
{
ES = 0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
//串口初始化
void serialinit() //
{
SCON = 0x50;
BRT = 0xfa;
AUXR = 0x11;
AUXR1 = 0x80;
ES = 1; //Pemit serial interrupt
EA = 1; //Pemit all interrupt
}
//串口中断函数
void sio_int() interrupt 4
{
ES=0;
ES=1;
}
//往SD卡定一字节 www.mcusky.com
void SdWrite(unsigned char n)
{
unsigned char i;
for(i=8;i;i--)
{
SD_CLK=0;
SD_DI=(n&0x80);
n<<=1;
SD_CLK=1;
}
SD_DI=1;
}
//================================================================
//从SD卡读一字节 www.mcusky.com
unsigned char SdRead()
{
unsigned char n,i;
for(i=8;i;i--)
{
SD_CLK=0;
SD_CLK=1;
n<<=1;
if(SD_DO) n|=1;
}
return n;
}
//================================================================
//读SD卡响应 www.mcusky.com
unsigned char SdResponse()
{
unsigned char i=0,response;
while(i<=8)
{
response=SdRead();
if(response==0x00)
break;
if(response==0x01)
break;
i++;
}
return response;
}
//================================================================
void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)
{
SdWrite(command|0x40);
SdWrite(((unsigned char *)&argument)[0]);
SdWrite(((unsigned char *)&argument)[1]);
SdWrite(((unsigned char *)&argument)[2]);
SdWrite(((unsigned char *)&argument)[3]);
SdWrite(CRC);
}
//================================================================
unsigned char SdInit(void)
{
int delay=0, trials=0;
unsigned char i;
unsigned char response;
SD_CS=1;
for(i=0;i<=9;i++)
SdWrite(0xff);
SD_CS=0;
senddata(0);
//Send Command 0 to put MMC in SPI mode
SdCommand(0x00,0,0x95);
response=SdResponse();
senddata(response);
if(response!=0x01)
{
return 0;
}
while(response==0x01)
{
SD_CS=1;
SdWrite(0xff);
SD_CS=0;
SdCommand(0x01,0x00ffc000,0xff);
response=SdResponse();
senddata(response);
}
SD_CS=1;
SdWrite(0xff);
return 1;
}
void main()
{
int i;
i=1;
serialinit();
i=SdInit(); //SD卡初始化
senddata(i);
//for(j=0;j<512;j++) pbuf[j]=0;
//SD_Read_Sector(0x00000000,pbuf);
/* for(j=0;j<512;j++)
{
senddata(pbuf[j]);
} */
while(1)
{
}
}
|