OpenEdv-开源电子网

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

51模拟SPI读写SD卡,连初始化都没成功,求帮忙

[复制链接]

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-8-23
在线时间
5 小时
发表于 2013-8-26 11:52:38 | 显示全部楼层 |阅读模式

 时序跟程序都对过了,没发现错误,求高手指点,一般SD卡的进入SPI模式都是怎样的啊?网上找过很多程序,试过了,还是不行,还有些是有错误的程序。

下面是我自己写的。
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#include "lcd12864.h"
#define reset_ERROR 0x01
#define init_ERROR 0x02
sbit MISO=P2^0;   
sbit SCK=P2^1;
sbit MOSI=P2^2;
sbit CS=P2^3;

void delayus(uint a)
{
    while(--a);
}
void SPI_write(uchar dat)
{
 uchar a;
 for(a=0;a<8;a++)
 {
  SCK=0;
  MOSI=dat&0x80;
  SCK=1;
  delayus(5); 
  dat<<=1;
 }
}
uchar SPI_read()
{
 uchar a,dat;
 for (a=0;a<8;a++)
 {
  SCK=0;
  delayus(5);
  SCK=1;
                                 
 
  dat<<=1;
  dat|=MISO; 
 
 }
 return dat;
}
uchar  SD_write_cmd(uchar *s)
{
 uchar a,status,time=0;
 for(a=0;a<6;a++) SPI_write(s[a]);

 do
 {
  status=SPI_read();
  time++;
 }
 while(time<100&&status!=0x01);
 return status;
}

          
uchar reset_SD()

 uchar a,status;
 uchar restcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};//初始化指令
 CS=1;
 for(a=0;a<10;a++)SPI_write(0xff);//至少74个时钟
 ys(10);
 CS=0;
 do
 {
 status=SD_write_cmd(restcmd);//写初始化指令
  a++;
 if(a==200)
 {
 CS=1;
 return reset_ERROR; //写入超时
 }
 }
 while(status!=0x01);
 SPI_write(0xff);//额外加多八个时钟
  CS=1;
  return 0;
}


void main()
{
 uchar a;
 initial_lcd();   //初始化液晶屏
 clear_screen();   //清屏函数
 display_text("reseting...",0,0,2,0); //lcd显示
 a=reset_SD();
 if(a==0)display_text("OK!      ",0,0,2,0); //进入spi模式成功
 if(a==reset_ERROR)display_text("reset_ERROR",0,0,2,0);//进入失败
 while(1);

}
每次都失败!

我即狂澜,且无法被力挽
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-26 14:59:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-8-23
在线时间
5 小时
 楼主| 发表于 2013-8-26 16:42:07 | 显示全部楼层

我又改了一下。还是不行,哪里出了问题,用的是SD卡模块插座 
#include "reg51.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
#include "lcd12864.h"
#define reset_ERROR 0x01
#define init_ERROR 0x02
sbit MISO=P2^0;   
sbit SCK=P2^1;
sbit MOSI=P2^2;
sbit CS=P2^3;

void SPI_write(uchar dat)
{
 uchar a;
 for(a=0;a<8;a++)
 {
  SCK=0;
  MOSI=dat&0x80;
  SCK=1;
  delayus(5); 
  dat<<=1;
 }
}
uchar SPI_read()
{
 uchar a,dat;
 for (a=0;a<8;a++)
 {
  SCK=0;
  delayus(5);
  SCK=1;
                                 
 
  dat<<=1;
  dat|=MISO; 
 
 }
 return dat;
}
uchar  SD_write_cmd(uchar *s)
{
 uchar a,status,time=0;
 for(a=0;a<6;a++) SPI_write(s[a]);

 do
 {
  status=SPI_read();
  time++;
 }
 while(time<100&&status!=0x01);
 return status;
}

          
uchar reset_SD()

 uchar a,status,time;
 uchar restcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};//初始化指令
 CS=1;
 for(a=0;a<100;a++)
 {
  SCK=0;
  ys(5);
  SCK=1;
  ys(5);
 }
 CS=0;

 
 for(time=0;time<200;time++)
 {  for(a=0;a<6;a++)SPI_write(restcmd[a]);
  for(a=0;a<100;a++)
  { 
   status=SPI_read();
  if(status==0x01)break;
  }
  if(status==0x01)break;
  else if(time==199)return reset_ERROR;
 }
 CS=1;
 return 0;
}


void main()
{
 uchar a;
 initial_lcd();   //初始化液晶屏
 clear_screen();   //清屏函数
 display_text("reseting...",0,0,2,0);
 a=reset_SD();
 if(a==0)display_text("OK!      ",0,0,2,0);
 if(a==reset_ERROR)display_text("reset_ERROR",0,0,2,0);
 while(1);
 {
 }
}

我即狂澜,且无法被力挽
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 17:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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