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

📄 bridge_changer.c

📁 一个桥接器87ch47仿真器的c的源程序
💻 C
字号:
/******************************************************************************
        Copyright 2003 Freeway electronics Limited,

        COMPANY CONFIDENTIAL

        Filename : Bridge_Changer.c

Rev     Date    Author          Comments
_______________________________________________________________________________
001     03-7-8   Jac Fan        original

@module
       This module is  control for CD Changer Bridge,
       Obey  "Communication specification for CD Changer"[25TH,NOV.2002]
       [TOTTORI SANYO ELECTRIC]
******************************************************************************/
#include "IO870.h"
#include "global.h"
#include "Main_Bridge.h"
#include "cust_io.h"

extern BYTE CDC_Type;  
extern BYTE CDC_Mode;						//0:NO CDC,1:PLAY,2:STOP,3:SHFFL,4:SCAN
extern BYTE CDC_Disc_NO;
extern BYTE CDC_Music_NO;
extern BYTE CDC_Idle;  
extern BYTE CDC_Idle_Counter;
extern BYTE CDC_Bit_Index;
extern BYTE CDC_Parity;
extern BYTE CDC_Validate_Parity;
extern BYTE Data_2_CDC_Interrupt_Count;

extern BYTE BitCount_From_CDC;
extern BYTE tmp_Data_from_CDC;
extern BYTE DATA_From_CDC[];
extern BYTE DATA_2_Main[];
extern BYTE Bit_Read_Bool;	
extern BYTE Current_Bit_2_CDC;
extern BYTE Total_Bit_2_CDC;
extern BYTE DATA_2_CDC[];
extern BYTE CDC_Byte_Index;
extern  void Send_Data_2_Main(void);

void  __interrupt INT_Test_CDC_BUS(void);
void Translate_CDC_2_Main();

//at P10 Interrupt,Falling Edge capture
//In Service Prog,we set and start a TIMER TC1[1.2ms later] to test the bus
//Bus is LOW, means Data "1"
//       HIGH,means Data "0"
//FLOW CHART OBEYs P16~P19 of "Communication specification for CD Changer"
void __interrupt INT_CDC_DATA(void)
{
	BYTE i;
	
	if(CDC_IO==1) return;
	CDC_Idle=0;
	CDC_Idle_Counter=5;
	Bit_Read_Bool=0;

	TC2CR=0x08;		//source clock=32us,(fc/2^8)
	TREG2=0x26;		//1200/32=38=0x26,every 1.2ms generate interrupt
	TC2CR=0x28;
}	

void __interrupt INT_Test_CDC_BUS(void)
{
	if(CDC_IO==1) 
	{
		CDC_Idle_Counter--;
		if(CDC_Idle_Counter==0) 
		{
			CDC_Idle=1;		//set BUS Idle flag
			TC2CR=0x04;		//stop TC2
		
			//When it judges Bus Idle,It finishes receiving
			//so,Begin translate.(then transmit)
			Translate_CDC_2_Main();
			return;
		}	
	}
	if(Bit_Read_Bool==0)
	{
		CDC_Idle_Counter=5;
		CDC_Idle=0;
		Bit_Read_Bool=1;
		BitCount_From_CDC++;
		CDC_Bit_Index++;

		if(CDC_IO==1)	//means data "0"
			tmp_Data_from_CDC<<=1;   //data "0"
		else
			tmp_Data_from_CDC=(tmp_Data_from_CDC<<1) | 0x01;   //data "1"
			
		if(CDC_Bit_Index==4)	
		{
			CDC_Validate_Parity=CDC_Parity^(tmp_Data_from_CDC-1);
			CDC_Validate_Parity=CDC_Validate_Parity & 0x0f;
			CDC_Parity^=tmp_Data_from_CDC;
			
			tmp_Data_from_CDC<<=4;		
			DATA_From_CDC[CDC_Byte_Index]=tmp_Data_from_CDC;	//save every 4 bits to higher 4 bits
			tmp_Data_from_CDC>>=4;		//return to older status
		}
		if(CDC_Bit_Index==8)
		{
			CDC_Bit_Index=0;
			DATA_From_CDC[CDC_Byte_Index]=tmp_Data_from_CDC;	
			CDC_Byte_Index++;
			
			tmp_Data_from_CDC=tmp_Data_from_CDC & 0x0f;	//get low 4 bits
			CDC_Validate_Parity=CDC_Parity^(tmp_Data_from_CDC-1);
			CDC_Validate_Parity=CDC_Validate_Parity & 0x0f;
			CDC_Parity^=tmp_Data_from_CDC;
						
			tmp_Data_from_CDC=0;			
		}			
	}
	if(BitCount_From_CDC>=0x40) //max bit is 64
	{
		CDC_Idle=1;		//set BUS Idle flag
		TC2CR=0x04;		//stop TC2
		//max bit_count receive,Judge receive end.
		//so Begin translate.(then transmit)
		Translate_CDC_2_Main();	
	}	
}	

void Set_CDC_Status()		//set CDC status for Main player
{
	switch(CDC_Mode)
	{
		case 3:		//shuffle
			DATA_2_Main[0]=0xeb;
			DATA_2_Main[6]=0x30;
			DATA_2_Main[7]=0xe3;
			break;
		case 2:		//stop
			DATA_2_Main[0]=0x8b;
			DATA_2_Main[6]=0x70;
			DATA_2_Main[7]=0x83;
			break;
		case 1:		//play
			DATA_2_Main[0]=0xcb;		
			DATA_2_Main[6]=0x30;
			DATA_2_Main[7]=0xc3;
			break;
		case 4:		//scan
			DATA_2_Main[0]=0xc9;		
			DATA_2_Main[6]=0x30;
			DATA_2_Main[7]=0xc3;
			break;
	}
	DATA_2_Main[1]=CDC_Disc_NO;
	DATA_2_Main[2]=CDC_Music_NO;
}

//Translate DATA_From_CDC[8] into main Player's data format(that is  DATA_2_Main[8])
//DATA_From_CDC[8],Order:Byte0->Byte7,Bit0->Bit7,that is [Byte0,Bit0] save first bit
//Transmit DATA_2_Main[8]
void Translate_CDC_2_Main()
{
    BYTE OP_CODE,tmp_byte1,tmp_byte2;	//op code of DATA_From_CDC[8]
    BYTE Transmit_Bool;
	//First Validate the parity of DATA_From_CDC[8]
	CDC_Idle=0;
	CDC_Idle_Counter=5;	
	Bit_Read_Bool=0;
	BitCount_From_CDC=0;
	tmp_Data_from_CDC=0;
	CDC_Parity=0;
	CDC_Bit_Index=0;
	CDC_Byte_Index=0;
	
	CDC_Mode=0;
	
	if(CDC_Validate_Parity!=0) 			//wrong data
	{
		for(tmp_byte1=0;tmp_byte1<8;tmp_byte1++)	DATA_From_CDC[tmp_byte1]=0;		
		return;	
	}
	OP_CODE=DATA_From_CDC[0];
	OP_CODE&=0x70;	//get device code
	Transmit_Bool=0;
	switch(OP_CODE)
	{
		case 0x10:		//10disc_1	
			CDC_Type=3;
			break;
		case 0x20:		//10disc_2
			CDC_Type=4;
			break;
		case 0x50:		//6disc_1
			CDC_Type=1;
			break;
		case 0x60:		//6disc_2
			CDC_Type=2;
			break;	
		default:								
			CDC_Type=0;
			CDC_Mode=0;
			break;
	}
	if(CDC_Type==0) return;	//no CDC
	
	OP_CODE=DATA_From_CDC[0];
	OP_CODE&=0x0f;
	//Translate begin...
	//for data from CDC to Main Player,we only need status information
	//set default
	DATA_2_Main[3]=0;		//minute,useless for Main Player
	DATA_2_Main[4]=0;		//second,useless for Main Player
	DATA_2_Main[5]=0;		//useless for Main Player
	switch (OP_CODE)
	{
		case 0x08:	//connection status
			Transmit_Bool=1;
			CDC_Mode=2;		//stop
			break;
		case 0x09:	//CD status 
			tmp_byte1=DATA_From_CDC[1];
			tmp_byte2=DATA_From_CDC[2];
			tmp_byte1&=0x0f;	//
			tmp_byte1<<=4;
			tmp_byte2&=0xf0;	//
			tmp_byte2>>=4;
			CDC_Music_NO=tmp_byte1+tmp_byte2;	//music NO
			
			tmp_byte1=DATA_From_CDC[3];
			tmp_byte1&=0xf0;
			tmp_byte1>>=4;	//
			CDC_Disc_NO=tmp_byte1;	//disc NO

			tmp_byte1=DATA_From_CDC[6];
			if(tmp_byte1 & 0x80) CDC_Mode=4;	//scan
			if(tmp_byte1 & 0x20) CDC_Mode=3;	//shuffle**************
			
			tmp_byte1=DATA_From_CDC[7];
			if(tmp_byte1 & 0x40) CDC_Mode=2;		//stop

			if(tmp_byte1 & 0x10) CDC_Mode=1;		//play	
			
			Transmit_Bool=1;	
			break;
		case 0x0b:	//Disc change Status
			tmp_byte1=DATA_From_CDC[1];
			tmp_byte1&=0x0f;	//
			CDC_Disc_NO=tmp_byte1;	//disc NO
			
			CDC_Music_NO=DATA_From_CDC[2];;	//music NO
			
			tmp_byte1=DATA_From_CDC[4];
			if(tmp_byte1 & 0x80) CDC_Mode=4;	//scan
			if(tmp_byte1 & 0x20) CDC_Mode=3;	//shuffle**************
			
			tmp_byte1=DATA_From_CDC[5];
			if(tmp_byte1 & 0x40) CDC_Mode=2;	//stop	
			if(tmp_byte1 & 0x10) CDC_Mode=1;	//play			
			
			tmp_byte1=DATA_From_CDC[3];
			if(tmp_byte1 & 0x20) DATA_2_Main[6]=0x90;	//Magazine status,0x6f inverse to 0x90
			
			Transmit_Bool=1;	
			break;
		case 0x0c:	//CD TOC status
		
			break;
		case 0x0d:	//MAGZ status
		
			break;
		case 0x0f:	//Error status
		
			break;		
	}
	Set_CDC_Status();
}

void Send_Data_2_CDC()
{
    Data_2_CDC_Interrupt_Count=0;        
    Current_Bit_2_CDC=0;   
    	
 	P6 =   0xff;
    P6CR = 0xff;            	/* p65 output HIGH LEVEL ,P64 OUTPUT CHANGER'S LED STATUS*/
    
	//disable INT_CDC_DATA
    EIR = EIR & (~EF15) ;   	/* interrupt disable :P20 */                        
    __ASM("EI");    			/* open interrupt master   */
    
    TC1CR = 0x14;   /* TC1 Timer mode, timer resolution 16us for Send Data 2 CDC */
		            /* 0  0   s   s,  0   1  0  0         */
		            /* TC1 start, Timer mode,           */
		            /* internal clock, fc/2^7 = 16us      */        
}

//interrupt period:128us
//every 5 interrupts=640us=0.64ms
//p10 level:

//data "0":0*5,1*18
//data "1":0*14,1*9

//every 0ne bit period=23 interrupts=2.93ms
void __interrupt INT_TC1_Send_Data_2_CDC(void)
{
	BYTE Byte_Index;
	BYTE Bit_Index;
	BYTE tmp_Byte;
	
	if(Current_Bit_2_CDC==Total_Bit_2_CDC) 	//already finish sending data 
	{
		CDC_IO=1;		//set bus high,that is bus idle status
		P6 =   0xff;	// and,set P10=input mode
    	P6CR = 0xdf;    /* p65 input mode ,P64 OUTPUT CHANGER'S LED STATUS*/
    	TC1CR = 0x04; 	//STOP TC1
    	if(!(EIR & EF15))
    	{
    		EIR = EIR + EF15 ;    /***** interrupt enable :P20 *****/     	
    		__asm("EI");
    	}
		return;
	}
	if(Data_2_CDC_Interrupt_Count<5)
	{
		CDC_IO=0;		//first 0.64ms,must set bus low
		Data_2_CDC_Interrupt_Count++;
		return;
	}
	//get current bit
	Byte_Index=Current_Bit_2_CDC>>3;	//get current Byte_Index of DATA_2_CDC[]
	Bit_Index=Current_Bit_2_CDC % 8;
	tmp_Byte=0x01<<(7-Bit_Index);
	
	//accord current bit and current interrupt count,set P10 level
	if(DATA_2_CDC[Byte_Index] & tmp_Byte)  //current bit=1
	{	
		if(Data_2_CDC_Interrupt_Count<14)
		CDC_IO=0;                        //bus=low,means current bit=1
		else
		CDC_IO=1;                        //return to high level status
	}
	else
	{
		CDC_IO=1;						 //bus=high,means current bit=0
	}
		
	Data_2_CDC_Interrupt_Count++;
	if(Data_2_CDC_Interrupt_Count>=23) //all,23 interrupt
	{
		Data_2_CDC_Interrupt_Count=0;
		Current_Bit_2_CDC++;
	}
}	

⌨️ 快捷键说明

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