二、软件部分
软件中INI_FLAG为设置的一个标志位,通过置1该位可以控制发送或接受数据速度。因为在初始化阶段SD卡操作需要适当放缓,而初始化成功后可以加快数据传动速率。
1>往SD卡写一个字节
void SD_WRITE(unsigned char daima) //往SD写一个字节
{unsigned char i;
for(i=0;i<8;i++)
{
SD_CLK=0;
if(INI_FLAG)delayNOP();
SD_DI=(daima&0x80)>>7;//注意先发送高位
SD_CLK=1;
if(INI_FLAG)delayNOP();
daima<<=1;
}
SD_DI=1;
}
2>从SD读一个字节
unsigned char SD_READ()//从SD读一个字节
{unsigned char n=0,i;
SD_DO=1;//将单片机引脚接口读打开
for(i=0;i<8;i++)
{
n<<=1;//先接受高位
SD_CLK=0;
if(INI_FLAG)delayNOP();
SD_CLK=1;
if(INI_FLAG)delayNOP();
if(SD_DO)n|=1;
}
return n;
}
3>延时函数
void delayNOP()
{
_nop_();//需要在头文件中加入#include <intrins.h>
_nop_();
_nop_();
_nop_();
}
4>写入一个完整指令
unsigned char SD_CMD(unsigned char command,unsigned long address,unsigned char crc)//往SD写完整命令
{unsigned char argument1,argument2,argument3,argument4,i,temp;
SD_CS=1;
SD_WRITE(0xFF);//在命令结束后可以加入8个时钟,在写下个命令时就能实现此效果
SD_CS=0;
argument4=address;
argument3=(unsigned char)(address>>8);
argument2=(unsigned char)(address>>16);
argument1=(unsigned char)(address>>24);
SD_WRITE(command);
SD_WRITE(argument1);
SD_WRITE(argument2);
SD_WRITE(argument3);
SD_WRITE(argument4);
SD_WRITE(crc);
SD_READ();
do
{ i++;
temp=SD_READ();
}while((temp==0XFF)&&(i<100));
*******************************************************************************************************************(1)
return(temp);
}
5>RESET 命令
unsigned char SD_RST()//SD 卡复位,进入SPI 模式,使用
{
unsigned char i,time,temp;
TP_CS=1;******************************************************************************************************(2)
INI_FLAG=1; //将INI_FLAG 置为1,以减慢读写速度
SD_CS=1; //设置起始状态**********************************************************************************(3)