atmega32 读写sd卡的问题,请大侠指导

2019-03-24 20:40发布

本人因刚学AVR,水平有限,现在想用Atmega32 的spi模式进行sd卡的读写操作,目前先进行简单的读写不加文件系统啥的,就是先把SD卡看做单片机的存储器,进行读写,网上看到的例子基本都差不多,试着改了个例程,但是基本读写根本没反应,读和写的程序返回都是0,现在也不知道是硬件有问题还是软件出的问题,也不知道如何验证,一时没有了头绪,请大侠给指导下,下面是我的程序:

#define SETCS PORTB|=(1<<PB4)
#define CLCS PORTB&=~(1<<PB4)
uchar blockbuff[7]={1,1,3,4,5,6};
uchar blockbuff0[512];
uchar blockbuff1[512];
uchar blockbuff2[512];

uchar spi_send(uchar data)//SPI传输一个字节
{
uchar t;
SPDR=t;
while(!(SPSR&(1<<SPIF)))
_delay_us(1);
//t=SPSR;
t=SPDR;
return t;
}
uchar mmc_write_command(uchar *cmdframe)
{
uchar i=0,k=0,temp=0xFF;
SETCS;
spi_send(0xFF);
CLCS;
_delay_ms(1);
for(i=0;i<6;i++)
{
spi_send(*(cmdframe++));
}
while(temp==0xFF)
{
temp=spi_send(0xFF);
if(k++>200)
{
return temp;
}
}
return temp;
}

void spi_init()
{
DDRB|=(1<<PB4);
DDRB|=(1<<PB5);
DDRB&=~(1<<PB6);
DDRB|=(1<<PB7);
SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
SETCS;
}
void spihispd(void)
{
SPCR|=(0<<SPR1)|(0<<SPR0);
SPSR|=(1<<SPI2X);
}
uchar mmc_init(void)
{
uint timeout=0;
uchar i=0;
uchar cmd[]={0x40,0x00,0x00,0x00,0x00,0x95};
_delay_ms(500);
for(i=0;i<16;i++)
{
spi_send(0xFF);
}
if(mmc_write_command(cmd)!=0x01)//cmd0
return 0;
cmd[0]=0x41;
cmd[5]=0xFF;
while(mmc_write_command(cmd)!=0x00)//cmd1
{
if(timeout++>0xFFFE)
return 0;
}
spihispd();
return 1;
//}
}
uchar mmc_cid(void)
{
uchar i;
uchar cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
cmd[0]=0x40+10;
if(mmc_write_command(cmd)!=0x00)
return 0;
for(i=0;i<16;i++)
spi_send(0xff);
return 1;
}

uchar mmc_read(ulong address)
{
uint i;
//clear_cmd();
uchar temp;
uchar cmd[]={0x40,0x00,0x00,0x00,0x00,0xFF};
cmd[0]=0x40+17;
address=address<<9;
cmd[1]=(address>>24);
cmd[2]=(address>>16);
cmd[3]=(address>>8);
cmd[4]=(address>>0);
if(mmc_write_command(cmd)!=0x00)
//blockbuff1[0]=0x18;
return 0;
while(spi_send(0xFF)!=0xfe)
{
_delay_us(1);
  }
for(i=0;i<512;i++)
blockbuff1=spi_send(0xFF);
//blockbuff1[0]=0x22;
spi_send(0xFF);  
spi_send(0xFF);
return 1;
}
uint mmc_write_block(ulong address,uchar *buffer)
{
uint i;
uchar temp;
uchar cmd[]={0x40,0x00,0x00,0x00,0x00,0xFF};
cmd[0]=0x40+24;
address=address<<9;
cmd[1]=(address>>24);
cmd[2]=(address>>16);
cmd[3]=(address>>8);
cmd[4]=(address>>0);

if(mmc_write_command(cmd)!=0x00)
return 0;
spi_send(0xFF);
spi_send(0xFE);
for(i=0;i<512;i++)
spi_send(blockbuff0);
spi_send(0xFF);
spi_send(0xFF);
temp=spi_send(0xFF);
temp=temp&0x1F;
if(temp!=0x05)
return 0;
while(spi_send(0xFF)==0x00)
{
_delay_us(1);
}
return 1;
}

省略lcd12864显示等函数



int main(void)//主函数
{
ulong i;
uchar error_flag;
uchar dd;
//DDRB=0xFD;
//PORTB=0x0A;
SETLIGHT;
LCD12864Init();
spi_init();
_delay_ms(100);
mmc_init();
while(1)
{
for(i=0;i<512;i++)
blockbuff0=0x88;
if(mmc_write_block(0,blockbuff0))//向0扇区写入数据0x88
{
LCD_write_string(0,1,"1");//如果成功返回1
}
else
{
LCD_write_string(0,1,"0");
}
if(mmc_read(0))//读取0扇区数据
{
LCD_write_string(0,2,"1");//如果成功显示1
}
else
{
LCD_write_string(0,2,"0");//不成功显示0
}
dd=blockbuff1[0];//lcd12864显示读取扇区的第一个数据
buffshow2[0]=dd/100+0x30;
buffshow2[1]=dd/10%10+0x30;
buffshow2[2]=dd%10+0x30;
LCD_write_string(0,3,buffshow2);//lcd12864显示读取扇区的第一个数据
}
return 0;
}

以上是SD卡主要函数段,请高手帮忙分析下,到底是什么原因,谢谢 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
jishuaihu
1楼-- · 2019-03-25 00:58
没有弄过SD卡

一周热门 更多>