gdam999 发表于 2024-7-18 22:51

单片机读SD卡兼容性差,是怎么回事?大师帮我看看代码哪里问题?

购买了20个128MSD卡,单片机可以读的了其中的10个,另外10个读不出来,读不出来卡初始化都是正常的。读不出来的基本上是在这段代码这里跳出或者停住,帮我看看这段代码什么地方需要改进。

ucharSD_Read_Sector(ulong addr , uchar *buffer)
{//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
        uint i;
        uchar retry,temp;
        uchar cmd17[]={0x51,0x00,0x00,0x00,0x00,0xFF}; //CMD17的字节序列
        addr <<= 9;                 //sector = sector * 512           将块地址(扇区地址)转为字节地址
        cmd17 = ((addr & 0xFF000000) >> 24);
        cmd17 = ((addr & 0x00FF0000) >> 16);
        cmd17 = ((addr & 0x0000FF00) >> 8);
        //cmd17 = ((addr & 0x000000FF) >> 0);//可以省去
        //CLR_SD_CS;                                                        //打开片选

        retry = 0;
        do
        {
                temp = SD_Write_Com(cmd17);                 //写入CMD17
                retry++;
                if(retry > 250)                                         //最大重试次数250
                {
                        SD_CS=1;
                        return(1);                                                 //读块失败
                }
        }while(temp != 0);   
        while (SPI_RW(0XFF) != 0xfe);         //一直读,当读到0xfe时,说明后面的是512字节的数据了
        for(i=0;i<512;i++)                               //将数据写入到数据缓冲区中
        {       
                buffer = SPI_RW(0XFF);
        }
        SPI_RW(0XFE);
        SPI_RW(0XFE);                                         //读取两个字节的CRC校验码,不用关心它们
        SD_CS=1;                                        //SD卡关闭片选
        SPI_RW(0xFF);                                        //按照SD卡的操作时序在这里补8个时钟
        SPI_MOSI=1;                                //没数据时SD_MI应保持为高电平
        return 0;                                                //返回0,说明读扇区成功
}

gdam999 发表于 2024-7-18 22:53

while (SPI_RW(0XFF) != 0xfe);      有些时候就停在这段代码这里

gdam999 发表于 2024-7-18 22:54

所有的卡读0扇区是没有问题的,就是读指定扇区的时候出问题
页: [1]
查看完整版本: 单片机读SD卡兼容性差,是怎么回事?大师帮我看看代码哪里问题?