微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > dsPIC33系列单片机实现SD卡的复位

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

时间:10-02 整理:3721RD 点击:
一下是我的复位程序,返回值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个填充时钟

路过学习的。

发现还是IO口的连接问题,在这里提醒大家,单片机的IO一定要连接到SD卡的OI……当时大意了

我感觉的线路都没有问题的啊

sdgadfgdfhfghwsfgfdsfgasdfg

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top