?? ide.c
字號(hào):
#include"IDE.h"
#define nop() __asm__ __volatile__ ("nop" ::)
void IDE_Delay(uint16 n)
{
while(n--);
}
uint8 IDE_WaitBSY()//等待空閑
{
uint8 timeout = 0;
uint8 temp;
do
{
temp = IDE_ReadREG(IDE_Status_Command);
timeout++;
// if(timeout>100)return 1;
}while(temp&(1<<BSY));
return 0;
}
uint8 IDE_WaitDRQ()//等待驅(qū)動(dòng)器準(zhǔn)備好傳輸數(shù)據(jù)
{
uint8 timeout = 0;
uint8 temp;
do
{
temp = IDE_ReadREG(IDE_Status_Command);
timeout++;
// if(timeout>100)return 1;
}while(!(temp&(1<<DRQ)));
return 0;
}
void IDE_RegConvert(uint8 reg)//設(shè)置讀寄存器是的相應(yīng)管腳
{
IDE_CS0_L();
IDE_CS1_H();
switch(reg)
{
case IDE_Data : IDE_DA2_L();IDE_DA1_L();IDE_DA0_L();break;
case IDE_Err_Features : IDE_DA2_L();IDE_DA1_L();IDE_DA0_H();break;
case IDE_SecCount : IDE_DA2_L();IDE_DA1_H();IDE_DA0_L();break;
case IDE_SecNumber : IDE_DA2_L();IDE_DA1_H();IDE_DA0_H();break;
case IDE_CylinderL : IDE_DA2_H();IDE_DA1_L();IDE_DA0_L();break;
case IDE_CylinderH : IDE_DA2_H();IDE_DA1_L();IDE_DA0_H();break;
case IDE_Device_Head : IDE_DA2_H();IDE_DA1_H();IDE_DA0_L();break;
case IDE_Status_Command : IDE_DA2_H();IDE_DA1_H();IDE_DA0_H();break;
default : IDE_CS0_H();break;
}
}
uint8 IDE_Init()//硬盤初始化
{
uint8 temp,retry = 0;
MCUCR &= ~(1<<SRE);//不采用總線方
IDE_RST_DDR |= 1<<IDE_RST_PIN;
IDE_RST_PORT |= 1<<IDE_RST_PIN;
IDE_CS0_DDR |= 1<<IDE_CS0_PIN;
IDE_CS0_PORT |= 1<<IDE_CS0_PIN;
IDE_CS1_DDR |= 1<<IDE_CS1_PIN;
IDE_CS1_PORT |= 1<<IDE_CS1_PIN;
IDE_DA0_DDR |= 1<<IDE_DA0_PIN;
IDE_DA0_PORT |= 1<<IDE_DA0_PIN;
IDE_DA1_DDR |= 1<<IDE_DA1_PIN;
IDE_DA1_PORT |= 1<<IDE_DA1_PIN;
IDE_DA2_DDR |= 1<<IDE_DA2_PIN;
IDE_DA2_PORT |= 1<<IDE_DA2_PIN;
IDE_WR_DDR |= 1<<IDE_WR_PIN;
IDE_WR_PORT |= 1<<IDE_WR_PIN;
IDE_RD_DDR |= 1<<IDE_RD_PIN;
IDE_RD_PORT |= 1<<IDE_RD_PIN;
IDE_RD_H();
IDE_WR_H();
IDE_RST_L();
IDE_Delay(0xffff);
IDE_RST_H();
for(retry = 0;retry < 20;retry++)IDE_Delay(0xffff);
do
{
IDE_WriteREG(IDE_Device_Head,0xa0);
temp = IDE_ReadREG(IDE_Status_Command);
if(retry++ >200)
{
MCUCR |= (1<<SRE);//重新使能總線
IDE_CS0_H();
return 1;
}
}while((!(temp&(1<<DRDY))) || temp&(1<<BSY));
IDE_WriteREG(IDE_Device_Head,0x40);
IDE_WriteREG(IDE_SecCount,60);
IDE_WriteREG(IDE_Status_Command,CMD_INITIALIZE_DRIVE_PARAMETERS);//0x91
IDE_WaitBSY();
IDE_WriteREG(IDE_Status_Command,CMD_RECALIBRATE);//0x10
IDE_WaitBSY();
IDE_CS0_H();
MCUCR |= (1<<SRE);//重新使能總線
return 0;
}
uint8 IDE_ReadREG(uint8 addr)//讀寄存器
{
uint8 temp;
IDE_RegConvert(addr);
IDE_DATA_L_DDR = 0x00;
IDE_DATA_L_PORT = 0xff;
IDE_RD_L();
nop();
nop();
temp = IDE_DATA_L_PIN;
IDE_RD_H();
return temp;
}
void IDE_WriteREG(uint8 addr, uint8 val)//寫寄存器
{
IDE_RegConvert(addr);
IDE_DATA_L_DDR = 0xff;
IDE_DATA_L_PORT = val;
IDE_WR_L();
nop();
nop();
IDE_WR_H();
}
uint8 IDE_ReadOneSector(uint32 LBA,uint8 *buffer)//讀一個(gè)扇區(qū)
{
uint16 i;
MCUCR &= ~(1<<SRE);//關(guān)閉總線
IDE_WriteREG(6,0xe0 + (LBA>>24));//LBA方式,送LBA地址
IDE_WriteREG(5,LBA>>16);
IDE_WriteREG(4,LBA>>8);
IDE_WriteREG(3,LBA);
IDE_WriteREG(2,1); //讀1個(gè)扇區(qū)
IDE_WriteREG(IDE_Status_Command,CMD_READ_SECTORS);//0x20//讀命令
IDE_WaitDRQ();//等待數(shù)據(jù)準(zhǔn)備好
IDE_RegConvert(IDE_Data);//設(shè)置相應(yīng)地址
IDE_DATA_L_DDR = 0x00; //端口設(shè)為輸入狀態(tài)
IDE_DATA_L_PORT = 0xff;
IDE_DATA_H_DDR = 0x00;
IDE_DATA_H_PORT = 0xff;
for(i=0;i<512;)
{
IDE_RD_L();//1次讀操作
nop();
nop();
buffer[i++] = IDE_DATA_L_PIN;
buffer[i++] = IDE_DATA_H_PIN;
IDE_RD_H();
}
MCUCR |= (1<<SRE); //重新使能總線
IDE_CS0_H(); //驅(qū)動(dòng)器無效狀態(tài)
return 0;
}
uint8 IDE_WriteOneSector(uint32 LBA,uint8 *buffer)//寫一個(gè)扇區(qū)
{
uint16 i;
MCUCR &= ~(1<<SRE);//關(guān)閉總線
IDE_WriteREG(6,0xe0 + (LBA>>24));//LBA方式,送LBA地址
IDE_WriteREG(5,LBA>>16);
IDE_WriteREG(4,LBA>>8);
IDE_WriteREG(3,LBA);
IDE_WriteREG(2,1); //一次操作1個(gè)扇區(qū)
IDE_WriteREG(IDE_Status_Command,CMD_WRITE_SECTORS);//0x30//寫命令
IDE_WaitDRQ();//等待驅(qū)動(dòng)器準(zhǔn)備好接受數(shù)據(jù)
IDE_RegConvert(IDE_Data);//設(shè)置相應(yīng)地址
IDE_DATA_L_DDR = 0xff; //端口設(shè)為輸出狀態(tài)
IDE_DATA_H_DDR = 0xff;
for(i=0;i<512;)
{
IDE_DATA_L_PORT = buffer[i++];//寫數(shù)據(jù)
IDE_DATA_H_PORT = buffer[i++];
IDE_WR_L();
nop();
nop();
IDE_WR_H();
}
MCUCR |= (1<<SRE);//重新使能總線
IDE_CS0_H(); //使驅(qū)動(dòng)器處于無效狀態(tài)
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -