打印
[Cortex-M0技术交流]

读SD卡一直无法读取到0XFE这个起始字节!

[复制链接]
3016|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvyunhua|  楼主 | 2015-1-15 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用的新华龙单片机C8051F060,采用模拟SPI总线,初始化SD卡成功;初始化程序如下所示:
uchar MMC_SD_init(void)
{
uchar i;
uchar retry;
uchar r1=0;
uchar type=0;   
SFRPAGE = CONFIG_PAGE;

SPI_SD = 0;   
retry = 0;
do
{
  for(i=0;i<20;i++) SPI_Write(0xFF);
  r1 = MMC_SD_SendCmd(0, 0); //发送COM0,需要返回0x01
  WDTCN = 0xA5;        
  retry++;
  if(retry > 200) return (type=0x01);
}while(r1!=0x01);           
retry = 0;
    do
    {
     r1 = MMC_SD_SendCmd(8, 0); //发送COM8,查询SD卡版本号;若返回0x01说明此卡版本2.0;若返回0x05则为版本1.0  
  WDTCN = 0xA5;      //发送COM58获取SD卡电压参数
    retry++;
    if(retry > 100) return (type=0x01);      
    }while((r1!=0x01)&&(r1!=0x05)); //||r1!=0x05 &&(r1!=0x09)
retry = 0;
do
{
  r1 = MMC_SD_SendCmd(55, 0); //发送COM55,需要返回0x01      
  if(r1 == 0x01)               
  {
   r1 = MMC_SD_SendCmd(41,0); //发送COM41,需要返回0x00   
   if(r1 == 0x00) type = 0x10;  
  }
     else
  {                           
   r1 = MMC_SD_SendCmd(1,0);
        if(r1 == 0x00) type = 0x20;     
  }
  WDTCN = 0xA5;
     retry++;
     if(retry > 200) return (type=0x01);   
}while(r1!=0x00);  
  SPI_Read(0xFF);  
r1 = MMC_SD_SendCmd(59, 0); //发送COM59是否进行CRC校验,发送COM38擦除所选择的块;发送COM24单块写命令,返回0x00,      
r1 = MMC_SD_SendCmd(16, 512); //COM16设置块长度默认正式传输的数据长度是512字节,COM17单块读取命令,返回0x00,      
               
SPI_SD = 1;
return type;     
}

函数返回值为0X10;且读取的SD卡版本号r1=0x01即为2.0卡

然后读取SD卡第一块数据,函数如下所示:
//---------------------------------------------------
//读取单个扇区数据;512字节
//---------------------------------------------------
uchar MMC_SD_ReadSingleBlock(ulong sector,uchar *buffer)
{
uchar r1;
uint i;
SFRPAGE = CONFIG_PAGE;
SPI_SD = 0;
r1 = MMC_SD_SendCmd(17, sector<<9); //COM16设置块长度,COM17单块读取命令,返回0x00,   
if(r1 != 0x00) return r1;
while(SPI_Read(0xFF) != 0xFE)       //这里一直读取不到0xfe???
{
  WDTCN = 0xA5;
}   
for(i=0; i<512; i++)      
{
  *buffer++ = SPI_Read(0xFF);
}
SPI_Write(0xFF);      
SPI_Write(0xFF);
SPI_SD = 1;
return 0;
}

主程序上电初始化SD卡能返回0x10说明成功了,
然后2秒后读取第0块数据,一直死在循环while(SPI_Read(0xFF) != 0xFE) 这里了,读出来的一直是0xFF.想请教各位兄弟姐妹原因在那里?

相关帖子

沙发
lvyunhua|  楼主 | 2015-1-22 12:31 | 只看该作者
怎么没有人来看下问题,再说下,和SD卡共SPI总线(片选分别控制)的外部FLASH可以正常读写.说明SPI时序是正确的,而且SD卡初试化成功了.到底是什么原因呢?

使用特权

评论回复
板凳
lvyunhua|  楼主 | 2015-1-22 12:32 | 只看该作者
怎么没有人来看下问题,再说下,和SD卡共SPI总线(片选分别控制)的外部FLASH可以正常读写.说明SPI时序是正确的,而且SD卡初试化成功了.到底是什么原因呢?

使用特权

评论回复
地板
lvyunhua|  楼主 | 2015-3-20 11:30 | 只看该作者
已经解决了,初始化驱动函数写的有问题。

使用特权

评论回复
5
杨爱林林| | 2016-4-8 17:10 | 只看该作者
版主  你的帖子应该放在st版区  那里人很多

使用特权

评论回复
6
lvyunhua|  楼主 | 2016-4-9 13:39 | 只看该作者
恩,可是不是ST的芯片

使用特权

评论回复
7
fansghaung12345| | 2016-10-18 11:52 | 只看该作者
具体哪地方的错误呢,我也遇到这问题了,能否告知参考下

使用特权

评论回复
8
lvyunhua|  楼主 | 2016-10-18 13:47 | 只看该作者
SD卡初始化驱动函数有问题。

使用特权

评论回复
9
xydzx| | 2016-10-29 10:41 | 只看该作者
大家好,打扰一下,信盈达开设有:嵌入式、安卓、Java、单片机、PCB、FPGA、ARM、C语言、电子等课程,全部免费试听。北京,郑州,深圳南山、民治、西乡、广州、南宁七大中心同时开课
有需要的请回复联系方式+试听课程QQ:3026827905  
微信:17778038831

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:工程师是科学家,工程师是艺术家,工程师也是思想家。

2826

主题

8196

帖子

25

粉丝