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

📄 cmx865.c

📁 CMX865驱动
💻 C
字号:
/*****************************************************
This program was produced by the
ICC7.14  Professional

Project :SHS07-I
Version : Vt-1.0.01
Date    : 2008-5-29
Author  : 应志强                           
Company : DUCHY                            
Comments: 测试ok
CMX865驱动完成CMX865控制
*****************************************************/
#include "head.h"
unsigned char DTMF_TX_Busy = 0;//发送忙标志
unsigned char DTMF_TX_Num= 0;//发送数目
unsigned char CMX865_RX_Flag;//接收方式FSKorDTMF
unsigned char CID_RX_buff[max_buff];//来电显数据
unsigned char CID_RX_count= 0;//来电显数据长度
unsigned	int	temp_int;//写CMX865临时寄存器
unsigned char  CID_State=0;//识别是否授权电话
enum CID_recive_state//接收FSK 来电显解析
{
	Waite,
       Recived_55,
       Recived_02,
       Recived_long,
       Recived_num,
}CID_state=0;
/************************************************************
*   SPI initialize
*   clock rate: 1000000hz
*   CMX865方式初始化SPI
************************************************************/
void spi_init(void)
{
 	SPCR = 0x50; //setup SPI
 	SPSR = 0x00; //setup SPI
}

/***************************************************************************************************
*	SPI 传送函数
***************************************************************************************************/
unsigned char  SPI_MasterTransmit(unsigned	char cData)
{
	
	SPCR |=1<<MSTR;
	SPDR = cData;//* 启动数据传输
	while(!(SPSR & (1<<SPIF)))//* 等待传输结束
	{
		WDR();
	}
	return	SPDR;
}

/***************************************************************************************************
*	//写一个字节
***************************************************************************************************/
void		Write_SPI_Byte(unsigned	char  Data)
{
	SPI_MasterTransmit(Data);
}
/***************************************************************************************************
*	//写一个word
***************************************************************************************************/
void		Write_SPI_Word(unsigned  int  Data)
{
	unsigned  char	j;
	
	j=Data>>8;
	SPI_MasterTransmit(j);
	j=Data;
	SPI_MasterTransmit(j);
}
/***************************************************************************************************
*	//读取一个字节
***************************************************************************************************/
unsigned  char  Read_SPI_Byte(unsigned char u)
{
	return	(SPI_MasterTransmit(u));
}
/***************************************************************************************************
*	//读取一个word
***************************************************************************************************/
unsigned  int  Read_SPI_Word(void)
{
	unsigned  int  i=0x0000;
	
	i=SPI_MasterTransmit(NULL);
	i=i<<8;
	i |= SPI_MasterTransmit(NULL);
	return	i;
}
/***************************************************************************************************
*	//写地址
***************************************************************************************************/
void		Write_CMX865_Addr(unsigned  char addr)
{
	spi_init();
	M_CS(1);
	Write_SPI_Byte(addr);
	M_CS(0);
}
/***************************************************************************************************
*	//写地址和一个word数据
***************************************************************************************************/
void		Write_CMX865_AddrAndWord(unsigned  char addr,unsigned  int  Data)
{
	spi_init();
	M_CS(1);
	if(addr==Receive_Mode_addr)
	{
		if(Data==(Received_DTMF|temp_int))
		{
			CMX865_RX_Flag=1;
		}
		else
		{
			CMX865_RX_Flag=0;
		}
	}
	Write_SPI_Byte(addr);
	Write_SPI_Word(Data);
	//delay_uS(ns100);
	M_CS(0);
}
/***************************************************************************************************
*	//写地址并读取一个word 数据
***************************************************************************************************/
unsigned  int  	Read_CMX865_AddrAndWord(unsigned  char addr)
{
	unsigned  int i;
	spi_init();
	M_CS(1);
	//delay_uS(ns100);
	Write_SPI_Byte(addr);
	i= (Read_SPI_Word());
	//delay_uS(ns100);
	M_CS(0);
	return i;
}
#if 1
/***************************************************************************************************
*	//写地址并读取一个byte 数据
***************************************************************************************************/
unsigned  char  	Read_CMX865_AddrAndByte(unsigned  char addr)
{
	unsigned  char i;
	spi_init();
	M_CS(1);
	//delay_uS(ns100);
	Write_SPI_Byte(addr);
	i=  (Read_SPI_Byte(0));
	M_CS(0);
	return  i;
}
#endif
//CMX865初始化
unsigned char	  CMX865_init(unsigned char CID_ReWay)//
{
	M_Power(1);
	delay_mS(20);
	Write_CMX865_Addr(G_Reset_Command_addr);
	Write_CMX865_AddrAndWord(G_Control_Command_addr, Reset_CMX865|PowerUp);
	delay_mS(50);
	Write_CMX865_AddrAndWord(G_Control_Command_addr, NORMAL);
	if(Read_CMX865_AddrAndWord(Status_addr)&0x00ff)
	{
		M_Power(0);
		DDRB=0x00;
		PORTB=0xF8;
		delay_mS(2000);
		return	0;
	}
	else
	{	
		if(phone_state|DC_state)
		{
			temp_int = CMX865_Rx_Gain; temp_int=temp_int<<9;
			if (CID_ReWay)
			{
				Write_CMX865_AddrAndWord(Receive_Mode_addr, Received_DTMF|temp_int);//准备接受
				phone_state |= CID_Way;//默认DTMF接受
				Tx_string("DTMF Re");
			}
			else
			{
				Write_CMX865_AddrAndWord(Receive_Mode_addr, Received_FSK|temp_int);//准备接受
				phone_state &=~ CID_Way;//默认FSK接受
				Tx_string("FSK Re");
			}
		}
		else//进入掉电状态
		{
			Write_CMX865_Addr(G_Reset_Command_addr);
			Write_CMX865_AddrAndWord(G_Control_Command_addr, Reset_CMX865);
		}
		return	1;
	}
	
}
/*
void	  CMX865_IRQ_SET(unsigned char  irq)//
{
	 Write_SPI_Byte(G_Control_Command_addr);
	 Write_SPI_Word(NORMAL|irq);
}

void  DTMF_TX_SET(void)//设置为DTMF拨号
{
	Write_CMX865_AddrAndWord(Transmit_Mode_addr, Transmit_disable);
}
*/
/***************************************************************************************************
*	中断处理,读取收到的来电显示数据
***************************************************************************************************/
void    CMX856_IRQ_Deal(void)//处理CMX865产生的中断
{
	unsigned int  i; 
	unsigned char  j; 
	static unsigned char  k=0; 
	static unsigned char  fsk_long=0; 
	i =  Read_CMX865_AddrAndWord(Status_addr);
	if(CMX865_RX_Flag)
	{
		if(i&0x0020)//收到DTMF
		{
			j=i&0x000f;
			if((j==M_or_P_key_value)||(j==Permit_Applay))
			{
				Rx_P_or_M=j;
			}
			else
			{
				if(CID_RX_count<max_buff)
				{
					if(j==key_0)
					{
						CID_RX_buff[CID_RX_count++]=0;
					}
					else if((j>0)&&(j<10))
					{
						CID_RX_buff[CID_RX_count++]=j;
					}
				}
			}
                    #if CID_Test
			Tx_char(j);
                    #endif
		}
		else
		{
			Read_CMX865_AddrAndByte(Receive_Data_addr);
			//Tx_char(Read_CMX865_AddrAndByte(Receive_Data_addr));
		}
	}
	else
	{
		if(i&0x0040)//收到FSK
		{
			j=Read_CMX865_AddrAndByte(Receive_Data_addr);
                     if((j>='0')&&(j<='9'))
                     {
                            if(j==Permit_Num_Buff[CID_State])
                            {
                                    CID_State++;
                                    if(CID_State==Permit_Num_Buff[max_buff])
                                    {
                                           // phone_state|=CID_Received;
                                    }
                            }
                            else
                            {
                                    CID_State=0;
                            }
                     }
                     else
                      {
                            CID_State=0;
                      }
                    #if 0
			switch(CID_state)
			{
				case Waite:
				{
					if(j==0x55)
					{
						k++;
						if(k>2)
						{
							k=0;
							CID_state=Recived_55;
							//Tx_char(1);
						}
					}
					else
					{
						k=0;
					}
					break;
				}
				case Recived_55:
				{
					if(j==0x02)
					{
						CID_state=Recived_02;
						//Tx_char(2);
					}
					else if(j==0x04)
					{
						CID_state=Recived_02;
					}
					break;
				}
				case Recived_02:
				{
					if(j<0x10)
					{
						fsk_long=j;
					}
					else
					{
						fsk_long=max_buff;
					}
					//Tx_char(fsk_long);
					CID_RX_count=0;
					CID_state=Recived_long;
					break;
				}	
				case Recived_long:
				{
					if(CID_RX_count<fsk_long)
					{
						CID_RX_buff[CID_RX_count++]=j-'0';
						/*
						if(CID_RX_count==max_buff)
						{
							CID_RX_count=max_buff-1;
						}
						*/
					}
					else
					{
						phone_state|=CID_Received;
						//Tx_char(255);
						CID_state=Waite;
					}
					break;
				}	
				default :
					break;
			}
                     #endif
			#if CID_Test
			Tx_char(j);
                    #endif
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -