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

📄 ata_cd_rom.c

📁 用8051單晶片來控制cdrom播放音樂
💻 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 + -