一下是我的复位程序,返回值r1总是等于0,求解……谢谢
/*写一个字节函数*/
u8 SpiWriteByte(u8 TxData)
{
SPI1BUF = TxData; //待发送数据装载待发送寄存器中
while(!SPI1STATbits.SPITBF); //等待发送完成
return SPI1BUF;
}
/*发送命令函数*/
u8 SdSendCommand(u8 cmd, u32 arg, u8 crc)
{
u8 num, r1 = 0;
SpiWriteByte(cmd | 0x40); //写入序列号
SpiWriteByte(arg >> 24); //数据段第4个字节
SpiWriteByte(arg >> 16); //数据段第3个字节
SpiWriteByte(arg >> 8); //数据段第2个字节
SpiWriteByte(arg); //数据段第1个字节
SpiWriteByte(crc); //CRC校验和
num = 0;
while((r1 = SpiWriteByte(0xFF)) == 0xFF) //等待响应
{
if(num++ >= 20)
{
break; //超时退出
}
}
return r1; //返回状态位
}
/*SD卡的初始化*/
u8 SdInit(void)
{
u8 i,
time, r1 = 0;
/*SD卡复位,进入SPI模式,使用CMD0*/
cs = 1; //发送74个时钟之前要禁止SD卡
for(i = 0; i < 10; i ++) //在向SD卡发送数据之前,必需先SD发送至少74个时钟
{
SpiWriteByte(0xFF); //发送了80个时钟
}
/*发送CMD0进行复位*/
time = 0;
cs = 0;
do
{
r1 = SdSendCommand(0, 0, 0x95); //写入CMD0
time ++; //用来计时是否超时
}while((r1 != 0x00) && (time < 200));
if(time >= 200)
{
return (INIT_CMD0_ERROR); //CMD0写入失败
}
cs = 1;
SpiWriteByte(0xFF); //写入指令后附加8个填充时钟
}
评分
查看全部评分
一周热门 更多>