- UID
- 852722
|
//***********************LCD显示函数************************************
Void Lcd_display()
{
Unsigned Char I,J;
Lcd_init();
For(I=0;I<3;I++) //一共3字节数据
{
Write(Lcd[I]); //查表获取数据并调用写一个字节数据函数送LCD显示
For(J=0;J<5;J++) //延时一段时间(主要是为了控制显示的速度)
{Delay();}
}
}
//****************写一字节函数***************************
Unsigned Char SPI_WriteByte(Unsigned Char Val)
{
SPI2BUF = Val; //待发送数据装载到发送寄存器
While(!IFS1bits.SPI2IF); //等待发送完成
IFS1bits.SPI2IF=0; //清除发送完成标志位
Return SPI2BUF; //读取接收寄存器(即使是无效数据也需清空)
}
//****************接收一字节函数**************************
Unsigned Char SPI_ReadByte(Void)
{
SPI2BUF = 0xff; //发送寄存器装载数据,以启动数据接收
While(!IFS1bits.SPI2IF); //等待接收完成
IFS1bits.SPI2IF=0; //清除接收完成标志位
Return SPI2BUF; //读取接收到的数据
}
//*****************发送命令函数****************************
Unsigned Char SD_SendCommand(Unsigned Char Cmd,Unsigned Long Arg)
{
Unsigned Char R1;
Unsigned Char Retry1=0; //重复操作次数
Cs=0; //使能片选信号
SPI_WriteByte(Cmd | 0x40); //分别写入命令
SPI_WriteByte(Arg>>24); //数据段第4字节
SPI_WriteByte(Arg>>16); //数据段第3字节
SPI_WriteByte(Arg>>8); //数据段第2字节
SPI_WriteByte(Arg); //数据段第1字节
SPI_WriteByte(0x95); //CRC效验和
While((R1 = SPI_WriteByte(0xff)) == 0xff)//等待响应
If(Retry1++ > 200) Break;//超时退出
Cs=1; //清初片选信号
Return R1; //返回状态值
}
//*******************SD开初始化函数**************************
Unsigned Char Sd_reset()
{
Unsigned Char I,Tmp;
Unsigned Char Retry; //重复次数
Unsigned Char R1=0;
Retry=0;
Delay();
Delay();
Do
{
For(I=0;I<100;I++) SPI_WriteByte(0xff);
R1 = SD_SendCommand(0,0);//发Idle命令
Retry++;
If(Retry>20) Return 1; //超时退出
} While(R1 != 0x01); //等待IDLE命令返回
Retry = 0;
Cs=0;
Do
{
For(I=0;I<100;I++) SPI_WriteByte(0xff);
R1 = SD_SendCommand(1, 0); //发Active命令
Retry++;
If(Retry>254) Return 1; //超时退出
} While(R1);
For(I=0;I<100;I++) SPI_WriteByte(0xff);
R1 = SD_SendCommand(59, 0); //关Crc
If (R1) Return 1; //返回不正确,退出初始化
For(I=0;I<100;I++) SPI_WriteByte(0xff);
R1 = SD_SendCommand(16, 512); //设扇区大小512
If(R1!=0) Return 1; //返回不正确,退出初始化
Return 0; //正常返回
} |
|