MyFPGA Forum

 找回密码
 注册
搜索
查看: 16202|回复: 30
打印 上一主题 下一主题

SD,初步读写成功!大家分享!!当然了SD模式

[复制链接]
跳转到指定楼层
1#
发表于 2010-5-18 08:22:59 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
今天一来实验室,按照时序又走了一遍,一不小心,成功了,我内心的喜悦不知道该如何表达,只能是和大家共享来分享这一刻的心情。见代码(并参考注释):
//-------------------------SD_write_lba----------------------------------------
///////////利用CRC-----CCITT ---16校验码
BYTE SD_write_block(alt_u16 block_number, BYTE *buff)
{
    UINT16 b = 0;
    UINT16 crc=0;
    BYTE temp = 0;
    BYTE crc_status = 0;
   
    ///////////修改数据方式为out方式,即写方式。
    SD_DAT_OUT;
   
    UINT32 i,k,lba;
    lba = block_number * 512;

    Ncc();
    cmd_buffer[0] = cmd24[0];
    cmd_buffer[1] = (lba>>24)&0xff;
    cmd_buffer[2] = (lba>>16)&0xff;
    cmd_buffer[3] = (lba>>8)&0xff;
    cmd_buffer[4] = lba&0xff;
    send_cmd(cmd_buffer);
    Ncr();

    if(response_R(1)>1)
    return 1;
    Ncc();
   
    ////////////S bit
    SD_CLK_LOW;
    SD_DAT_LOW;
    SD_CLK_HIGH;

    /////////////content  
    for(i=0; i < 512; i++)
    {
        temp = buff [ i ];
        
        for(k=0x80; k!=0; k=k>>1)
        {
          SD_CLK_LOW;   

          if(temp&k)     
          SD_DAT_HIGH;
          else
          SD_DAT_LOW;

          SD_CLK_HIGH;   
         
          b = b*2;
          if((b&0x10000))
          b = b^0x11021;
          if((temp&k))
          b = b^(0x10000^0x11021);
        }
    }
    crc = b;  
//    crc =((crc<<1)|0x01);        //////////////end bit  
   
    ////////////crc
    for(i=0; i<16; i++)
    {
      SD_CLK_LOW;
      
      if(crc&0x8000)
      SD_DAT_HIGH;
      else
      SD_DAT_LOW;
      SD_CLK_HIGH;
      crc<<=1;
    }

////////////////////////////////end bit
    SD_CLK_LOW;
    SD_DAT_HIGH;
    SD_CLK_HIGH;
     

    Ncc();

    SD_DAT_IN;        //////////读取CRC status,应当修改DAT的方向。
   
    while(1)            ////////////等待crc status Start 位
    {
      SD_CLK_LOW;
      SD_CLK_HIGH;
      if((SD_TEST_DAT & 0x01) == 0)
      break;
    }
   
    for(i=0;i<8;i++)
    {
        SD_CLK_LOW;
        SD_CLK_HIGH;
        
        crc_status <<= 1;

        if((SD_TEST_DAT & 0x01))
        crc_status |= 0x01;        
    }

   
    for(i=0;i<16;i++)
    {
        SD_CLK_LOW;
        SD_CLK_HIGH;
    }
    write_status = 1;     
    return 0;     
}
//-------------------------------------------------------------------------
2#
 楼主| 发表于 2010-5-18 08:25:56 | 显示全部楼层
兄弟们,握起手来,打破SPI网上成功实例的垄断。其他部分和友晶提供的代码没有改变。
主函数如下:
#include "basic_io.h"
#include "LCD.h"
#include "SD_Card.h"
#include <math.h>
int main(void)
{
    UINT16 block_num = 1233;

    BYTE Buf_write[512]={0,1,2,3,4,5,6,7,8,9,10,11,12,23};
   
    BYTE Buf_read[513]={0};
    while(SD_card_init())
        usleep(500000);

    while(1)
    {
        SD_write_block(block_num,Buf_write);
        SD_read_block(block_num,Buf_read);
        block_num++;
    }
}





大家验证一下,调试一下,看看效果如何?
3#
 楼主| 发表于 2010-5-18 09:05:31 | 显示全部楼层
目前只是一条数据线,速度可能还不行。。。期望wide方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-4 22:56 , Processed in 0.036311 second(s), 14 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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