www.pudn.com > ak2368modem.rar > 840MDM.C


/* 
*   File name 840MDM.C 
*/ 
#include "3334F.h" 
#include "840io.h" 
#include "840def.h" 
#include "840ext.h" 
#include "840ep.h" 
 
#pragma interrupt (IRQ0) 
#pragma interrupt (IRQ1) 
 
UCHAR mode_2368; 
UCHAR AkmReg0; /* Scrambler    */ 
UCHAR AkmReg1; 
UCHAR AkmReg2; 
UCHAR AkmReg3; 
 
UCHAR TxDataTemp[5][6]; 
UCHAR TxDataIndex; 
UCHAR TxDataCount; 
UCHAR RxData[4][6]; 
 
UCHAR TxMesBuf[8]; 
UCHAR TxDataLength; 
UCHAR TxDataEnable; 
UCHAR MdmRxBuf[8]; 
UCHAR RxTempBuf[8]; 
static UCHAR RxCount; 
 
const UCHAR sync_tab[]={ 
    1,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1 /* SYNC C4D7    */ 
}; 
 
const UCHAR synt_tab[]={ 
    0,0,1,1,1,0,1,1,0,0,1,0,1,0,0,0 /* SYNT 3B28    */ 
}; 
 
const UCHAR head_tab[]={ 
    1,0,1,1,0,0,1,1,0,0,0,1,0,1,1,1 /* B317    */ 
}; 
 
const UCHAR rotate_tab[][2]={ 
	{7,1},{7,2},{7,4},{7,8},{7,16},{7,32},{7,64},{7,128}, 
	{6,1},{6,2},{6,4},{6,8},{6,16},{6,32},{6,64},{6,128}, 
	{5,1},{5,2},{5,4},{5,8},{5,16},{5,32},{5,64},{5,128}, 
	{4,1},{4,2},{4,4},{4,8},{4,16},{4,32},{4,64},{4,128}, 
	{3,1},{3,2},{3,4},{3,8},{3,16},{3,32},{3,64},{3,128}, 
	{2,1},{2,2},{2,4},{2,8},{2,16},{2,32},{2,64},{2,128}, 
	{1,1},{1,2},{1,4},{1,8},{1,16},{1,32},{1,64},{1,128}, 
	{0,1},{0,2},{0,4},{0,8},{0,16},{0,32},{0,64},{0,128}, 
}; 
 
typedef struct {	/* 纠错码对照表 */ 
	UINT data; 
	UCHAR bit1; 
	UCHAR bit2; 
} syndrome_table; 
 
#define SYN_NO	127		/* 纠错码个数 */ 
const syndrome_table syn_tab[SYN_NO]={	/* 纠错码对照表 */ 
	{0x0003,14,15},{0x0006,13,14},{0x000C,12,13}, 
	{0x0018,11,12},{0x0030,10,11},{0x0060,9,10}, 
	{0x00c0,8,9},{0x0180,7,8},{0x0300,6,7}, 
	{0x0600,5,6},{0x0C00,4,5},{0x15d3,43,44}, 
	{0x1763,20,21},{0x1800,3,4},{0x18cd,28,29}, 
	{0x193b,59,60},{0x1e1b,31,32},{0x21cd,56,57}, 
	{0x220b,38,39},{0x2867,35,36},{0x2ba6,42,43}, 
	{0x2d31,49,50},{0x2e7d,25,26},{0x2ec6,19,20}, 
	{0x3000,2,3},{0x3149,51,52},{0x319a,27,28}, 
	{0x3276,58,59},{0x3657,53,54},{0x3c36,30,31}, 
	{0x439a,55,56},{0x4416,37,38}, 
 
	{0x468d,40,41},{0x4841,61,62},{0x4989,33,34}, 
	{0x4b7b,45,46},{0x4bd7,22,23},{0x4e0f,16,17}, 
	{0x502a,62,63},{0x50ce,34,35},{0x51b7,46,47}, 
	{0x51e1,23,24},{0x530d,17,18},{0x574c,41,42}, 
	{0x5a62,48,49},{0x5cd1,47,48},{0x5cfa,24,25}, 
	{0x5d8c,18,19},{0x6000,1,2},{0x6039,36,37}, 
	{0x6292,50,51},{0x6334,26,27},{0x64ec,57,58}, 
	{0x650f,39,40},{0x6815,63,64},{0x6cae,52,53}, 
	{0x6f21,54,55},{0x740b,15,16},{0x786c,29,30}, 
	{0x7897,60,61},{0x7b07,32,33},{0x7ee3,44,45}, 
	{0x7fbb,21,22},{0x8000,64,0}, 
 
	{0x8001,15,0},{0x8002,14,0},{0x8004,13,0}, 
	{0x8008,12,0},{0x8010,11,0},{0x8020,10,0}, 
	{0x8040,9,0},{0x8080,8,0},{0x8100,7,0}, 
	{0x8200,6,0},{0x8400,5,0},{0x8800,4,0}, 
	{0x88e9,60,0},{0x8a09,32,0},{0x8cb1,44,0}, 
	{0x8d21,21,0},{0x9000,3,0},{0x90c7,52,0}, 
	{0x91d2,59,0},{0x9412,31,0},{0x9962,43,0}, 
	{0x9a2b,26,0},{0x9a42,20,0},{0xa000,2,0}, 
	{0xa017,37,0},{0xa18e,51,0},{0xa305,40,0}, 
	{0xa3a4,58,0},{0xa51f,55,0},{0xa824,30,0}, 
	{0xb2c4,42,0},{0xb44f,48,0}, 
 
	{0xb456,25,0},{0xb484,19,0},{0xb83f,62,0}, 
	{0xb887,34,0},{0xb929,46,0},{0xb94d,23,0}, 
	{0xba05,17,0},{0xc000,1,0},{0xc02e,36,0}, 
	{0xc31c,50,0},{0xc60a,39,0},{0xc748,57,0}, 
	{0xc885,28,0},{0xca3e,54,0},{0xd048,29,0}, 
	{0xe401,38,0},{0xe588,41,0},{0xe685,56,0}, 
	{0xe815,63,0},{0xe849,35,0},{0xe89e,47,0}, 
	{0xe8ac,24,0},{0xe908,18,0},{0xee2d,49,0}, 
	{0xf07e,61,0},{0xf10e,33,0},{0xf252,45,0}, 
	{0xf29a,22,0},{0xf40a,16,0},{0xf91f,27,0}, 
	{0xfc69,53,0} 
}; 
 
UCHAR correct_data(UCHAR *data,UINT syndata) 
/* 
纠错,data[8],syndata:纠错码 
返回: 
	1-纠错成功 
	0-未找到纠错码 
*/ 
{ 
	UCHAR n; 
	UCHAR position,dbit[2],cbit; 
	UCHAR temp; 
 
	for(n=0;n=SYN_NO) return 0;		/* 无此纠错码 */ 
	dbit[0]=syn_tab[n].bit1; 
	dbit[1]=syn_tab[n].bit2; 
	for(n=0;n<2;n++) { 
		if(!dbit[n]) return 1; 
		dbit[n]--; 
		position=dbit[n]/8; 
		cbit=dbit[n] % 8; 
		temp=1; 
		temp<<=(7-cbit); 
		data[position] ^= temp; 
	} 
	return 1; 
} 
 
void MoveRxBufAToTempA(void) 
{ 
	UCHAR i; 
	 
	if(rx_buf_tail>=8) rx_buf_tail=0; 
	for(i=0;i<8;i++) RxBuff[rx_buf_tail*8+i]=MdmRxBuf[i]; 
	rx_buf_tail++; 
	if(rx_buf_tail>=8) rx_buf_tail=0; 
	/* 
	for(i=0;i<8;i++) RxTempBuf[i]=MdmRxBuf[i]; 
	*/ 
} 
 
void ModemInit(void) 
{ 
#ifdef NO_AK2368 
       return; 
#endif 
 
	AudioSwitch(MUTE_MODE); 
	SyncDectSet(); 
	TxDataEnable=1; 
	ISCR.BIT.IRQ1SC=0;  /*  RDF IRQ  */ 
	IER.BIT.IRQ1E=1; 
	ISCR.BIT.IRQ0SC=1;  /*  TCLK IRQ */ 
	IER.BIT.IRQ0E=1; 
} 
 
void AudioSwitch(UCHAR mode) 
{ 
 
	mode_2368=mode; 
	disable(); 
	IER.BIT.IRQ1E=0;    /* disable IRQ1 */ 
	Mdm0.BIT.BS1=0; 
	switch(mode) { 
		case MUTE_MODE: 
			Mdm0.BIT.RXAFSW=1;  /* rx audio mute    */ 
	        	Mdm0.BIT.TDE=1;     /* tx mute          */ 
	        	Mdm0.BIT.TXAFSW=1; 
	        	break; 
	      	case SAVE_MODE: 
	        	Mdm0.BIT.BS2=1;     /*=1 mode 2         */ 
	        	Mdm0.BIT.RXAFSW=1;  /* rx audio mute    */ 
	        	Mdm0.BIT.TDE=1;     /* tx mute          */ 
	        	Mdm0.BIT.TXAFSW=1; 
	        	break; 
	      	case TALK_MODE: 
	        	Mdm0.BIT.BS2=0;     /* mode 3           */ 
	        	Mdm0.BIT.TDE=1; 
	        	Mdm0.BIT.TXAFSW=0;  /* voice signal     */ 
	        	Mdm0.BIT.RXAFSW=0;  /* RXAF,BUFON=on    */ 
	        	break; 
	      	case TXMD_MODE: 
	        	Mdm0.BIT.BS2=0;     /* mode 3           */ 
	        	Mdm0.BIT.RXAFSW=1;  /* RXAF,BUFON=mute  */ 
	        	Mdm0.BIT.TDE=0; 
	        	Mdm0.BIT.TXAFSW=1;  /* MSK signal       */ 
	        	break; 
	      	case TXAD_MODE: 
	        	Mdm0.BIT.BS2=0;     /* mode 3           */ 
	        	Mdm0.BIT.RXAFSW=1;  /* RXAF,BUFON=mute  */ 
	        	Mdm0.BIT.TDE=1; 
	        	Mdm0.BIT.TXAFSW=0;  /* voice signal     */ 
	        	break; 
			case RXAD_MODE: 
	        	Mdm0.BIT.BS2=0;     /* mode 3           */ 
	        	Mdm0.BIT.TDE=1; 
	        	Mdm0.BIT.TXAFSW=1;  /* TX mute          */ 
	        	Mdm0.BIT.RXAFSW=0;  /* RXAF,BUFON=on    */ 
	        	break; 
		default:				/* 8-5-98   */ 
			IER.BIT.IRQ1E=1;    /* disable IRQ1 */ 
			enable(); 
			return; 
       } 
	SendSio(0,Mdm0.BYTE); 
	IER.BIT.IRQ1E=1;            /* disable IRQ1 */ 
	enable(); 
} 
 
void TxDataLoop(void) 
{ 
	UCHAR i; 
	 
#ifdef NO_AK2368 
       return; 
#endif 
 
	do{ 
    		for(i=0;i<=5;i++) 
			TxMesBuf[i]=TxDataTemp[TxDataIndex][i]; 
		SendMesPrepare(); 
		while(TxDataLength); 
		TxDataLength=64; 
		TxDataIndex++; 
	} while(TxDataIndex!=TxDataCount); 
} 
/* 
* 
*TCLK 
*/ 
void IRQ0(void) 
{ 
	UCHAR temp; 
 
/* 
*    B317AAAAAAAA3B280123456789ABCDEFfs Total 128 bit 
* 
*    sAAAA3B280123456789ABCDEFfs    Total 100 bit 
*    |\  /\  /                ||--- msk mute 
*    | \/  \/                 |---- 4bit roundup 
*    | |   |----------------------- Sync 
*    | |--------------------------- Preamble 
*    |----------------------------- msk Tx 
*/ 
	ISCR.BIT.IRQ0SC=0; 
	ISCR.BIT.IRQ0SC=1; 
	ISCR.BIT.IRQ0SC=0; 
	ISCR.BIT.IRQ0SC=1; 
 
	if(Status.M.BIT.tone) 
	{ 
    		TDATA=0; 
	} 
	else 
	{ 
		if(TxDataLength>112) { 
    			temp=(128-TxDataLength); 
			TDATA=head_tab[temp]; 
		} 
		else if(TxDataLength>80) { 
			if(TxDataLength&0x01) TDATA=0;  /* Preamble AAAA */ 
        	else TDATA=1; 
		} 
		else if(TxDataLength>64) { 
    			temp=(80-TxDataLength); 
			if(St.BIT.connect==0)		/* || mode_flag==2)*/ 
				TDATA=sync_tab[temp];		/* C4D7 */ 
			else TDATA=synt_tab[temp];		/* 3B28 */ 
		} 
		else GetMesTxBuf(TxDataLength-1); 
		if(TxDataLength) TxDataLength--; 
	} 
} 
 
void fram_dect (void) 
{ 
	Mdm0.BIT.FCLN=0;	/* Frame detection used */ 
	Mdm0.BIT.FSL=0; 
	SendSio(0,Mdm0.BYTE); 
	Rx.BIT.SyncDect=0; 
} 
 
/* 
*       Modem RDF 
*/ 
void IRQ1(void) 
{ 
	UCHAR xbit; 
	UCHAR bitcount; 
#ifdef DEBUG_BT	 
	static UCHAR Datalen;    
#endif 
 
	ISCR.BIT.IRQ1SC=0; 
	ISCR.BIT.IRQ1SC=1; 
	ISCR.BIT.IRQ1SC=0; 
 
	if(!Rx.BIT.SyncDect) {		/* Rx.BIT.SyncDect==0 当前接收的是frame head */ 
		Rx.BIT.SyncDect=1; 
		In.W.syndrome=0; 
		Rx.BIT.Parity=0; 
		RxCount=0; 
		Mdm0.BIT.FCLN=1;     	/* Frame detection not used */ 
		Mdm0.BIT.FSL=1; 
		SendSio(0,Mdm0.BYTE); 
		return; 
	} 
	 
	xbit=RecSio();				/* 当前接收的是数据 */ 
	MdmRxBuf[RxCount]=xbit; 
	/* Ser1Wr(xbit); */ 
	RxCount++; 
	for(bitcount=1; bitcount<=8; bitcount++) { 
    		Rx.BIT.Parity^=xbit>>7; 
		if(RxCount==8 && bitcount==7) xbit^=0x80;  /* bit=63 */ 
		if(RxCount!=8 || bitcount!=8) { 
			In.W.syndrome<<=1; 
            		if((xbit^(In.W.B.syndromeH))&0x80) 
            			In.W.syndrome^=0x6815; 
        	} 
        	xbit<<=1; 
	} 
	if(RxCount<8) return; 
 
	In.W.syndrome&=0x7fff; 
	if(Rx.BIT.Parity&0x80) In.W.syndrome|=0x8000; 
	RxCount=0; 
 
	if(In.W.syndrome!=0) { 
		if(correct_data(MdmRxBuf,In.W.syndrome)) 
			In.W.syndrome=0; 
	} 
 
	if(In.W.syndrome==0) {	/* 校验码正确 */ 
#ifdef DEBUG_BT		 
		MoveRxBufAToTempA(); 
		if((MdmRxBuf[0]&0x80)&&((MdmRxBuf[2]&0x04)==0x04)) { /* address codeword,指令码字 */ 
			if((MdmRxBuf[2]&0x03)==0) {			/* CAT=00x */ 
				if((MdmRxBuf[3]&0xfc)==0x84) {	/* SAMIS CAT TYPE SOL DESC L */ 
												/* 001,0,0,001,00	CAT=001,TYPE=0,SOL=0,DESC=001 
												入站请求单地址消息,到PSTN呼叫的拨号数字 */ 
					Datalen=(MdmRxBuf[3]&0x03);	/* 数据码字长度 */ 
      				} 
			} 
		} 
		else {	/* data codeword,数据码字 */ 
			if(Datalen) Datalen--; 
		} 
		if(Datalen==0) fram_dect(); 
		return; 
#endif			 
  		if(St.BIT.connect) { 
			MoveRxBufAToTempA(); 
			fram_dect(); 
			return; 
  		} 
        	if(MdmRxBuf[0]&0x80) { 
 					/*  testp2=1;*/ 
			if(Org.slotcnt>=1)Org.slotcnt--;                 	 
		} 
		MoveRxBufAToTempA(); 
	} 
	else {		/* In.W.syndrome!=0 校验码错误 */ 
		fram_dect(); 
#ifdef DEBUG_BT 
		Datalen=0; 
#endif 
	} 
} 
/* 
*       Control Channel Rx 
*/ 
void SyncDectSet(void) 
{ 
#ifdef NO_AK2368 
	return; 
#endif 
 
	IER.BIT.IRQ1E=0; 
	if(St.BIT.connect==0){ 
		SendSio(4,0xd7); 
	  	SendSio(5,0xc4); 
	} 
	else{ 
		SendSio(4,0x28); 
	  	SendSio(5,0x3b); 
	} 
	RecSio(); 
	while (!P9.DR.BIT.B1); 
	disable(); 
	Mdm0.BIT.FCLN=0;      /* Frame detection used */ 
	Mdm0.BIT.FSL=0; 
	/* Mdm0.BIT.PCONT=1;*/ 
	SendSio(0,Mdm0.BYTE); 
	enable(); 
	Rx.BIT.SyncDect=0; 
	In.W.syndrome=0; 
	Rx.BIT.Parity=0; 
	IER.BIT.IRQ1E=1; 
} 
 
void GetMesTxBuf(UCHAR index) 
{ 
	UCHAR temp; 
 
	temp=TxMesBuf[rotate_tab[index][0]]; 
	if(temp&rotate_tab[index][1]) TDATA=1; 
	else                          TDATA=0; 
} 
 
void SendMesPrepare(void) 
{ 
	UINT CheckBit; 
 
	CheckBit=GenBch(); 
	TxMesBuf[6]=(CheckBit>>8); 
	TxMesBuf[7]=CheckBit; 
} 
 
UINT GenBch(void) 
/* 生成校验码 */ 
{ 
	UCHAR xbit; 
	UCHAR parity=0; 
	UCHAR count; 
	UINT ckbits=0; 
	UINT temp; 
 
	for(count=0; count<48; count++) { 
		xbit=MesBufGetBit(count); 
		parity^=xbit; 
		if(0x01&(xbit^(ckbits>>15))) ckbits^=0x6815;	/* ckbits ^= 0x6815 ? */ 
		ckbits<<=1; 
	} 
	ckbits^=0x0002;	/* 第63位取反 */ 
	temp=ckbits; 
	for(count=1; count<16; count++){ 
		if(temp & 0x8000) parity^=0x01; 
	   	 temp<<=1; 
	} 
	ckbits&=0xfffe; 
	if(parity&0x01) ckbits^=0x0001;	/* 第64位为奇偶校验(偶校验) */ 
	return (ckbits); 
} 
 
UCHAR MesBufGetBit(UCHAR index) 
{ 
	UCHAR carry=0; 
	UCHAR temp; 
 
	temp=TxMesBuf[mes_tab[index][0]];	/* 第几个字节? */ 
	if(temp&mes_tab[index][1])carry=1;	/* 第几个字节的第几位? */ 
	return(carry); 
}