📄 bridge_changer.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 + -