3157|1

2

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

atmega32 读写sd卡的问题,请大侠指导 [复制链接]

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

#define SETCS PORTB|=(1< #define CLCS PORTB&=~(1< 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< _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< DDRB|=(1< DDRB&=~(1< DDRB|=(1< SPCR|=(1< SETCS;
}
void spihispd(void)
{
SPCR|=(0< SPSR|=(1< }
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卡主要函数段,请高手帮忙分析下,到底是什么原因,谢谢

最新回复

没有弄过SD卡  详情 回复 发表于 2013-5-21 23:12
点赞 关注
 

回复
举报

3404

帖子

6

TA的资源

裸片初长成(初级)

沙发
 
没有弄过SD卡
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表