OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3085|回复: 5

原子哥 SPI模式下SD卡驱动 疑惑

[复制链接]

7

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-7
在线时间
13 小时
发表于 2016-3-8 20:49:20 | 显示全部楼层 |阅读模式
1金钱
问题1:
void SD_SPI_Init(void)
{
          GPIO_InitTypeDef  GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);         //ê1ÄüPB¶Ë¿úê±Öó

    //éèÖÃó2¼téÏóëSD¿¨Ïà1ØáaμÄ¿ØÖÆòy½Åêä3ö
        //±üÃaNRF24L01/W25Q32μèμÄó°Ïì
        //Õaà&#239B12oíPG7à-¸ß,êÇÎaáË·àÖ1ó°ÏìFLASHμÄéÕD′.
        //òòÎaËûÃÇ12óÃò»¸öSPI¿ú.

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                 //PB12 íÆíì
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_12);                                                 //PB12éÏà-
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //PD2 íÆíì
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        GPIO_SetBits(GPIOD,GPIO_Pin_2);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 //PG7 íÆíì
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        GPIO_SetBits(GPIOG,GPIO_Pin_7);
                         
        SPI2_Init();                                      //àïÃæμļ«DÔoíÏàλ£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿
        SD_CS=1;
}

该函数中SPI2_Init();代码中
PI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //Ñ¡ÔñáË′®DDê±ÖóμÄÎèì¬:ê±ÖóDü¿Õ¸ß
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //êy¾Y2¶»ñóúμú¶t¸öê±ÖóÑØ      
的根据在SD卡协议哪里?找不着,麻烦给指下,谢谢
******************************************************************************************************
问题2:
u8 SD_Initialize(void)
{
    u8 r1;      // ′æ·ÅSD¿¨μÄ·μ»ØÖμ
    u16 retry;  // óÃà′½øDD3¬ê±¼Æêy
    u8 buf[4];  
        u16 i;

        SD_SPI_Init();                //3õê¼»ˉIO
        SD_SPI_SpeedLow();        //éèÖÃμ½μíËùģ꽠                           //???????????????????????????
        for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//·¢&#203;í×&#238;éù74&#184;&#246;&#194;&#246;3&#229;
        retry=20;
        do
        {
                r1=SD_SendCmd(CMD0,0,0x95);//&#189;&#248;è&#235;IDLE×′ì&#172;
        }while((r1!=0X01) && retry--);
        SD_Type=0;//&#196;&#172;è&#207;&#206;T&#191;¨
        if(r1==0X01)
        {
                if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0
                {
                        for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);        //Get trailing return value of R7 resp
                        if(buf[2]==0X01&&buf[3]==0XAA) //卡是否支持2.7~3.6V         //?????????????
                        {
                                retry=0XFFFE;
                                do
                                {
                                        SD_SendCmd(CMD55,0,0X01);        //·¢&#203;íCMD55
                                        r1=SD_SendCmd(CMD41,0x40000000,0X01);//·¢&#203;íCMD41
                                }while(r1&&retry--);
                                if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//&#188;&#248;±eSD2.0&#191;¨°&#230;±&#190;&#191;aê&#188;
                                {
                                        for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);//μ&#195;μ&#189;OCR&#214;μ
                                        if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;    //&#188;ì2éCCS
                                        else SD_Type=SD_TYPE_V2;   
                                }
                        }

  ......
if(buf[2]==0X01&&buf[3]==0XAA)  的判断语句应该是对照着读出来的OCR写的吧,感觉并不支持所说的2.7-3.6电压范围,麻烦解释下,谢谢?
********************************************************************************************************************
问题3:
SD_TYPE_V2HC  表示高容量SD卡
SD_TYPE_V2      表示标准SD卡

.......
if(retry&&SD_SendCmd(CMD58,0,0X01)==0)/
                                {  //判断是哪种卡
                                        for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);//μ&#195;μ&#189;OCR&#214;μ
                                        if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;    //&#188;ì2éCCS
                                        else SD_Type=SD_TYPE_V2;   
.......



u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
        u8 r1;
        if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址  //????????????????
        if(cnt==1)
        {
                r1=SD_SendCmd(CMD17,sector,0X01);
                if(r1==0)
                {
                        r1=SD_RecvData(buf,512);
                }
        }else
        {
                r1=SD_SendCmd(CMD18,sector,0X01);
                do
                {
                        r1=SD_RecvData(buf,512);
                        buf+=512;  
                }while(--cnt && r1==0);        
                SD_SendCmd(CMD12,0,0X01);         
        }   
        SD_DisSelect();
        return r1;
}

中的if(SD_Type!=SD_TYPE_V2HC) sector <<= 9;为什么要判断是不是SD_TYPE_V2HC类型,再转换为字节地址,而不是直接转换,难道SD_TYPE_V2不需要转换为字节地址吗?

最佳答案

查看完整内容[请看2#楼]

看SD卡白皮书,你就明白了.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-8 20:49:21 | 显示全部楼层
看SD卡白皮书,你就明白了.
回复

使用道具 举报

7

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-7
在线时间
13 小时
 楼主| 发表于 2016-3-10 09:04:15 | 显示全部楼层
正点原子 发表于 2016-3-8 20:49
看SD卡白皮书,你就明白了.

SD卡白皮书  是不是SD卡的2.0协议呢???
回复

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-3-10 09:05:11 | 显示全部楼层
这个也在做,保持关注一下
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-3-10 11:11:15 | 显示全部楼层
SDHC卡因为可能超过4GB,超出32位寻址范围,所以它的地址是需要除512的
回复

使用道具 举报

7

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-7
在线时间
13 小时
 楼主| 发表于 2016-3-10 21:23:54 | 显示全部楼层
yyx112358 发表于 2016-3-10 11:11
SDHC卡因为可能超过4GB,超出32位寻址范围,所以它的地址是需要除512的

我没说清楚  那个参数sector是指扇区号,不是具体地址
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 06:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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