📄 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;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 + -