玩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 |