打印
[AVR单片机]

基于ATmegal16的SD卡复位求助

[复制链接]
1119|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
davalier|  楼主 | 2012-5-17 20:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int


uchar  is_init;
uchar  pbuf[512];//数据缓冲区
uchar text;


/*******************SD错误码定义************************/
#define INIT_CMD0_ERROR    0X01
#define INIT_CMD1_ERROR    0X02
#define WRITE_BLOCK_ERROR  0X03
#define READ_BLOCK_ERROR   0X04
/*******************************************************/






/**********************************************************/
/*  函数名称 :  延时函数                                  */
/*  函数功能 : 延时                                      */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/

void delay(uint ms)
{
        uint i,j;

for(i=0;i<ms;i++)

   {

   for(j=0;j<1141;j++);
       }
}

/**********************************************************/
/*  函数名称 :  模拟SPI延时函数                           */
/*  函数功能 : 延时                                      */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/

void timer()
{
  unsigned char i=100;
  while(i --);
}

/**********************************************************/
/*  函数名称 :  模拟SPI总线端口初始化                     */
/*  函数功能 : PD端口初始化                              */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Simulation_SPI_INIT()
{
  /*
  CS   PD.0
  DIN  PD.1
  SCK  PD.2
  DOUT PD.3
  */
  DDRA|=BIT(2);
  PORTA|=BIT(2);
  DDRB = 0XFF;
  DDRD = 0XF7;  //PD口全为输出
  PORTD = 0XFF;
// DDRD &= 0XF7; //PD.3设为输入
}

/**********************************************************/
/*  函数名称 :  模拟SPI写函数                             */
/*  函数功能 : SPI写数据                                 */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Simulation_SPI_WRITE(unsigned char datain)
{
   unsigned char i;
   for(i=0;i<8;i++)
   {
      if((datain << i) & 0x80)
      {

   PORTD |= 0X02;
      }

  else

  {
       PORTD &= 0XFD;   
  

  }

  PORTD &= 0XFB;//SCL = 0

  if(is_init)

  {timer();}

  PORTD |= 0X04;//SCL = 1

  if(is_init)

  {timer();}
   }
}

/**********************************************************/
/*  函数名称 :  模拟SPI读函数                             */
/*  函数功能 : SPI读数据                                 */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
unsigned char Simulation_SPI_READ(void)
{
unsigned char temp = 0,i;
  PORTD |= 0X08;

  for(i = 0;i ++;i < 8)
  {
   PORTD &= 0XFB;
   if(is_init){timer();}
   if(PIND & 0X08)
   {
   temp |= (0x80 >> i);
   }
   PORTD |= 0X04;
   if(is_init){timer();}
  }
  return temp;
}

/**********************************************************/
/*  函数名称 :  SD卡写函数                                */
/*  函数功能 : 向SD卡写入                                */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
unsigned char SD_WRITE(unsigned char *pcmd)
{
unsigned char temp,time = 0,i;
   for(i = 0;i < 6;i ++)
   {
    Simulation_SPI_WRITE(pcmd[i]);
   }
   do
   {
   temp = Simulation_SPI_READ();

   time ++;
   }while((temp == 0xff) && (time < 100));
   return(temp);
}

/**********************************************************/
/*  函数名称 :  SD复位                                    */
/*  函数功能 :                                           */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
unsigned char SD_RESET()
{
unsigned char time,temp,i;
unsigned char pcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};

    is_init = 1;

PORTD |= 0X01;//CS = 1
    for (i = 0;i < 0xff;i ++)
    {

Simulation_SPI_WRITE(0xff);//120CLK

}
PORTD &= 0XFE;//CS = 0
time = 0;
    do

{

temp = SD_WRITE(pcmd);

//text = temp;//0x00

time ++;

if(time == 200)

  {

  return(INIT_CMD0_ERROR);

  }

}while(temp != 0x01);
PORTD |= 0X01;//CS = 1
Simulation_SPI_WRITE(0XFF);//补偿8个时钟
return(0);//复位成功
}


void main()
{
  Simulation_SPI_INIT();
  text = SD_RESET();
  PORTB = text;
  while(1);
}

以上是我的复位程序,CMD0返回值一直不对,求大神指教

相关帖子

沙发
JC.Wang| | 2012-6-7 12:07 | 只看该作者
要下载你所用的SD卡的资料手册,不同SD卡之间的时序是有细微的差别的,可能在某些地方需要插入几个时钟周期等等,所以必须严格按照时序来慢慢调整

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

4

帖子

1

粉丝