SD卡基础原理及读写程序(3)

2019-06-05 14:42

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)


SD卡基础原理及读写程序(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:家用轿车上牌注意事项

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: