首页 | 供应信息 | 采购信息 | PDF资料 | 技术资料 | 行业资讯 | 产品展示 | 人才市场 进入会员区
   技术文章分类:单片机/DSP 嵌入式系统 测试仪表 电源技术 接口电路 存储器 传感与控制 通信网络 无线通信 模拟技术 显示与光电 EDA/PLD 汽车电子 消费电子 电子综合
   电子综合工具:PDF资料大全 电子缩略语 IC型号替换 IC厂家 电子电路图 技术参数 设计应用 解决方案
技术资料 行业资讯 PDF资料 IC价格 IC替换 缩略语 IC供应 IC采购
  您所在的位置: IC37首页 > 技术问答 > 单片机 > 做过SD卡读写的高手请进;麻烦斑竹移到【嵌入式系统】,谢谢

  做过SD卡读写的高手请进;麻烦斑竹移到【嵌入式系统】,谢谢 

玩SD卡过程中,读操作和擦除基本搞定。在写扇区命令的调试过程中遇到问题始终无法解决;数据始终无法写入扇区。SD卡为SANDISK 16M。CPU为ATMEGA16,JTAG仿真器。程序如下:

.................

.................

unsigned char mmc_write_sector(unsigned long sector, char *buffer)

{

char cmd[] = {0x58, 0x00, 0x00, 0x00, 0x00,0xFF};//CMD24 ----写命令24

char temp256[256] = {0};//该数组用于观察卡返回数据

unsigned char i=0;

unsigned char res=0x00;//-----SD卡返回的数据

sector = sector << 9;//----每个扇区512字节

cmd[1] = (sector & 0xFF000000) >> 24;//----扇区地址

cmd[2] = (sector & 0x00FF0000) >> 16;

cmd[3] = (sector & 0x0000FF00) >> 8;

if (mmc_write_cmd(cmd) != 0x00) {//--向卡发送写扇区命令;如果返回非0,则说明有故障发生;

MMC_DESELECT;//去掉SD卡片选信号

return(1);//---有故障发生

}

(经过仿真到此处观察,卡返回数据为0,没有问题)

for (i=0;i<255;i++) {//---延时,等待SD卡,准备发送数据

mmc_send_byte(0xFF);

}

mmc_send_byte(0xFE);//---发送起始字节

for (i=0;i<512;i++) {//---发送扇区数据

mmc_send_byte(*buffer++);

}

//---发送CRC位,没有CRC用0XFF填充

mmc_send_byte(0xFF);

mmc_send_byte(0xFF);

//----延时等待卡的写操作完成,按照手册需要用ACMD命令看卡是否忙来判断写入是否完成

//----这里用长延时代替判断;并且尝试过将这里的延时成倍增加,数据依然写不进去

for(i=0;i<255;i++){

mmc_send_byte(0xFF);

temp256[i]=SPDR;

}

for(i=0;i<255;i++){

mmc_send_byte(0xFF);

temp256[i]=SPDR;

}

for(i=0;i<255;i++){

mmc_send_byte(0xFF);

temp256[i]=SPDR;

}

for(i=0;i<255;i++){

mmc_send_byte(0xFF);

temp256[i]=SPDR;

}

for(i=0;i<255;i++){

mmc_send_byte(0xFF);

temp256[i]=SPDR;

}

for(i=0;i<255;i++){

mmc_send_byte(0xFF);

temp256[i]=SPDR;

}

}

..................................................

..................................................

void main(void)

{

unsigned long sector_count;

char test = 0X55;

char temp[512] = {0};

char temp_cmd[] = {0x40, 0x00, 0x00, 0x00, 0x00};

..................................................

..................................................

mmc_read_cid(temp);

mmc_read_csd(temp);//仿真观察数据均能正常读出

mmc_read_sector(0,temp);//正常,数据为“...MSDOS5.0...”云云

mmc_read_sector(1,temp);//正常

mmc_read_sector(2,temp);

mmc_read_sector(3,temp);

mmc_read_sector(4,temp);

mmc_read_sector(55,temp); //可以看到正常数据,该扇区为FAT12下第一个数据扇区

mmc_erase(0,100);//测试擦除命令,并为写扇区做准备。擦除0~100扇区

mmc_read_sector(0,temp);//正常,数据擦除为“000000....”

mmc_read_sector(1,temp);

mmc_read_sector(2,temp);

mmc_read_sector(3,temp);

mmc_read_sector(4,temp);

mmc_read_sector(55,temp);//正常,数据为“000000....”

temp[1] = temp[2] = temp[3] = 0xa5;

mmc_write_sector(55,temp);//将TEMP中的数值写入55扇区;仿真器将此步骤执行完成之后,将sd卡取出用读卡器读出,发现55

........................//扇区一般为全0xff;偶尔会有几个A,Q之类字符;数据始终无法正常写入

.........................

不知道哪里出了问题?

补充一下,SD卡没有问题;除了调试,俺还当U盘用。


作者:bigbenben  2005-8-11 15:31:00

  回复1  作个CF卡的读写,寄存器好用应该就好用了啊66604

能给我发个SD卡的资料吗?谢谢

isoar@163.com


作者:isoar  2005-8-11 20:15:00

  回复2  ok,资料会mail给你66605

可是我的写扇区操作也是按照sd卡的命令时许写的,实在搞不懂问题出现在哪里。


作者:bigbenben  2005-8-12 9:08:00

  回复3  注意一点66606

如果你使用windows下的某些工具如WinHex等工具读卡,好像工具读出的扇区号和sd卡的物理扇区号并不一样。

因此,如果你要验证是否写入,最好还是用单片机读出你写入的那个扇区来验证。


作者:tanghuihua  2005-8-12 14:47:00

  回复4  谢谢楼上,两种方法都试了66607

害怕有这样的情况出现,一般在写完扇区后都有一个mmc_read_sector();

还好,我这里pc读和单片机读都是一样的


作者:bigbenben  2005-8-12 15:27:00

  回复5  偶来顶一下,判高手现身赐教66608

偶来顶一下,判高手现身赐教
作者:bigbenben  2005-8-15 8:48:00

  回复6  顶一下,希望斑竹看到给换个板块看看66609

顶一下,希望斑竹看到给换个板块看看
作者:bigbenben  2005-8-19 13:12:00


我要投稿 注册会员
客服咨询热线:0755-26000950 0755-26007355
 相关技术问答
·ARM仿真器哪个好点  2005-8-11
·示波器的触发方式是什么概念?  2005-8-11
·请问对一未知周期的周期信号..  2005-8-11
·MB90092应用  2005-8-11
·请教用51汇编怎么把8位A..  2005-8-11
·关于AT89C2051的问..  2005-8-11
·请教一下“RC充放电测温”..  2005-8-11
·各位大虾看看我的这个系统开..  2005-8-11
·用89c2051模拟I2C..  2005-8-11
·关于ZLG7290的问题.  2005-8-11
·能说说pld和单片机的区别..  2005-8-11
·求助单片机学习板的选择!  2005-8-11
·求GBK码编码规则  2005-8-11
·觅无锡电子设计高人为师  2005-8-11
·做单片机还是做通信?请大家..  2005-8-11
·问题不知道怎么解决,问几个..  2005-8-11
·很怪的问题?TC35为什么..  2005-8-11
·请问大侠们“哪位遇到过AT..  2005-8-11
·请教用可控硅控制风扇的档位  2005-8-11
·西安铭朗科技推出C8051..  2005-8-11
·motorola hc90..  2005-8-11
·如何用状态机思想写单片机多..  2005-8-11
·找液晶模块  2005-8-11
·关于TNT4882这一系列..  2005-8-11
·请教各位:如何用C语言吧一..  2005-8-11
 
 热门IC
74S253PC  PMB2851EV1.3  HIP75001SE  HI9P0549-9  HD7447AP  8304  UPB202D  TA8619P  AM386TMDX-40  27C160-100  30389  TMS27PC512-2NL  TMP86CS43F-3J98  LT1815  TA8865BN  STV9212  LZ9GR12  KS5313R  LP2987IMX-2.5  78L05ACD  SI9183DT-25-T1  2SJ561-TD  QFBR-2557  GLZ20C  LC7471-8763  CY2305SI-T1  UPD703030BGC-017-8EU  3313J-1-102E  XC6368B102MR  H16105DF  2SK1400A  2SK600  2SK732  2SK2287  2SK1501  2SK1777  2SK2183  2SK463  2SK2212  2SK1433  2SK1422  2SK2075  2SK2223  2SK824  2SK876  2SK750  2SK990  2SK3049  SN74ALS576BDW  APM9435