查看: 3911|回复: 9

[求助] KL26 通过SPI读SD卡,初始化失败

[复制链接]
  • TA的每日心情
    开心
    2021-8-2 08:37
  • 签到天数: 591 天

    连续签到: 1 天

    [LV.9]以坛为家II

    2

    主题

    848

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2682
    最后登录
    2021-11-29
    发表于 2016-12-29 11:45:08 | 显示全部楼层 |阅读模式

    通过SPI读SD卡时发SD_CMD55+SD_ACMD41命令。SD_CMD55第一次返回1,SD_ACMD41返回1,发第二次时SD_CMD55返回0,
    初始化失败退出,初始化部分代码如下,求指点这是什么原因

    INT8U SD_Init(void)
    {
            INT16U i;
            INT16U u16Cnt;
            INT8U  u8Sta;
            INT8U  u8Buf[4];
            INT8U  u8Buffer[512];
            sd_type = 0x00;

            SPI_LowSpeed();
           
            // 取消片选
            sd_Disable_Select();

            // 等待SD稳定
            MyDelay(100);  

            // 至少发送74个时钟,
            for(u16Cnt = 0; u16Cnt < 11; u16Cnt++)
            {
                    sd_ReadWriteByte(0xff);
            }

            u16Cnt = 200;
            do
            {
                    u8Sta = sd_send_cmd(SD_CMD0, 0, 0x95);
                    u16Cnt--;
            } while((u8Sta != 0x01) &&(u16Cnt));

            if(u16Cnt == 0)
            {
                    sd_Disable_Select();
                    //SD卡复位失败
                    return 1;
            }
            u8Sta = sd_send_cmds(SD_CMD8, 0x1AA, 0x87);

            if(u8Sta == 0x01)
            {
                    for(i = 0; i < 4; i++)
                    {
                            u8Buf = sd_ReadWriteByte(0xff);
                    }

                    if((u8Buf[2] == 0x01)&&(u8Buf[3] == 0xAA))
                    {
                            //支持2.7V到3.6V电压
                            u16Cnt = 0xffff;
                            do
                            {
                                    u8Sta = sd_send_cmds(SD_CMD55, 0, 0xff);
                                    if(u8Sta != 0x01)
                                    {
                                            return 1;//在此处退出,u8Sta返回的值为0
                                    }
                                    u8Sta = sd_send_cmds(SD_ACMD41, 0x40000000, 0xff);
                            }while(u8Sta && u16Cnt);
                           
                            u8Sta = sd_send_cmds(SD_CMD58, 0, 0);
                            if(u8Sta != 0x00)
                            {
                                    sd_Disable_Select();
                                    return 1;
                            }

                            for(i = 0; i < 4; i++)
                            {
                                    u8Buf = sd_ReadWriteByte(0xff);
                            }
                            sd_Disable_Select();
                            if(u8Buf[0] & 0x40)
                            {
                                    //card is V2.0 SDHC
                                    sd_type = SD_TYPE_V2HC;
                            }
                            else
                            {
                                    //card is V2.0
                                    sd_type = SD_TYPE_V2;
                            }
                            while(sd_send_cmds(SD_CMD16, 512, 0xff) != 0);
                            SPI_HighSpeed();
                            sd_send_cmds(SD_CMD9, 0, 0xff);
                    }
                    else
                    {
                            sd_Disable_Select();
                            return 1;
                    }
            }
            else
            {
                    sd_type = SD_TYPE_V1;
                    sd_send_cmds(SD_CMD55, 0, 0xff);
                    u8Sta = sd_send_cmds(SD_ACMD41, 0, 0xff);

                    if(u8Sta <= 1)
                    {
                            //card is V1.0
                            sd_type = SD_TYPE_V1;
                            u16Cnt = 0xffff;
                            do
                            {
                                    sd_send_cmds(SD_CMD55, 0, 0xff);
                                    u8Sta = sd_send_cmds(SD_ACMD41, 0, 0xff);
                                    u16Cnt--;
                            }while(u8Sta && u16Cnt);
                    }
                    else
                    {
                            //card is MMC
                            sd_type = SD_TYPE_MMC;
                            u16Cnt = 0xffff;
                            do
                            {
                                    u8Sta = sd_send_cmds(SD_CMD1, 0, 0xff);
                                    u16Cnt--;
                            }while(u8Sta && u16Cnt);
                    }
                    if((u16Cnt==0) || (sd_send_cmds(SD_CMD16, 512, 0xff) !=0 ))
                    {
                            sd_type = SD_TYPE_ERR;
                            sd_Disable_Select();
                            //设置块长度失败
                            return 1;
                    }
                    SPI_HighSpeed();
            }
            if(SD_ReadSingleSectors(u8Buffer, 0))
            {
                    //读扇区失败
                    return 1;
            }
            if((u8Buffer[0] == 0xeb) || (u8Buffer[0] == 0xe9))
            {
                    u32gLogicSector = 0;
            }
            else
            {
                    //物理扇区转换为逻辑扇区,因为文件系统操作是从逻辑扇区操作的
                    u32gLogicSector = u8Buffer[454] + u8Buffer[455] * 0x100 + u8Buffer[456] * 0x10000 + u8Buffer[457] * 0x1000000;
            }
            sd_Disable_Select();
            return 0;
    }


    我知道答案 目前已有9人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2016-12-29 12:55:09 | 显示全部楼层
    楼主你好!
    请先参考下我这篇文章:
    https://www.nxpic.org.cn/module/forum/thread-604619-1-1.html
    以及里面相关代码。
    如果还有问题,欢迎进一步交流。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7909
    最后登录
    2025-4-11
    发表于 2016-12-29 12:55:20 | 显示全部楼层
    直接跑例程不就好了。如果历程跑不通,就说明硬件有问题
    来根华子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-12-29 13:08:42 | 显示全部楼层
    混森蓝兽 发表于 2016-12-29 12:55
    直接跑例程不就好了。如果历程跑不通,就说明硬件有问题

    对头                        
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-8-2 08:37
  • 签到天数: 591 天

    连续签到: 1 天

    [LV.9]以坛为家II

    2

    主题

    848

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2682
    最后登录
    2021-11-29
     楼主| 发表于 2016-12-29 14:25:32 | 显示全部楼层
    附上SD卡接线图,中间有个SD卡切换芯片

    SD卡接线图.zip

    137.24 KB, 下载次数: 9, 下载积分: 威望 1

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-8-2 08:37
  • 签到天数: 591 天

    连续签到: 1 天

    [LV.9]以坛为家II

    2

    主题

    848

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2682
    最后登录
    2021-11-29
     楼主| 发表于 2016-12-29 14:27:39 | 显示全部楼层
    小恩GG 发表于 2016-12-29 12:55
    楼主你好!
    请先参考下我这篇文章:
    https://www.nxpic.org.cn/module/forum/thread-604619-1-1.html

    是跟这块代码一样的套路,开发板上跑得挺欢的,在我自己的板子上就不行了,我把SD卡接线图也上传了,帮忙看看
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-8-2 08:37
  • 签到天数: 591 天

    连续签到: 1 天

    [LV.9]以坛为家II

    2

    主题

    848

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2682
    最后登录
    2021-11-29
     楼主| 发表于 2016-12-29 14:29:17 | 显示全部楼层
    混森蓝兽 发表于 2016-12-29 12:55
    直接跑例程不就好了。如果历程跑不通,就说明硬件有问题

    跑的是例程,在开发板上跑是OK的,在自个板上跑不过,我也不知是否硬件有问题,SD卡接线图上传了,帮忙看看
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2016-12-29 15:23:12 | 显示全部楼层
    冰雪流川 发表于 2016-12-29 14:27
    是跟这块代码一样的套路,开发板上跑得挺欢的,在我自己的板子上就不行了,我把SD卡接线图也上传了,帮忙 ...

    你用的是SPI方式通信的吧。
    那么你要看看你KL26链接到你的SD卡卡座有没有连错。
    1脚:CS
    2:MOSI
    3:VSS
    4:VDD
    5:CLK
    6:VSS
    7:MISO
    8,9 不用
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-8-2 08:37
  • 签到天数: 591 天

    连续签到: 1 天

    [LV.9]以坛为家II

    2

    主题

    848

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2682
    最后登录
    2021-11-29
     楼主| 发表于 2016-12-30 11:00:34 | 显示全部楼层
    小恩GG 发表于 2016-12-29 15:23
    你用的是SPI方式通信的吧。
    那么你要看看你KL26链接到你的SD卡卡座有没有连错。
    1脚:CS

    是SPI方式,SPI0用在其它功能上了,SD卡的操作用的是SPI1,KL26到SD卡卡座的连线没问题,之前CLK没上拉,给改为上拉了,也还是不行。系统时钟,板子上的晶振大小跟开发板的也都一样。现在完全一脸懵逼中……
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25450
    最后登录
    2025-9-4
    发表于 2017-1-3 10:17:10 | 显示全部楼层
    冰雪流川 发表于 2016-12-30 11:00
    是SPI方式,SPI0用在其它功能上了,SD卡的操作用的是SPI1,KL26到SD卡卡座的连线没问题,之前CLK没上拉, ...

    如果有逻辑分析仪,或者4通道示波器,建议你测试下你那边SD卡的相关引脚波形,至少先测试下波形是否正确。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-6 18:36 , Processed in 0.114016 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表