这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » AVR 有谁做过AVR控制硬盘的,请看过来!

共2条 1/1 1 跳转至

AVR 有谁做过AVR控制硬盘的,请看过来!

院士
2006-09-17 18:14:16     打赏
AVR 有谁做过AVR控制硬盘的,请看过来!



关键词: 谁做     控制     硬盘     请看     过来    

院士
2006-12-22 22:43:00     打赏
2楼
问 有谁做过AVR控制硬盘的,请看过来!
电路图是ZIPAMP的电路图,我想为它写个程序来练练自已.请帮忙!
主要部分图如下,也可以下载PDF文件!

现在看看我写的程序:这是我根据一个网上下载的源代码再配合ZIPAMP电路图改的, 用winAVR写的!请帮忙! 谢了!

//-------------------------------------------------------------------
// Select address and CS signals
//
// addressing bits
// DA0    A0    0x01    Address Line 0
// DA1    A1    0x02    Address Line 1
// DA2    A2    0x04    Address Line 2
//
// chip selects
// CS0    A3     0x08    Command Block Select
// CS1    A4    0x10    Control Block Select
//
// 锁存  PD4      0 锁存
//-------------------------------------------------------------------
void SetAddress(u08 cs, u08 adr)
{     
    outp(0xff,DDRC);   //设PORTC为输出
    sbi(DDRD,4);         //设PD4为输出
    sbi(PORTD,4);      //输出1
    if (cs==CTRL)  
    {
      PORTC = adr+0x08;  // select A4 low -> CS1 -> CTRL
    }
    else
    {    
      PORTC = adr+0x10;   // select A3 low -> CS0 -> CMD  
    
    }
    asm volatile ("nop");   //延时少少
    sbi(DDRD,4);           //输出
    cbi(PORTD,4);           //PD4为0 锁存
}

//--------------------------------------------------------------------
// Read data BYTE from Drive
//--------------------------------------------------------------------
u08 ReadBYTE(u08 cs, u08 adr)
{
      u08 tmp;
      SetAddress(cs,adr);
    outp(0x00, DDRA);      // port A as input
    outp(0x00, DDRC);      // port C as input
    sbi(DDRB,1);
    cbi(PORTB, 1);        // set DIOR lo
    asm volatile ("nop");    // allow pin change
    tmp = inp(PINA);             // read byte
    sbi(PORTB, 1);        // set DIOR hi
    sbi(MCUCR, SRE);             // enable RAM
      return tmp;
}


//-------------------------------------------------------------------
// Write data BYTE to Drive
//-------------------------------------------------------------------
void WriteBYTE(u08 cs, u08 adr, u08 dat)
{
      SetAddress(cs,adr);
    outp(0xff, DDRA);         // port A as output
    outp(0xff, DDRC);         // port C as output
    asm volatile ("nop");  // allow pin change
    sbi(DDRB,0);           // set output
    cbi(PORTB, 0);         // set DIOW lo
    asm volatile ("nop");  // allow pin change
    outp(dat, PORTA);         // write byte
         sbi(PORTB, 0);         // set DIOW hi
}


于是我在MAIN函数里试着读写
main()
{
  IO_init();
  LED(2);                  //我自个加个LED,作为指示,亮一下
  WriteBYTE(CMD, 6, 0xA0); // chs mode, drive 0
  while((ReadBYTE(CMD,7)&0xc0)!=0x40); //等待busy清0,ready置1
  LED(5);                 //亮五下
}

我发现灯亮了2下之后就开始不亮了.
说明程序死在while((ReadBYTE(CMD,7)&0xc0)!=0x40);

大家看看我的程序那里错了.

另:我的硬件是好的,为我的ZIPAMP硬盘MP3可以放歌.

谢谢!!! 谢谢!!! 1: 硬盘要RST的说我没作过,估计的 2: 我也有试RST的,但没有作用.我有试用PD3连接硬盘1脚,

cbi(PORTD,3);  //0
sbi(DDRD,3)   //输出
delay(400);
sbi(PORTD,3);  //0
sbi(DDRD,3)   //输出
delay(1000);

但结果还是一样!
3: 没人知道吗? 4: 帮忙! 5: 5555555555555555555555555

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]