微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机控制硬盘的C语言源码程序

51单片机控制硬盘的C语言源码程序

时间:11-28 来源:互联网 点击:

///////////////////////////////////////////

//等待BSY信号

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

byte WaitBSY(void)

{

byte timeOut=0;

do{

ReadReg(_Status_Command);

timeOut++;

// if(timeOut>=254) return(0xff);

}while(BSY);

return(1);

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////

//写寄存器值

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void WriteReg(byte Addr,byte Data)

{

RegAddr=Addr;

Write=0;

DataL=Data;

Write=1;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

读数据储存器中数据

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void ReadData(void)

{

DataH=0xff;

DataL=0xff;

RegAddr=_Data;

Read=0;

Data_bufferL=DataL;

Data_bufferH=DataH;

Read=1;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

写数据寄存器中数据

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void WriteData(void)

{

RegAddr=_Data;

Write=0;

DataL=Data_bufferL;

DataH=Data_bufferH;

Write=1;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

初始化硬盘 //

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void Init(void)

{ do{

WriteReg(_DeviceAndHead,0xa0);

ReadReg(_Status_Command);

}while(!DRDY|BSY);

WriteReg(_DeviceAndHead,_MaxHead);

WriteReg(_SecCount,_MaxSector);

WriteReg(_Status_Command,0x91);

WaitBSY();

WriteReg(_Status_Command,0x10);

WaitBSY();

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

读硬盘参数

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void DriverID(void)

{

unsigned int i=512;

//send_string("Starting read driver ID");

WaitBSY();

//send_string("Now can read driver ID ");

WriteReg(_Status_Command,0xec);

//send_string("Waiting.. ");

do{ReadReg(_Status_Command);}while(BSY|!DRQ);

//send_string("Now Sending ");

while(i){

ReadData();

send_char(Data_bufferH);

send_char(Data_bufferL);

i-=2;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

硬盘寻址

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

WriteCHS(byte head,uint cylinder,byte sector,byte read_count)

{

WaitBSY();

WriteReg(_DeviceAndHead,0xa0|head);

WriteReg(_CylinderH,(char)(cylinder>>8));

WriteReg(_CylinderL,(char)(cylinder&0x00ff));

WriteReg(_SecNum,sector);

WriteReg(_SecCount,read_count);

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//用途:将硬盘的返回数据读入BUFFER数组

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void SendData()

{ uint i;

i=512//15;

do{ReadReg(_Status_Command);}while(BSY|!DRQ);

if(ERR){

send_string("x0dx0a Errorx0dx0a");

}

while(i){ReadData();send_char(Data_bufferL);send_char(Data_bufferH);i-=2;}

}

// 激活硬盘(转动)

void SpinUP()

{

WaitBSY();

WriteReg(_Status_Command,0xE1);

}

// 让硬盘休眠(停转)/

void SpinDown()

{

WaitBSY();

WriteReg(_Status_Command,0xE0);

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top