wushicu 发表于 2010-7-23 19:03:55

sd卡sd模式读写

我的写单块程序如下:时序我仔细看过了,都没问题,crc16校验也正确,就是写不进去。求高手路过
指点迷津。。。。
bool SD_write_block(alt_u32 block_num , alt_u8 *buff)
{
    int i,j;
    alt_u8 rsp,data,crc_status=0;
    alt_16 crc,crc0;
    alt_u32 addr;
   
    SD_DAT_OUT;
   
    Ncc();
      addr = block_num * 512;
      cmd_buffer = cmd24; // CMD24: Read Single Block
      cmd_buffer = (addr >> 24 ) & 0xFF; // MSB
      cmd_buffer = (addr >> 16 ) & 0xFF;
      cmd_buffer = (addr >> 8 ) & 0xFF;
      cmd_buffer = addr & 0xFF; // LSB
      send_cmd(cmd_buffer);
      Ncr();
   
    rsp = response_R(1);
    if(rsp > 1)
    {printf("rsp fail !\n");
      return FALSE;
    }
    else
      printf("rsp right !\n");
   
    Ncc();
    SD_CLK_LOW;   //start bit = 0
    SD_DAT_LOW;
    SD_CLK_HIGH;

    for(i=0;i<512;i++)
    {
      data = buff;
      for(j=0;j<8;j++)
      {
            SD_CLK_LOW;
            if(data & 0x80)
            SD_DAT_HIGH;
            else
            SD_DAT_LOW;
            SD_CLK_HIGH;
            data <<= 1;
      }
    }
    crc = cal_crc(buff , 512);
    printf("crc :: %x \n",crc);
    crc0 = 0;
    for(i=0;i<16;i++)
    {
      SD_CLK_LOW;
         crc0 <<=1;
      if(crc & 0x8000)
      {
            SD_DAT_HIGH;
            crc0 |= 0x0001;
      }
      else
            SD_DAT_LOW;
      SD_CLK_HIGH;
      crc <<= 1;
      
    }
    printf(" crc0 : %x \n" , crc0);
   
    SD_CLK_LOW;
    SD_DAT_HIGH;
    SD_CLK_HIGH;
   
    Ncc();
   
    SD_DAT_IN;
    i = 0;
    while(1)
    {
      SD_CLK_LOW;
      SD_CLK_HIGH;
      if((SD_TEST_DAT & 0x01)== 0)
         break;
      i++;
      if(i>500)
      {
            printf(" there is not data rsp!\n");
            break;
      }
    }
   
    for(i=0;i<8;i++)
    {
      SD_CLK_LOW;
      SD_CLK_HIGH;
      crc_status <<= 1;
      if((SD_TEST_DAT & 0x01))
         crc_status |= 0x01;
    }
    printf("crc_status : %d \n" , crc_status);
   
    for(i=0;i<16;i++)
    {
      SD_CLK_LOW;
      SD_CLK_HIGH;
    }
    return TRUE;
}

withoutwing 发表于 2010-7-24 09:30:19

你把printf注释掉试试,之前我也在程序里用了它,会影响到程序的。

wushicu 发表于 2010-7-24 23:17:26

回复 2# withoutwing


嘿嘿!~~谢谢捧场!我的问题今天已经解决了。。。。。跟printf()无关。。。还是时序问题。。。详情请看:http://www.myfpga.org/discuz/viewthread.php?tid=36161&extra=page%3D1

WPZAC 发表于 2010-7-25 09:52:50

回复 3# wushicu


    这个我也弄了几天了一直出不来数据,可否把你的主函数(main.c)和sd读部分(SDCardDriver.c)与(SDCardDriver.h),这三个文件给我吗?我急用呢。参照友晶的范例做了,可是读不出来数据好郁闷呢,帮帮我了。谢谢啊!!!我的邮箱是:183196792@qq.com。

wushicu 发表于 2010-7-25 11:58:59

回复 4# WPZAC


    直接用友晶提供的源代码,不会有任何问题,刚开始,我的也读不出来,弄了很多天,最后我从新做了硬件部分,然后在nios ii里面直接调用初始化函数和读模块函数,就可以读出来了。先检查你的硬件配置,再检查你的主函数。再就是你在sopc部分要加入JTAG,printf()函数才能有输出显示。

WPZAC 发表于 2010-7-25 13:17:36

回复 5# wushicu


    真是解我一时之急啊,非常感谢。我用DE0做sd卡,友晶提供的是DE0_NIOS_SDCARD。
1.我只要移植代码就可以了吗???
2.硬件部分要重新做????

感谢啊,谢谢。

wushicu 发表于 2010-7-25 18:13:34

回复 6# WPZAC


    你的硬件有没有问题我就不知道了,硬件有问题的话就重新做。我不知道你编程能力怎么样。。。
还有代码移植可不是直接复制粘贴啊!!!要根据你的硬件引脚的宏定义来改
友晶提供的源代码,如果你system.h文件里面的宏定义全部和友晶的一样,直接复制粘贴就行。。。
页: [1]
查看完整版本: sd卡sd模式读写