求助;51单片机SD卡读取模块读取不出来内容

暑假想做一个lcd12864的badapple,现在显示器能单独显示,但SD卡中的内容读不出来,不清楚是什么原因,可能是程序出错了,也有可能是SD卡出错了,扇区什么物理地址和逻辑地址都试过了就是不能显示动画,显示器能单独显示应该不是这上面的问题。大一小白求大神帮忙看看是不是程序出问题了,还是其他方面的问题

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int 

uchar ints;	 //初始化变速标志

sbit cs =P1^7;
sbit di =P1^6;	 //sd卡数据输入
sbit clk=P1^5;
sbit d0=P1^4;	//SD卡数据输出

//uchar xdata table[512];

//错误代码//
#define cmd0	0x01
#define cmd1	0x02
#define sdw		0x03   //sd写错误
#define sdr		0x0f  //sd读错误


void delay2(uint z)
{
  while(z--);
}

//***************************************************************************************//
//*********************************spi驱动**********************************************//
void spi_w(uchar dat)		//写数据
{
 uchar i;
 for(i=0;i<8;i++) { if(dat&0x80) di="1;" else clk="0;" if(ints) delay2(10); 初始化的时候时钟速度要慢 dat<<="1;" } uchar spi_r(void) 读数据 temp="0,j;" d0="1;" for(j="0;j<8;j++)" return (temp); *********************************spi驱动********************************************** *************************************************************************************** *********************************sd卡驱动********************************************** sd_com(uchar *com) i,temp,time="0;" cs="1;" spi_w(0xff); for(i="0;i<0x06;i++)" 写命令 spi_w(*com++); spi_r(); do 读到有返回 time++; while((temp="=0xff)&&(time<100));" return(temp); sd_reset() time,temp,i; cmd[]="{0x40,0x00,0x00,0x00,0x00,0x95};" ints="1;//开启初始化延时" {spi_w(0xff);} time="0;" 写cmd0 if(time>=200)
		{return(cmd0); }
	}while(temp!=0x01);


	cs=1;
	spi_w(0xff);
	return 0;
}

uchar sd_int()
{
	uchar time,temp;
	uchar cmd[]={0x41,0x00,0x00,0x00,0x00,0xff};
	cs=0;
	time=0;
	do
	{
		temp=sd_com(cmd);
		time++;
		if(time==100)
		  {return(cmd1);}
	}while(temp!=0)	;
	ints=0;	
	cs=1;
	spi_w(0xff);
	return 0;
}	 


uchar sd_w(unsigned long add,uchar *bu)
{
	uchar temp,time;
	uint i;
	uchar cmd[]={0x58,0x00,0x00,0x00,0x00,0xff};//cmd24
	add<<=9; 等于add*512 扇区地址转换为字节地址 cmd[1]="((add&0xff000000)">>24);
	cmd[2]=((add&0x00ff0000)>>16);
	cmd[3]=((add&0x0000ff00)>>8);
	cs=0;
	time=0;
	do
	{
		temp=sd_com(cmd);
		time++;
		if(time==100)
		{return(0xff);}
	}while(temp!=0);

//	for(i=0;i<100;i++) 插入若干clk {spi_r();} spi_w(0xfe); 写数据的开头 for(i="0;i<512;i++)" { spi_w(*bu++); } spi_w(0xff); 两个crc校验 temp="spi_r();" if((temp & 0x1f)!="0x05)" cs="1;" return(sdw); while(spi_r()!="0xff);" 一直读到sd卡向flash写完数据 spi_w(0xff) ; return(0); uchar sd_r(unsigned long add,uchar *buf) time,temp; uint j; cmd[]="{0x51,0x00,0x00,0x00,0x00,0xff};//cmd17" add<<="9;//" 等于add*512 扇区地址转换为字节地址 cmd[1]="((add&0xff000000)">>24);
	cmd[2]=((add&0x00ff0000)>>16);
	cmd[3]=((add&0x0000ff00)>>8);
	cs=0;
	time=0;
	do
	{
		temp=sd_com(cmd);
		time++;
		if(time==100)
		{return(sdr);}
	} while(temp!=0);  //说明命令写入成功


	while(spi_r()!=0xfe);//读到数据的开头

	for(j=0;j<512;j++) { *buf++="spi_r();" } spi_r(); 读2个crc cs="1;" spi_w(0xff); return (0); }< code></512;j++)></100;i++)></=9;></8;i++)>


来自:电子信息 / 电子技术
3
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
drzzm32
6年5个月前 IP:四川
848595

XXXXXXXXXXXXXXXXXX/NSDN/NGV/blob/master/cortex/firmware/ngv-sys/Drivers/NGV/sd.c

这里有STM32的驱动代码,参考了Arduino等的SD卡驱动,SD卡麻烦的是初始化。

方便起见可以考虑用Arduino做,不然文件读写还要加入fatfs

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
Robot_V1
6年5个月前 IP:内蒙古
848601

先检查硬件连接是否正确(比如MOSI和MISO不能交叉连接),然后检查SPI程序是否存在问题。确认无误后检查时钟极性和相位是否设置正确,必要时可用示波器观察单片机相应的I/O。然后尝试存储、读出少量数据,如果不行就表明未成功初始化。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}