📄 modem860.c
字号:
{
unsigned char a;
CSN_ON_L;
SPI_Write_Read(add);
a = SPI_Write_Read(0x00);
CSN_OFF_H;
return (a);
}
unsigned short int Two_Byte_Read(unsigned char add)
{
unsigned short int a;
a = 0;
CSN_ON_L;
SPI_Write_Read(add);
a = SPI_Write_Read(0);
a = (a << 8);
a = a & 0xff00;
a = a | SPI_Write_Read(0);
CSN_OFF_H;
return (a);
}
void General_Reset(void)
{
CSN_ON_L;
SPI_Write_Read(0x01);
CSN_OFF_H;
delayms(20);
}
/*********************************/
/* MODEM初始化 */
/*********************************/
void Modem_Init(void)
{
Modem_Spi_Init();
Hardware_Reset();
Two_Byte_Write(0xe0,0x15,0x80);
delayms(20);
Two_Byte_Write(0xe0,0x15,0x00);
delayms(1);
One_Byte_Write(0xec,0x11);//select line driver
SendModemStandard = V23;
RecvModemStandard = V23;
MarkTime = 30;
AlternateTime = 30;
DialToneCheck = 0;
CheckDialToneTime = 1000;
OffHookDelay = 500;
DtmfOnTime = 100;
DtmfOffTime = 100;
}
/*********************************/
/* 摘机 */
/*********************************/
void Off_Hook(void)
{
One_Byte_Write(0xec,0x11);//select line driver
Two_Byte_Write(0xe0,0x13,0x60);
}
/*********************************/
/* 挂机 */
/*********************************/
void On_Hook(void)
{
Two_Byte_Write(0xe0,0x15,0x00);
One_Byte_Write(0xec,0x11);//select line driver
}
/*********************************/
/* 关闭发送 */
/*********************************/
void Transmit_Disable(void)
{
Two_Byte_Write(0xe1,0x00,0x00);
One_Byte_Write(0xec,0x11);//select line driver
}
/*********************************/
/* 关闭接收 */
/*********************************/
void Receive_Disable(void)
{
Two_Byte_Write(0xe2,0x00,0x00);
One_Byte_Write(0xec,0x11);//select line driver
}
/************************************/
/* 发送双音频信号 */
/* number:双音频信号字符(ASCII码)*/
/* ontime:双音频信号持续时间(毫秒) */
/* offtime:双音频信号关闭时间(毫秒)*/
/************************************/
void Transmit_DTMF(unsigned char number,unsigned short ontime,unsigned short offtime)
{
unsigned char a;
Off_Hook();
Receive_Disable();
if((number < 0x20)||((number >0x30)&&(number < 0x3a)))a = number & 0x0f;
else if(number <= 0x30)
{
switch(number)
{
case 0x30:a = 0x0a;break;//"0"
case 0x23:a = 0x0c;break;//"#"
case 0x2a:a = 0x0b;break;//"*"
}
}
else
{
switch(number)
{
case 0x41:a = 0x0d;break;
case 0x42:a = 0x0e;break;
case 0x43:a = 0x0f;break;
case 0x44:a = 0x00;break;
default:a = 0x00;break;
}
}
a = a | 0x10;
Off_Hook();
Two_Byte_Write(0xe1,0x1a,a);
delayms(ontime);
Transmit_Disable();
delayms(offtime);
}
/************************************/
/* 发送CAS信号 */
/* ontime:CAS信号持续时间(毫秒) */
/* offtime:CAS信号关闭时间(毫秒)*/
/************************************/
void Transmit_CAS(unsigned short ontime,unsigned short offtime)
{
unsigned char a;
Off_Hook();
Receive_Disable();
Two_Byte_Write(0xe1,0x1a,0x0f);
delayms(ontime);
Transmit_Disable();
delayms(offtime);
}
/*********************************/
/* 检测拨号音 */
/* time:超时时间(毫秒) */
/* 返回:0 检测到拨号音 */
/* 1 未检测到拨号音 */
/*********************************/
unsigned char Receive_DailTone(unsigned short int time)
{
unsigned short int a;
Off_Hook();
Two_Byte_Write(0xe2,0x1e,0x03);
while(time--)
{
a = Two_Byte_Read(0xe6);
//printf ("a = %04x\n",a);
if(a & 0x0400)return 0;//检测到dIAltone
delayms(1);
}
return 1;//未检测到DIALTONE
}
/********************************/
/*检测CAS信号 */
/* time:超时时间(毫秒) */
/* 返回:0 检测到CAS */
/* 1 未检测到CAS */
/********************************/
unsigned char Receive_CAS(unsigned short int time)
{
unsigned short int a;
Off_Hook();
Two_Byte_Write(0xe2,0x1e,0x04);
while(time--)
{
a = Two_Byte_Read(0xe6);
//printf ("a = %04x\n",a);
if(a & 0x0400)return 0;//检测到CAS
delayms(1);
}
return 1;//未检测到CAS
}
/******************************************/
/* 接收双音频信号 */
/* time:超时时间(毫秒) */
/* 返回:0xff 接收失败 */
/* 其他 接收到的双音频信号(ASCII) */
/******************************************/
unsigned char Receive_DTMF(unsigned short int time)
{
unsigned short int a;
Off_Hook();
Transmit_Disable();
Two_Byte_Write(0xe2,0x1e,0x01);
while(time--)
{
a = Two_Byte_Read(0xe6);
//printf ("a = %04x\n",a);
if(a & 0x0020)
{
a = a & 0x000f;
if((a > 0) && (a < 0x0a))return ((unsigned char)(a |0x0030));
switch(a)
{
case 0x0000: return 'D';
case 0x000a: return '0';
case 0x000b: return '*';
case 0x000c: return '#';
case 0x000d: return 'A';
case 0x000e: return 'B';
case 0x000f: return 'C';
} //检测到DTMF
}
delayms(1);
}
return (0xff);//未检测到DTMF
}
/********************************/
/* 发送FSK字符 */
/* data:待发送的字符 */
/********************************/
void Send_FSK_Char(unsigned char data)
{
unsigned short int a;
Off_Hook();
One_Byte_Write(0xec,0x11);//select line driver
Receive_Disable();
if(SendModemStandard)Two_Byte_Write(0xe1,0x5a,0x16);//transmit V.23 1200,8n1//16
else Two_Byte_Write(0xe1,0x3a,0x16);//transmit V.23 1200,8n1//16
while(1)
{
a = Two_Byte_Read(0xe6);
if(a & 0x1000)
{
One_Byte_Write(0xe3,data);//break;
//printf("发送%02x",data);
return;
}
}
}
/********************************/
/*发送FSK连续的1 */
/********************************/
void Send_Fsk_Mark(void)
{
Off_Hook();
One_Byte_Write(0xec,0x11);//select line driver
Receive_Disable();
if(SendModemStandard)Two_Byte_Write(0xe1,0x5a,0x1b);//transmit v.23 1200,8n1//16
else Two_Byte_Write(0xe1,0x3a,0x1b);//transmit bell 202 1200,8n1//16
delayms(MarkTime*2);
}
/********************************/
/*发送FSK连续的01 */
/* time:持续时间(毫秒) */
/********************************/
void Send_Fsk_Alternate(void)
{
Off_Hook();
One_Byte_Write(0xec,0x11);//select line driver
Receive_Disable();
if(SendModemStandard)Two_Byte_Write(0xe1,0x5a,0x18);//transmit v.23 1200,8n1//16
else Two_Byte_Write(0xe1,0x3a,0x18);//transmit bell 202 1200,8n1//16
delayms(AlternateTime*2);
}
/**************************************/
/* FSK数据接收开 */
/**************************************/
void Receive_FSK_ON(void)
{
Off_Hook();
One_Byte_Write(0xec,0x11);//select line driver
Transmit_Disable();
if(RecvModemStandard)Two_Byte_Write(0xe2,0x50,0x36);//receive v.23 1200,8n1//36
else Two_Byte_Write(0xe2,0x30,0x36);//receive bell 202 1200,8n1//36
delayms(5);
}
/**************************************/
/* FSK数据接收 */
/* 返回 0xff00: 接收不成功 */
/* 0x00xx: xx为接收字节 */
/**************************************/
unsigned short int Receive_FSK_Char(void)
{
unsigned short int a;
Off_Hook();
a = Two_Byte_Read(0xe6);
delayms(2);
if((a & 0x0440) == 0x0440)
{
a = One_Byte_Read(0xe5);
a = a & 0x00ff;
}
else a = 0xff00;
return(a);
}
/*void MODEM_Run(void)
{
unsigned char a;
unsigned char i;
unsigned short b;
unsigned char DATA[100];
clrscr();
printf(" MODEM测试 \n");
FskActiveOn();
for(;;)
{
On_Hook();
getch();
a = Dial("1234567890");
if(a == 1){printf ("旁置电话占用");continue;}
if(a == 2){printf ("NO DailTone");continue;}//检测拨号音
if( RecvFskData(DATA,0xffff) == 0x00)continue;
printf("接收结束");//getch();
for(i = 0;i<15;i++)
{
printf("%02x ",DATA[i]);
}
//getch();
SendFskData(DATA,15);
printf("发送结束");getch();
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -