首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SD卡读写C语言源程序(3)

SD卡读写C语言源程序(3)

//********************写一个扇区**************************

Unsigned Char SD_WriteSingleBlock(Unsigned Long Sector)

{

Unsigned Char R1;

Unsigned Int I;

Unsigned Char Retry=0;

Do

{

For(I=0;I<100;I++) SPI_WriteByte(0xff);

  R1 = SD_SendCommand(24, Sector<<9);//写命令

  Retry++;

  If(Retry>10) Return 1; //超时退出

} While(R1 != 0x00);

Cs=0;




SPI_WriteByte(0xff);

SPI_WriteByte(0xff);

SPI_WriteByte(0xff);

SPI_WriteByte(0xff);

SPI_WriteByte(0xff);

SPI_WriteByte(0xff);

SPI_WriteByte(0xfe); //发开始符




For(I=0; I<512; I++) //送512字节数据

{

If(I<255) SPI_WriteByte(I); //发送0--255

  Else SPI_WriteByte(512-I); //发送255--0



}




SPI_WriteByte(0x95);

SPI_WriteByte(0x95); //16-Bits CRC

R1 = SPI_WriteByte(0xff); //读响应位

If(Retry++ >10) Return 1; //超时退出

While(!((R1&0x0f)==5)); //等待数据成功接受返回信息

While(!(SPI_WriteByte(0xff))); //等待SD卡内部编程完成



Return 0;

}



//******************读SD卡一个扇区************************

Unsigned Char SD_ReadSingleBlock(Unsigned Long Sector)

{

Unsigned Char R1,Temp;

Unsigned Int I,J;

Unsigned Char Retry=0;

Do

{

  R1 = SD_SendCommand(17, Sector<<9);//读命令

  Retry++;

  If(Retry>10) Return 1; //超时退出

} While(R1 != 0x00);

Cs=0;

While(SPI_WriteByte(0xff)!= 0xfe) //等待接收到开始字节

{

If(Retry++ >100) Return 1; //超时退出

}

For(I=0; I<512; I++) //读512个数据

{

  Temp = SPI_WriteByte(0xff); //读取接收到的数据

Lcd[0]=(Temp/100)+48;

Lcd[1]=((Temp%100)/10)+48;

Lcd[2]=((Temp%100)%10)+48;

Lcd_display(); //读取数据送显示

For(J=0;J<500;J++) {Delay();}

}

SPI_WriteByte(0xff); //伪16-Bits Crc

SPI_WriteByte(0xff);




Cs=1;

Return 0;

}

//***********************延时程序*************************

Void Delay() //延时程序

{

Int I; //定义整形变量

For(I=0x100;I--;); //延时

}

//************************主函数**************************

Int Main(Void)

{

Unsigned Char Loop,Res;

Delay();

Delay();

Delay();

Loop=1;



Cs=1;

While(Loop)

{

Spi_init(); //调用系统初始化函数

Res= Sd_reset(); //调用SD卡初始化函数

If(Res) Break; //SD卡初始化是否正常,不正常,退出循环,不执行下面的读写操作

SD_WriteSingleBlock(1); //调用写SD卡单BLOCK函数,其中扇区号为1

If(Res) Break;

SD_ReadSingleBlock(1); //调用读SD卡单BLOCK函数,其中扇区号为1

If(Res) Break;

Loop=0;

While(1);

}

While(1);

}
返回列表