51单片机读写SD卡程序,在读扇区的时候有错误,无法读出,请高人指点,万分感谢! 5

程序如下:/*******************************************************************************... 程序如下:
/*********************************************************************************
-读取addr扇区的512个字节到buffer指向的数据缓冲区
- 参数说明:addr:扇区地址
buffer:指向数据缓冲区的指针
*********************************************************************************/
unsigned char SD_read_sector(unsigned long addr,unsigned char *buffer)
{
unsigned int j;
unsigned char temp,time = 0;
unsigned char pcmd[]={0x51,0x00,0x00,0x00,0x00,0xff};

addr<<=9;

pcmd[1]=((addr&0xff000000)>>24);//将字节地址写入到CMD17字节序列中
pcmd[2]=((addr&0x00FF0000)>>16);
pcmd[3]=((addr&0x0000FF00)>>8);
CS = 0;

do
{
temp = SD_Write_Cmd(pcmd);
time++;
if(time == TRY_TIME)
{
return(READ_BLOCK_ERROR);
}
}while(temp != 0);
while(SD_spi_read() != 0xFE); printf("ok");
for(j = 0;j < 512;j++)
{
buffer[j] = SD_spi_read();
}
SD_spi_read();
SD_spi_read(); // 读取两个字节的CRC校验码,不用关心它们
CS = 1;
SD_spi_write(0xff);
return (0);
}
主函数如下:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include"spi.h"
#include"disp.h"

#define ADDR 80 //要操作的SD卡的扇区地址

sbit LED=P0^3; //如果测试成功,此IO上连接的二极管被点亮

unsigned char xdata pbuf[512]; //数据缓冲区

void main()
{
int i=0;
int j = 0;
unsigned char flag=0;

init_disp();
printf("串口设置完毕\n");

SD_Reset(); //复位SD卡
printf("SD卡复位完毕\n");
SD_init(); //初始化SD卡
printf("SD卡初始化完毕\n");

for(i=0;i<512;i++)
{
if(i<256)
{
pbuf[i]=i; //向数据缓冲区中写入0~255 0~255,共512个字节
}
else
{
pbuf[i]=i-255;
}
}
printf("向缓冲区中装入完毕\n");

SD_write_sector(ADDR,pbuf);//将数据缓冲区中的512个字节的数据写入SD卡的第ADDR扇区中
printf("写 SD卡扇区完毕\n");

/* for(i=0;i<512;i++) //清空数据缓冲区
pbuf[i]=0;
printf("清空缓冲区完毕\n"); */

SD_read_sector(ADDR,pbuf);//从SD卡的第ADDR扇区中读取512个字节的数据到数据缓冲区
printf("读 SD卡扇区完毕\n");

for(i=0;i<512;i++)
{
if(((unsigned char)i)!=pbuf[i]) //对读出的数据进行匹配,如果不吻合则flag=1,否则flag=0
{
flag=1;
break;
}
}
printf("匹配完毕\n");

if(flag)
{
LED=1; //发光二极管灭
printf("SD卡扇区读写测试失败!\n"); //数据不吻合
}
else
{
LED=0; //发光二极管点亮
printf("SD卡扇区读写测试成功!\n"); //数据吻合
}
while(1);
}
在unsigned char SD_read_sector(unsigned long addr,unsigned char *buffer)函数里有句printf("ok")是用来测试的,程序走到那就出问题,ok打印不出来,也就是说等不到0xFE,会是太慢了吗,我晶振是11.0592M的。
展开
 我来答
我爱你梁浩啊
2011-04-19
知道答主
回答量:2
采纳率:0%
帮助的人:0
展开全部
AS
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
『ポ』
2011-04-20
知道答主
回答量:79
采纳率:0%
帮助的人:0
展开全部
sd
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式