共2条
1/1 1 跳转至页
AVR 有谁做过AVR控制硬盘的,请看过来!

问
有谁做过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
电路图是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 跳转至页