OpenEdv-开源电子网

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

SD卡SPI模式初始化及后续读写问题

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-5-3
在线时间
2 小时
发表于 2016-5-3 15:57:58 | 显示全部楼层 |阅读模式
1金钱
本人用的是普通IO口模拟了下SPI模式,用手头上的几张microSD卡套进大的SD卡槽再连接的单片机,按SD协议的初始化流程编好了程序,发现CMD0+CMD8都是正常的,然后后面的CMD55(回复0X01正常)+ACMD41(R1=0xE0(HCS=0)或者R1=0xE1),就初始化不下去了。有一张卡能够正常初始化,然后用CMD17读扇区的的时候R1=0x05有问题,还有一张卡CMD17后回复字节连续好几个0x00后一直变0xff,正常不应该是几个0xff后0x00,然后几个0xff后0xfe接着数据吗,求看下哪里有问题
下面是程序
void SD_spi_write(unsigned char x)
{
  unsigned char i,j;
  
  for(i=0;i<8;i++)
  {
    j=(x<<i)&0x80;
    j=j>>7;
    if(j==0x01)    //依次向数据写入线P1.1写入8位,一个字节数据
      P1OUT|=BIT1;
    else
      P1OUT&=~BIT1;
    SD_CLK_low;//下降沿写入
    if(is_init) delay(delaytime);//用于初始化、复位时降速
    SD_CLK_high;
    if(is_init) delay(delaytime);//用于初始化、复位时降速
  }
  MOSI_Set;
}
写字节
unsigned char SD_spi_read()
{
  unsigned char temp=0;
  unsigned int i;
  //P1OUT|=BIT2;//SPI_DO,芯片输出脚置高
  MOSI_Set;
  for(i=0;i<8;i++)
  {
    SD_CLK_low;//下降沿
    //if(is_init) delay(delaytime);
    if((P1IN&BIT2)==BIT2)
      temp|=(0x80>>i);//读出数据
    if(is_init) delay(delaytime);
    SD_CLK_high;//时钟上升沿
    if(is_init) delay(delaytime);
  }
  return(temp);
}
写命令
unsigned char SD_Write_Cmd(unsigned char CMD,unsigned long arg)   //向SD卡中写入命令,并返回回应的第二个字节  
{   
   unsigned char res,n;   
   unsigned char time=0;     
   SD_CS_high;   //禁止SD卡片选  
   SD_spi_write(0xFF);      //发送8个时钟信号
   SD_CS_low;      //使能SD卡片选
   SD_spi_write(0xFF);
   /* 发送命令包 */
   SD_spi_write(CMD);
   SD_spi_write((unsigned char)(arg>>24));
   SD_spi_write((unsigned char)(arg>>16));
   SD_spi_write((unsigned char)(arg>>8));
   SD_spi_write((unsigned char)arg);
   n = 0x01;       /* Dummy CRC + Stop */
   if (CMD == CMD0) n = 0x95;   /* Valid CRC for CMD0(0) */
   if (CMD == CMD8) n = 0x87;   /* Valid CRC for CMD8(0x1AA) */
   SD_spi_write(n);
   //SD_spi_read(); //获得16位的回应 read the first byte,ignore it.   
   do   
   {   
      res = SD_spi_read();   //读取后8位
      time++;   
   }   
   while((res==0xff)&&(time<TRY_TIME)); //写命令是否成功   
   return(res);   
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-5-3
在线时间
2 小时
 楼主| 发表于 2016-5-3 17:02:07 | 显示全部楼层
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-5-3
在线时间
2 小时
 楼主| 发表于 2016-5-4 20:25:36 | 显示全部楼层
怎么没有人呢 原子哥呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-4 20:55:36 | 显示全部楼层
TF卡对SPI模式支持很不好,基本上大部分TF卡都不支持SPI模式了。。。换SDIO模式,或者换大卡试试。
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2016-5-4 21:41:46 | 显示全部楼层
正点原子 发表于 2016-5-4 20:55
TF卡对SPI模式支持很不好,基本上大部分TF卡都不支持SPI模式了。。。换SDIO模式,或者换大卡试试。

膜拜大神
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 15:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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