hugang0120 发表于 2010-3-1 11:14:44

关于msp430驱动sd卡的问题

网上都说,sd卡的一个扇区是512B,但我通过读csd寄存器,为1024B,是错的吗?
我有一个sd卡的写扇区的程序,但应答信息总为出错,程序如下:
uchar write_sd_sector(unsigned long addr,uchar *Buffer)
{
   uchar reply,retry=0;
   uint i;
   uchar CMD[]={0x58,0x00,0x00,0x00,0x00,0xFF};
   addr=addr<<10;                         //addr = addr * 512
   CMD = ((addr & 0xFF000000) >>24 );
   CMD = ((addr & 0x00FF0000) >>16 );
   CMD = ((addr & 0x0000FF00) >>8 );
   retry=0;
   do
   {
      reply=write_cmd(CMD);   //为了可靠写入,写100次
      retry++;
      if(retry==100)
      {
      return(reply);      //send commamd Error!
      }
   }
   while(reply!=0);
   for(i=0;i<20;i++)      //在写之前先产生20个时钟信号
   {
   read_byte();
   }
   write_byte(0xFE);
   for (i=0;i<1024;i++)    //现在可以写入1024个字节
   {
      write_byte(*Buffer++);
   }
   write_byte(0xFF);         //Dummy CRC
   write_byte(0xFF);      //CRC Code
   write_byte(0xFF);
   reply=read_byte();       //read response
   if((reply&0x1F)!=0x05)   // 写入的1024个字节是未被接受
   {
   dis_sd();
   while(read_byte()!=0xff){};
   return(reply);      //Error!
   }
   while(read_byte()!=0xff){};
   dis_sd();         //
   return(3);            //写入成功
}
void write_byte(uchar data)
{
   TXBUF_0=data;        
   while(!(IFG1&UTXIFG0));
}
uchar read_byte(void)
{
   uchar data=0xff;
   TXBUF_0=0xff;
   while(!(IFG1&URXIFG0));
   data=RXBUF_0;
   return(data);
}
uchar write_cmd(uchar *cmd)
{
   uchar data=0xff,retry=0;
   dis_sd();
   write_byte(0xff);
   en_sd();
   for(uchar i=0;i<6;i++)
      write_byte(cmd);
// data=read_byte();
   do
   {
       data=read_byte();
       if(retry++>=200)
          break;
   }
   while(data==0xff);
   return data;
   
}
请高手指点一下。

pitolan 发表于 2010-3-1 20:04:33

以下蓝色文字由版主:pitolan 于:2010-03-01,20:04:33 加入。<font color=black>请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:四轴飞行DIY论坛
即将移去的分区:MSP430
移动执行时间:自本贴发表0小时后
任何的疑问或咨询,请可随时联系站长。谢谢你的支持!</font>

Icyan 发表于 2010-3-5 12:00:36

不止是SD卡,貌似硬盘之类的存储器,一个扇区都是512吧?连续写1024肯定会出错
如果已经格式化为FAT,在读取BPB信息时,要注意结构体对齐

另:1、SD卡上电后要进行初始化的
   2、单片机做SD控制一般是SPI总线。发送CMD命令前,要先拉低CS信号,发送完毕后,要拉高CS
   3、不是写数据之前产生20个时钟信号,而是拉低CS后,发送CMD之前就要产生空闲时钟信号,方便卡完成内部操作,而且,20个好象不够,具体多少忘了,不过我做的是30个
   

不知你的“应答信息出错”是什么意思,建议看一下SD卡控制的时序:)

Timor 发表于 2015-6-25 14:17:10

楼主调通了么
借份源码学习学习
760594750@qq.com
页: [1]
查看完整版本: 关于msp430驱动sd卡的问题