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的。 展开
/*********************************************************************************
-读取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的。 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询