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

📄 840mdm.c

📁 AK2368MODEM应用初始化
💻 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;n++) if(syn_tab[n].data==syndata) break;
	if(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);
}


⌨️ 快捷键说明

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