- UID
- 852722
|
//********************写一个扇区**************************
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);
} |
|