⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide.c

📁 usb接口的移动硬盘
💻 C
字号:
/******************************************************************
   本程序只供学习使用,未经作者许可,不得用于其它任何用途
      我的邮箱:computer-lov@tom.com
        欢迎访问我的blog:  http://computer00.21ic.org

IDE.C  file

Created by Computer-lov
Date: 2005.3.12

Edit date:2006.3.2

Version V1.1
Copyright(C) Computer-lov 2005-2015
All rigths reserved
             
*******************************************************************/

#include <at89X52.h>
#include "IDE.H"
//#include <serial.h>



unsigned char IDE_Buffer_H,IDE_Buffer_L;

unsigned char bdata IDE_status;
sbit IDE_BSY  =  IDE_status^7;
sbit IDE_DRDY =  IDE_status^6;
sbit IDE_DWF  =  IDE_status^5;
sbit IDE_DSC  =  IDE_status^4;
sbit IDE_DRQ  =  IDE_status^3;
sbit IDE_CORR =  IDE_status^2;
sbit IDE_IDX  =  IDE_status^1;
sbit IDE_ERR  =  IDE_status^0;



unsigned char bdata IDE_error_register;
sbit IDE_BBK  =   IDE_error_register^7;
sbit IDE_UNC  =   IDE_error_register^6;
sbit IDE_MC   =   IDE_error_register^5;
sbit IDE_IDNF =   IDE_error_register^4;
sbit IDE_MCR  =   IDE_error_register^3;
sbit IDE_ABRT =   IDE_error_register^2;
sbit IDE_TKONF=   IDE_error_register^1;
sbit IDE_AMNF =   IDE_error_register^0;


void delayXms(unsigned int x)
{
 unsigned int i,j;
 for(i=0;i<x;i++)
  for(j=0;j<225;j++);
}


void reset_IDE(void)
{
 IDE_Address=IDE_Reset;
 IDE_ALE=1;
 IDE_ALE=0;
 delayXms(200);
 IDE_Address=IDE_Bus_Not_Use;
 IDE_ALE=1;
 IDE_ALE=0;
 delayXms(200);
 while(!IDE_IORDY);
}


void read_IDE_16(unsigned char address)
{
 while(!IDE_IORDY);
 IDE_Address=address;
 set_IDE_address();
 IDE_DATA_H=0xFF;
 IDE_DATA_L=0xFF;
 IDE_DIOR=0;
 IDE_Buffer_H=IDE_DATA_H;
 IDE_Buffer_L=IDE_DATA_L;
 IDE_DIOR=1;
 IDE_Address=IDE_Bus_Not_Use;
 set_IDE_address();
}

/*
void write_IDE_16(unsigned char address)
{
 while(!IDE_IORDY);
 IDE_Address=address;
 set_IDE_address();
 IDE_DIOW=0;
 IDE_DATA_H=IDE_Buffer_H;
 IDE_DATA_L=IDE_Buffer_L;
 IDE_DIOW=1;
 IDE_Address=IDE_Bus_Not_Use;
 set_IDE_address();
}*/

unsigned char read_IDE_8(unsigned char address)
{
 unsigned char temp;
 while(!IDE_IORDY);
 IDE_Address=address;
 set_IDE_address();
 IDE_DATA_H=0xFF;
 IDE_DATA_L=0xFF;
 IDE_DIOR=0;
 temp=IDE_DATA_L;
 IDE_DIOR=1;
 IDE_Address=IDE_Bus_Not_Use;
 set_IDE_address();
 return temp;
}

void write_IDE_8(unsigned char address,unsigned char w_data)
{
 while(!IDE_IORDY);
 IDE_Address=address;
 set_IDE_address();
 IDE_DIOW=0;
 IDE_DATA_L=w_data;
 IDE_DIOW=1;
 IDE_Address=IDE_Bus_Not_Use;
 set_IDE_address();
}

void read_IDE_data(void)
{
 read_IDE_16(IDE_Data);
}

/*
void write_IDE_data(void)
{
 write_IDE_16(IDE_Data);
}
*/

void read_IDE_status(void)
{
 IDE_status=read_IDE_8(IDE_Status);
}

void read_IDE_error(void)
{
 IDE_error_register=read_IDE_8(IDE_Error_Register);
}

unsigned char wait_IDE_busy(void)
{
 while(!IDE_IORDY);
 do
  {
   read_IDE_status();
   if(IDE_ERR)
   {
    read_IDE_error();
   }
  }while(IDE_BSY);
 IDE_Address=IDE_Bus_Not_Use;
 set_IDE_address();
 return 0;
}

void write_IDE_command(unsigned char command)
{
 write_IDE_8(IDE_Command,command);
 wait_IDE_busy();
}

/*
void soft_reset_IDE(void)
{
 write_IDE_8(IDE_Device_Control,0xFD);
 wait_IDE_busy();
}*/

void get_IDE_information(void)
{
 unsigned int i;
 unsigned int n_cylinders;
 unsigned int n_heads;
 unsigned int n_sectors_per_track;
 unsigned long int disk_capacity;
 unsigned long int temp;
// prints("获取磁盘信息...",1);
 write_IDE_command(IDE_Identify_Drive);
// prints("磁盘信息:",1);
 read_IDE_data();//1st word
// if(IDE_Buffer_H&0x01)prints("磁盘传输速率: 小于5MBs",1);
// if(IDE_Buffer_H&0x02)prints("磁盘传输速率: 大于5MBs小于等于10MBs",1);
// if(IDE_Buffer_H&0x04)prints("磁盘传输速率: 大于10MBs",1);
// read_IDE_data();//2nd word
 ((unsigned char *)&n_cylinders)[0]=IDE_Buffer_H;
 ((unsigned char *)&n_cylinders)[1]=IDE_Buffer_L;
// prints("柱面数: ",0);
// printf(n_cylinders);
// prints("",1);
 read_IDE_data();//3th word
 read_IDE_data();//4th word
 ((unsigned char *)&n_heads)[0]=IDE_Buffer_H;
 ((unsigned char *)&n_heads)[1]=IDE_Buffer_L;
// prints("磁头数: ",0);
// printf(n_heads);
// prints("",1);
 read_IDE_data();//5th word
 read_IDE_data();//6th word
 read_IDE_data();//7th word
 ((unsigned char *)&n_sectors_per_track)[0]=IDE_Buffer_H;
 ((unsigned char *)&n_sectors_per_track)[1]=IDE_Buffer_L;
// prints("每道扇区数: ",0);
// printf(n_sectors_per_track);
// prints("",1);
 disk_capacity=n_cylinders;
 disk_capacity*=n_heads;
 disk_capacity*=n_sectors_per_track;
 disk_capacity/=2048;   //磁盘容量单位为MB
// prints("磁盘容量: ",0);
// printf(disk_capacity);
// prints(" MBytes",1);
 read_IDE_data();//8th word
 read_IDE_data();//9th word
 read_IDE_data();//10th word
// prints("磁盘序列号: ",0);
 for(i=0;i<10;i++)     //11--20th words
  {
   read_IDE_data();
//   send_to_comport(IDE_Buffer_L);
//   send_to_comport(IDE_Buffer_H);
  }
// prints("",1);
 read_IDE_data();//21th
 read_IDE_data();//22th
 read_IDE_data();//23th
// prints("固件版本: ",0);//24th--27th
 for(i=0;i<4;i++)
  {
   read_IDE_data();
//   send_to_comport(IDE_Buffer_L);
//   send_to_comport(IDE_Buffer_H);
  }
// prints("",1);
// prints("Model number: ",0);//28th--47th
 for(i=0;i<20;i++)
  {
   read_IDE_data();
//   send_to_comport(IDE_Buffer_L);
//   send_to_comport(IDE_Buffer_H);  
  }
// prints("",1);
 read_IDE_data();//48th
 read_IDE_data();//49th
 read_IDE_data();//50th
// if(IDE_Buffer_H&0x01)prints("支持DMA模式",1);
// if(IDE_Buffer_H&0x02)prints("支持LBA模式",1);
 for(i=0;i<4;i++)read_IDE_data();//51th--54th
// prints("当前柱面数: ",0);
 read_IDE_data();//55th
 temp=0;
 ((unsigned char *)&temp)[2]=IDE_Buffer_H;
 ((unsigned char *)&temp)[3]=IDE_Buffer_L;
// printf(temp);
// prints("",1);
// prints("当前磁头数: ",0);
 read_IDE_data();//56th
 temp=0;
 ((unsigned char *)&temp)[2]=IDE_Buffer_H;
 ((unsigned char *)&temp)[3]=IDE_Buffer_L;
// printf(temp);
// prints("",1);
// prints("当前每道扇区数: ",0);
 read_IDE_data();//57th
 temp=0;
 ((unsigned char *)&temp)[2]=IDE_Buffer_H;
 ((unsigned char *)&temp)[3]=IDE_Buffer_L;
// printf(temp);
// prints("",1);
// prints("当前磁盘容量: ",0);
 read_IDE_data();//58th
 DISK_CAPACITY[2]=IDE_Buffer_H;
 DISK_CAPACITY[3]=IDE_Buffer_L;
 ((unsigned char *)&temp)[2]=IDE_Buffer_H;
 ((unsigned char *)&temp)[3]=IDE_Buffer_L;
 read_IDE_data();//59th
 DISK_CAPACITY[0]=IDE_Buffer_H;
 DISK_CAPACITY[1]=IDE_Buffer_L;
 ((unsigned char *)&temp)[0]=IDE_Buffer_H;
 ((unsigned char *)&temp)[1]=IDE_Buffer_L; 
 temp/=2048;  //磁盘容量单位为MB
// printf(temp);
// prints(" MBytes",1);

 for(i=59;i<=255;i++)
  {
   read_IDE_data();
  // printc(i);
   //printc(IDE_Buffer_L);
  // send_to_comport(' ');
   //printc(IDE_Buffer_H);
  //send_to_comport(' ');
  }
}

void write_IDE_LBA3(unsigned char LBA3)
{
 write_IDE_8(IDE_LBA_Bits_0_7,LBA3);
}

void write_IDE_LBA2(unsigned char LBA2)
{
 write_IDE_8(IDE_LBA_Bits_8_15,LBA2);
}

void write_IDE_LBA1(unsigned char LBA1)
{
 write_IDE_8(IDE_LBA_Bits_16_23,LBA1);
}

void write_IDE_LBA0(unsigned char LBA0)
{
 LBA0&=0x0F;
 LBA0|=0xE0;//磁盘0工作在LBA模式下
 write_IDE_8(IDE_LBA_Bits_24_27,LBA0);
}

void write_IDE_sector_count(unsigned char count)
{
 write_IDE_8(IDE_Sector_Count,count);
}
/*
void read_IDE_buffer(void)
{
 write_IDE_command(IDE_Read_Buffer);
}

void write_IDE_buffer(void)
{
 write_IDE_command(IDE_Write_Buffer);
}
*/

void read_IDE_sector(void)
{
 write_IDE_command(IDE_Read_Sectors);
}

void write_IDE_sector(void)
{
 write_IDE_command(IDE_Write_Sectors);
}


void IDE_initial(void)
{
 reset_IDE();
// prints("IDE复位...",1);
// prints("磁盘忙,请等待...",1);
 do
  {
   write_IDE_8(IDE_Drive_Head,0xE0);
   read_IDE_status();
  }while(IDE_BSY);
 wait_IDE_busy();
 write_IDE_8(IDE_Device_Control,0xFA);//没有中断模式f
 get_IDE_information();
}

void system_initial(void)
{
 EA=0;
 IDE_Address=IDE_Bus_Not_Use;
 IDE_ALE=1;
 IDE_ALE=0;
 delayXms(100);
// init_comport(57600);
// prints("",1);
// prints("开机...",1);
 IDE_initial();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -