📄 ata_cd_rom.c
字号:
#include <regx51.h>
#include "ATA_CD_ROM.h"
unsigned char ATA_DATA_BUS,ATA_General_Status,ATA_Device_Head_Status,ATA_Error_Status;
unsigned char ATA_DATA_BUS_LS,ATA_DATA_BUS_MS;
unsigned char start_track,temp0,temp1,temp2,temp3;
unsigned char Start_M,Start_S,Start_F,End_M,End_S,End_F;
unsigned char Packet_Table[32];
void Initial_CD_ROM(void)
{
ATA_nRESET = 0; //Reset CD ROM
DelayXms(100);
ATA_nRESET = 1;
DelayXms(2000); //Delay 2 sec
do
{
Get_Status_Register();
}while((ATA_General_Status&0x80)==0x80);
//}while(P1_7);
//LED_Glisten();
Get_Device_Head_Register();
Device = 0; //Set Master,then CD ROM
Set_Device_Head_Register();
do
{
Get_Status_Register();
}while((ATA_General_Status&0x80)==0x80);
ATA_DATA_BUS = 0x90; //Device Diagnostic
Set_CMD_Register();
do
{
Get_Status_Register();
}while((ATA_General_Status&0x80)==0x80);
Get_Error_Register();
while((ATA_Error_Status!=0x01) && (ATA_Error_Status!=0x81)); //it isn't find,then Device
}
void test_unit_ready_cmd(void)
{
unsigned int i;
test_unit_loop:
DelayXms(1000);
for(i=0;i<32;i++)
{
Packet_Table[i]=0x00; //clear packet table
}
do
{
Get_Status_Register();
}while((ATA_General_Status&0x88)!=0x00);
ATA_DATA_BUS = 0xA0; //Send Packet Command
Set_CMD_Register();
Send_Packet_Command();
while((ATA_General_Status&0x01)==0x01)
{
goto test_unit_loop;
}
}
void Read_TOC_CMD(void)
{
unsigned int i;
for(i=0;i<32;i++)
{
Packet_Table[i]=0x00; //clear packet table
}
do
{
Get_Status_Register();
}while((ATA_General_Status&0x88)!=0x00);
ATA_DATA_BUS = 0xA0; //Send Packet Command
Set_CMD_Register();
Packet_Table[0]=0x43;
Packet_Table[1]=0x02;
Packet_Table[7]=0xFF;
Packet_Table[8]=0xFF;
Send_Packet_Command();
while((ATA_General_Status&0x08)!=0x08);
Get_Data(); //Read DATA length
Get_Data(); //Read DATA length
start_track = ATA_DATA_BUS_LS;
Read_TOC_Loop:
Get_Data(); //Address and Control field
Get_Data(); //Get track number
temp0 = ATA_DATA_BUS_LS;
Get_Data();
temp1 = ATA_DATA_BUS_MS;
Get_Data();
temp2 = ATA_DATA_BUS_LS;
temp3 = ATA_DATA_BUS_MS;
if(temp0==start_track)
{
Start_M = temp1;
Start_S = temp2;
Start_F = temp3;
}
if(temp0==0xAA)
{
End_M = temp1;
End_S = temp2;
End_F = temp3;
}
do
{
//DelayXms(100);
Get_Status_Register();
}while((ATA_General_Status&0x80)==0x80);
Get_Status_Register();
if((ATA_General_Status&0x08)==0x08)
{
goto Read_TOC_Loop;
}
}
void Play_CD_CMD(void)
{
unsigned int i;
for(i=0;i<32;i++)
{
Packet_Table[i]=0x00; //clear packet table
}
do
{
Get_Status_Register();
}while((ATA_General_Status&0x88)!=0x00);
ATA_DATA_BUS = 0xA0; //Send Packet Command
Set_CMD_Register();
Packet_Table[0] = 0x47;
Packet_Table[3] = Start_M;
Packet_Table[4] = Start_S;
Packet_Table[5] = Start_F;
Packet_Table[6] = End_M;
Packet_Table[7] = End_S;
Packet_Table[8] = End_F;
Send_Packet_Command();
while((ATA_General_Status&0x01)==0x01);
}
void Get_Status_Register(void)
{
ATA_Address = 0xF0; //Set Read Status Address
ATA_DATA_LS = 0xFF; //Default LSB of DATA Bus
//ATA_DATA_MS = 0xFF; //Default MSB of DATA Bus
ATA_nDIOR = 0; //Start Read Data of Register
ATA_General_Status = ATA_DATA_LS;
ATA_nDIOR = 1; //Read Data done
}
void Get_Device_Head_Register(void)
{
ATA_Address = 0xD0;
ATA_DATA_LS = 0xFF;
ATA_DATA_MS = 0xFF;
ATA_nDIOR = 0;
ATA_Device_Head_Status = ATA_DATA_LS;
ATA_nDIOR = 1;
}
void Set_Device_Head_Register(void)
{
ATA_Address = 0xD0;
ATA_DATA_LS = ATA_Device_Head_Status;
ATA_nDIOW = 0;
DelayXms(100);
ATA_nDIOW = 1;
}
void Set_CMD_Register(void)
{
ATA_Address = 0xF0;
ATA_DATA_LS = ATA_DATA_BUS;
ATA_nDIOW = 0;
DelayXms(100);
ATA_nDIOW = 1;
}
void Get_Error_Register(void)
{
ATA_Address = 0x30;
ATA_DATA_LS = 0xFF;
ATA_DATA_MS = 0xFF;
ATA_nDIOR = 0;
ATA_Error_Status = ATA_DATA_LS;
ATA_nDIOR = 1;
}
void Get_Data(void)
{
ATA_Address = 0x10;
ATA_DATA_LS = 0xFF;
ATA_DATA_MS = 0xFF;
ATA_nDIOR = 0;
ATA_DATA_BUS_LS = ATA_DATA_LS;
ATA_DATA_BUS_MS = ATA_DATA_MS;
ATA_nDIOR = 1;
}
void Send_Packet_Command(void)
{
unsigned int i;
do
{
Get_Status_Register();
}while((ATA_General_Status&0x89)!=0x08);
for(i=0;i<6;i++)
{
ATA_DATA_BUS_LS = Packet_Table[i*2];
ATA_DATA_BUS_MS = Packet_Table[i*2+1];
Set_ATA_DATA_ALL();
}
do
{
ATA_INTRQ = 1;
}while(ATA_INTRQ==0);
Get_Status_Register();
}
void Set_ATA_DATA_ALL(void)
{
ATA_Address = 0x10;
ATA_DATA_LS = ATA_DATA_BUS_LS;
ATA_DATA_MS = ATA_DATA_BUS_MS;
ATA_nDIOW = 0;
DelayXms(100);
ATA_nDIOW = 1;
}
void DelayXms(unsigned int counter)
{
unsigned int i,j;
for(i=0;i<counter;i++)
for(j=0;j<120;j++);
}
void LED_Glisten(void)
{
while(1)
{
P3_7 = 0;
DelayXms(500);
P3_7 = 1;
DelayXms(500);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -