📄 modem860.c
字号:
#include "register.h"
#include "bg1flib.h"
#include <stdio.h>
#define pb5_RE_DATA 0x20
#define pk1_COM_DATA 0x02
#define pk0_SCLOCK 0x01
#define pj6_RESETN 0x40
#define pj7_PHONE 0x80
#define pj5_CSN 0x20
#define pj4_RING 0x10
#define CSN_ON_L PJDATA = PJDATA & (~pj5_CSN)
#define CSN_OFF_H PJDATA = PJDATA | pj5_CSN
#define RESETN_ON_L PJDATA = PJDATA & (~pj6_RESETN)
#define RESETN_OFF_H PJDATA = PJDATA | pj6_RESETN
#define SCLOCK_ON_H PKDATA = PKDATA | pk0_SCLOCK
#define SCLOCK_OFF_L PKDATA = PKDATA & (~pk0_SCLOCK)
#define COM_DATA_H PKDATA = PKDATA | pk1_COM_DATA
#define COM_DATA_L PKDATA = PKDATA & (~pk1_COM_DATA)
#define RE_DATA PBDATA & pb5_RE_DATA
#define Bell202 0
#define V23 1
unsigned char SendModemStandard;
unsigned char RecvModemStandard;
unsigned short int MarkTime;
unsigned short int AlternateTime;
unsigned char DialToneCheck;
unsigned short int CheckDialToneTime;
unsigned short int OffHookDelay;
unsigned short int DtmfOnTime;
unsigned short int DtmfOffTime;
unsigned char SetFskParam(unsigned char Type,unsigned short int Value);
unsigned char SetDialParam(unsigned char Type,unsigned short int Value);
void SendFskData(unsigned char *Data,unsigned int DataLen);
unsigned short int RecvFskData(unsigned char *Data,unsigned int time);
void FskActiveOn(void);
void FskActiveOff(void);
unsigned char Dial(unsigned char *Phone_Number);
void Modem_Spi_Init(void);
unsigned char CheckPhone(void);
void Hardware_Reset(void);
unsigned char SPI_Write_Read(unsigned char data);
void One_Byte_Write(unsigned char add,unsigned char data);
void Two_Byte_Write(unsigned char add,unsigned char msb,unsigned char lsb);
unsigned char One_Byte_Read(unsigned char add);
unsigned short int Two_Byte_Read(unsigned char add);
void General_Reset(void);
void Modem_Init(void);
void Off_Hook(void);
void On_Hook(void);
void Transmit_Disable(void);
void Receive_Disable(void);
void Transmit_DTMF(unsigned char number,unsigned short ontime,unsigned short offtime);
void Transmit_CAS(unsigned short ontime,unsigned short offtime);
unsigned char Receive_DailTone(unsigned short int time);
unsigned char Receive_CAS(unsigned short int time);
unsigned char Receive_DTMF(unsigned short int time);
void Send_FSK_Char(unsigned char data);
void Send_Fsk_Mark(void);
void Send_Fsk_Alternate(void);
void Receive_FSK_ON(void);
unsigned short int Receive_FSK_Char(void);
/**********************************************************************/
/* 设置FSK通信参数 */
/* Type = 1 发送通信标准 Value = 0 BELL202(1200), Value = 1 V.23(1200)*/
/* Type = 2 接收通信标准 Value = 0 BELL202(1200), Value = 1 V.23(1200)*/
/* Type = 3 前导符01 Value : 表示01个数(推荐 30) */
/* Type = 4 前导符11 Value : 表示11个数(推荐 30) */
/* 返回: 0:成功 1:失败 */
/**********************************************************************/
unsigned char SetFskParam(unsigned char Type,unsigned short int Value)
{
switch(Type)
{
case 1:if(Value == 0){SendModemStandard = Bell202;return 0;}
if(Value == 1){SendModemStandard = V23;return 0;}
break;
case 2:if(Value == 0){RecvModemStandard = Bell202;return 0;}
if(Value == 1){RecvModemStandard = V23;return 0;}
break;
case 3:AlternateTime = Value;return 0;
break;
case 4:MarkTime = Value;return 0;
break;
default:return 1;break;
}
return 1;
}
/****************************************************************************/
/* 设置DTMF拨号参数 */
/* Type = 1 是否检测拨号音 Value = 0 检测拨号音, Value = 1 不检测拨号音 */
/* Type = 2 检测拨号音时间 Value:表示时间(ms) */
/* Type = 3 摘机到拨号间的等待时间,如检测拨号音为检测到拨号音到拨号间的时间 */
/* Value:表示延时时间(ms) */
/* Type = 4 DTMF ON时间 Value : 表示ON_TIME(ms) */
/* Type = 5 DTMF OFF时间 Value : 表示OFF_TIME(ms) */
/* 返回: 0:成功 1:失败 */
/**********************************************************************/
unsigned char SetDialParam(unsigned char Type,unsigned short int Value)
{
switch(Type)
{
case 1:if(Value == 0){DialToneCheck = 0;return 0;}
if(Value == 1){DialToneCheck = 1;return 0;}
break;
case 2:CheckDialToneTime = Value;return 0;
case 3:OffHookDelay = Value;return 0;
break;
case 4:DtmfOnTime = Value;return 0;
break;
case 5:DtmfOffTime = Value;return 0;
break;
default:return 1;break;
}
return 1;
}
/***********************************/
/* 发送FSK数据包 */
/* Data:待发送数据起始地址 */
/* DataLen:数据长度 */
/***********************************/
void SendFskData(unsigned char *Data,unsigned int DataLen)
{
unsigned int i;
Send_Fsk_Alternate(); //发送同步码连续01
Send_Fsk_Mark(); //发送同步结束码11111
for(i = 0;i < DataLen;i++)
{
Send_FSK_Char(*Data);
Data++;
}
delayms(5);
Transmit_Disable();
Receive_Disable();
}
/***************************************************/
/* 接收FSK数据包(短信协议) */
/* Data:数据存放起始地址 */
/* time :超时时间(ms) */
/* 返回:接收数据个数,0为接收失败 */
/***************************************************/
unsigned short int RecvFskData(unsigned char *Data,unsigned int time)
{
unsigned short a,j,time1;
unsigned char i;
Receive_FSK_ON();
i = 0;
time1 = time/2;
while(time1--)
{
a = Receive_FSK_Char();
if(a & 0xff00){;}
else
{
if((unsigned char)a == 0x55)i++;
else i = 0;
}
if(i >= 0x05)break; //接收同步码连续的10
}
if(i < 0x05)return 0;
time1 = time/2;
while(time1--)
{
a = Receive_FSK_Char();
if(a & 0xff00){;}
else
{
if((unsigned char)a == 0x84)
{
*Data = 0x84;
Data++;
break;
}
} //接收信息类型字节0x84
}
if(time1 == 0x00)return 0;
time1 = time/2;
while(time1--)
{
a = Receive_FSK_Char();
if(a & 0xff00){;}
else
{
*Data = (unsigned char)a;
break;
} //接收数据包长度
}
if(time1 == 0x00)return 0;
i = (*Data)+1;j = i+2;
Data++;
time1 = time/2;
while(time1--)
{
a = Receive_FSK_Char();
if(a & 0xff00){;}
else
{
*Data = (unsigned char)a;
Data++;
i--;
time1 = time/2;
if(i == 0)return(j);
}
}
return 0;
}
/*************************************/
/* FSK功能开 */
/* 开启FSK功能,初始化FSK芯片 */
/* 参数恢复为: */
/* Fsk通信参数为v.23(收发相同) */
/* 前导符11和01个数为30 */
/* 须检测拨号音(时间为1000ms) */
/* 摘机到拨号时间为500ms */
/* DTMF_ONTIME = 100ms */
/* DTMF_OFFTIME = 100ms */
/*************************************/
void FskActiveOn(void)
{
Modem_Init();
}
/*************************************/
/* FSK功能关闭并挂机 */
/*************************************/
void FskActiveOff(void)
{
On_Hook();
Transmit_Disable();
Receive_Disable();
}
/****************************************************/
/* 拨号 */
/* Phone_Number:字符串电话号码 如"83403359" */
/* 可拨号码为"0123456789ABCD*#," */
/* 其中‘,'为延时2秒 */
/* 返回 0 :拨号成功 */
/* 1 :旁置电话占用 */
/* 2 :无拨号音(未接电话线) */
/****************************************************/
unsigned char Dial(unsigned char *Phone_Number)
{
unsigned char a;
if(CheckPhone())return 1;//旁置电话占用
Off_Hook();
if(DialToneCheck == 0)
{
if(Receive_DailTone(CheckDialToneTime))return 2;//未检测到拨号音
}
delayms(OffHookDelay);
while(1)
{
a = (*Phone_Number);
if(a == '\0')break;
if(a == ','){delayms(2000);Phone_Number++;continue;}
Transmit_DTMF(a,DtmfOnTime,DtmfOffTime);
Phone_Number++;
}
return 0;
}
void Modem_Spi_Init(void)
{
PJSEL = PJSEL | pj6_RESETN;
PJDIR = PJDIR | pj6_RESETN;//OUTPUT
PJSEL = PJSEL | pj7_PHONE;
PJDIR = PJDIR & (~pj7_PHONE);//INPUT
PKSEL = PKSEL | pk0_SCLOCK;
PKDIR = PKDIR | pk0_SCLOCK;//OUTPUT
PKSEL = PKSEL | pk1_COM_DATA;
PKDIR = PKDIR | pk1_COM_DATA;//OUTPUT
PBSEL = PBSEL | pb5_RE_DATA;
PBDIR = PBDIR & (~pb5_RE_DATA);//INPUT
PJSEL = PJSEL | pj5_CSN;
PJDIR = PJDIR | pj5_CSN;//OUTPUT
PESEL = PESEL | 0x08;
PEDIR = PEDIR | 0x08;//OUTPUT
PEDATA = PEDATA | 0x08;
}
unsigned char CheckPhone(void)
{
if(PJDATA & pj7_PHONE)return 0;
else return 1;//旁置电话占用
}
void Hardware_Reset(void)
{
RESETN_ON_L;
delayms(20);
RESETN_OFF_H;
}
unsigned char SPI_Write_Read(unsigned char data)
{
unsigned char a,i;
a = 0;
SCLOCK_OFF_L;
COM_DATA_L;
for(i = 0 ; i < 8 ; i++)
{
if(data & 0x80)COM_DATA_H;
else COM_DATA_L;
SCLOCK_ON_H;
data = data << 1;
a = a << 1;
if(RE_DATA)a |= 0x01;
SCLOCK_OFF_L;
}
return(a);
}
void One_Byte_Write(unsigned char add,unsigned char data)
{
CSN_ON_L;
SPI_Write_Read(add);
SPI_Write_Read(data);
CSN_OFF_H;
}
void Two_Byte_Write(unsigned char add,unsigned char msb,unsigned char lsb)
{
CSN_ON_L;
SPI_Write_Read(add);
SPI_Write_Read(msb);
SPI_Write_Read(lsb);
CSN_OFF_H;
}
unsigned char One_Byte_Read(unsigned char add)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -