dsPIC33系列单片机实现SD卡的复位

2019-07-15 23:00发布

一下是我的复位程序,返回值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个填充时钟


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。