搜索
bottom↓
回复: 3

关于msp430驱动sd卡的问题

[复制链接]

出0入0汤圆

发表于 2010-3-1 11:14:44 | 显示全部楼层 |阅读模式
网上都说,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[1] = ((addr & 0xFF000000) >>24 );
   CMD[2] = ((addr & 0x00FF0000) >>16 );
   CMD[3] = ((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;
   
}
请高手指点一下。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2010-3-1 20:04:33 | 显示全部楼层
以下蓝色文字由版主:pitolan 于:2010-03-01,20:04:33 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[1025]四轴飞行DIY论坛
即将移去的分区:[3064]MSP430
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>

出0入0汤圆

发表于 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卡控制的时序:)

出0入0汤圆

发表于 2015-6-25 14:17:10 | 显示全部楼层
楼主调通了么
借份源码学习学习
760594750@qq.com
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 21:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表