共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |