📄 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 + -