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

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

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

//***********************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; //正常返回

}
返回列表