SD_Disable(); //关片选
return(INIT_CMD1_ERROR); //如果重试100次失败返回错误号 }
}while(temp!=0);
MSD_Disable(); //关片选
SPCR=0x50; //设置SPI为2分频。进行高速读写 SPSR=0x01;
return(TRUE); //返回成功 }
//****************************************************************************
// 发送命令给 MMC/SD卡
//Return: 返回MMC/SD卡对命令响应的第2字节,作为命令成功判断
unsigned char Write_Command_SD(unsigned char cmd,unsigned long address) //**************************************************************************** {
unsigned char tmp; unsigned char retry=\SD_Disable();
SPI_TransferByte(0xFF); SD_Enable();
SPI_TransferByte(cmd); //将32位地址进行移位作为地址字节 SPI_TransferByte(address>>24); SPI_TransferByte(address>>16); SPI_TransferByte(address>>8); SPI_TransferByte(address); SPI_TransferByte(0xFF); SPI_TransferByte(0xFF);
do{
tmp = SPI_TransferByte(0xFF); //发送8个时钟接受最后一个字节 retry++;
}while((tmp==0xff)&&(retry<8)); return(tmp); }
//****************************************************************************
// 写一个扇区(512Byte) to MMC/SD-Card //如果写完成返回TRUE
unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer) //**************************************************************************** {
unsigned char temp; unsigned int i;
SPI_TransferByte(0xFF); //延迟8个时钟 SD_Enable(); //开片选
temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr<<9); //发送写扇区命令
if(temp != 0x00) {
SD_Disable(); return(temp); }
SPI_TransferByte(0xFF); SPI_TransferByte(0xFF); SPI_TransferByte(0xFE); for (i=0;i<512;i++) {
SPI_TransferByte(*Buffer++); //发送512字节数据 }
//CRC-Byte
SPI_TransferByte(0xFF); //Dummy CRC SPI_TransferByte(0xFF); //CRC Code
temp = SPI_TransferByte(0xFF); //读SD卡运行响应
if((temp & 0x1F)!=0x05) //如果最后4位为0101,为操作成功。否则为操作失败。 {
SD_Disable();
return(WRITE_BLOCK_ERROR); //返回错误 }
while (SPI_TransferByte(0xFF) != 0xFF); SD_Disable();
return(TRUE); //返回成功 }
//****************************************************************************
// 读512字节 from MMC/SD-Card //如果成功返回TRUE
unsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer) //**************************************************************************** {
unsigned char temp; unsigned int i; unsigned char data; SPI_TransferByte(0xff); MMC_Enable();
temp = Write_Command_SD(SD_READ_BLOCK,addr<<9);//发送读扇区命令 if(temp != 0x00) {
SD_Disable();
return(READ_BLOCK_ERROR); //返回错误号 }
while(SPI_TransferByte(0xff) != 0xfe); for(i=0;i<512;i++) {
data = SPI_TransferByte(0xff); //存数据 *Buffer++=data; }
SPI_TransferByte(0xff); //读CRC码 SPI_TransferByte(0xff); //读CRC码 SD_Disable();
return(TRUE); //返回成功 }
//**************************************************************************
// 查找数据开始标志(预设DATASTART)根据实际需要删改
//**************************************************************************
unsigned long SD_find(void) {
unsigned long tmp=%unsigned char data[512]; do {
SD_read_sector(tmp,data); //从0扇区开始查找
tmp++; //查找DATASTART
}while(!((data[0]=='D')&&(data[1]=='A')&&(data[2]=='T')&&(data[3]=='A')&&(data[4]=='S')&&(data[5]=='T')&&(data[6]=='A')&&(data[7]=='R')&&(data[8]=='T'))); return tmp; //返回开始标志的下一个扇区 }
//************************************************************************** // 发送一个字节
//**************************************************************************
unsigned char SPI_TransferByte(unsigned char byte) {
SPDR = byte;
while (!(SPSR & 0x80)); //检测线路是否空闲 return SPDR; }
//************************************************************************** // 主程序例子
//************************************************************************** void main(void) {
unsigned long temp; unsigned char data[512];
unsigned char data2[512]={'sssssssssssssssssssssssss'}; unsigned char comm1[]={'/r/nhello world/r/n'}; unsigned char comm2[]={'/r/nSD_INIT OK/r/n'}; uart0_init();
SD_Port_Init(); //端口初始化 if(SD_Init()== 0x01)