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

📄 modem860.c

📁 用于cml860芯片收发DTMF和FSK信号
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -