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

📄 modem860.c

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