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

📄 main.c

📁 功能:arm7平台的I2c驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//2006-4-27 13:10
//更改为默认 manchester,RF/64,软件可读写EM4469,不能更改设置读卡器参数,可读参数2006-4-27 12:01
//不能使用默认读命令
//支持PCB端软件:1.EM4469 RFID Development Kit Application Software  2.EM4469 Read Only Application Software
//支持卡片:EM4469,EM410X

#include "main.h"


////EM4095控制线定义
sbit	MOD = P1^1;
sbit	SHD = P1^2;
sbit	DEMOD_OUT = P3^3;
sbit    RDY_CLK = P3^4;
sbit    speak = P1^3;

union	myunion
{
	uint	word;
	struct
	{
		uchar high2;
		uchar low2;
	}bytes;
};


union myunion count_timer2;
uchar fwd_1st_pulse = 256 - 20;            	//20个RF周期
uchar field_stop;                          	//next field stop in RF clocks
uchar fwd_01_zero   = 256 - 20;            	//complement to fwd_01_stop,20个RF周期
uchar fwd_01_one    = 256 - 29;           	//notmod full period '1',29个RF周期
uchar fwd_01_stop   = 256 - 9;            	//9个RF周期
uchar edge=1;                         		//for manchester usage


// 定时器0中断服务程序
// 写操作,控制MOD
void Timer0_int(void) interrupt 1 using 1
{	          
	TF0=0;						//clear interrupt flag
    if (fwd_bit_phase == 1) 
    {                     
      	MOD=1;  
		TR0=0;                     
      	TH0=0xFF;
      	TL0 = field_stop;
		TR0=1;
      	field_stop = fwd_01_stop;             
      	fwd_bit_phase = 2;
      	return;
    }
    
    MOD=0;                   
	TR0=0;
    if (fwd_bit_phase == 2)                 
    {
    	TH0=0xFF;
    	TL0=fwd_01_zero;
    }
    else
    {
    	TH0=0xFF;
    	TL0= fwd_01_one;
    }                    
	TR0=1;

    if(fwd_bit_sz-- > 0) 
    {                   
      	if(((*fwd_write_ptr++) & 1) == 1) 
        	fwd_bit_phase = 3;
      	else
        	fwd_bit_phase = 1;
    }
    else 
    {
      	TR0= 0;                            
      	ET0=0;      		//disable T0 interrupt              
      	TF0=0;                     
    }
}
//串口中断标志位
uchar Rxtemp;
bit rx_start;
bit rx_finish;
bit rx_lenflag;
uchar rx_i;
uchar rx_len;
bit MYTI;

//串口中断服务程序
void serial(void) interrupt 4 using 3 
{	
    if(RI)
    {
        RI = 0;
        Rxtemp = SBUF;   
        if(rx_start == 0)
        {
	        if(Rxtemp == STX)
	        {
//	        	clearrx_buff();   //清接收缓冲
	        	rx_start = 1;
	        	rx_finish = 0;
	        	rx_lenflag = 0;
	        	rx_i = 0;   //接收到的个数
	        	rx_len = 0;
	        	rx_buff[0] = Rxtemp;
	        	rx_i++;     //长度+1
	        }
	        return;
        }
        if(rx_lenflag == 0)
        {
        	rx_lenflag = 1;
        	rx_buff[1] = Rxtemp;
	        rx_i++;
	        rx_len = Rxtemp;
	        if(rx_len > MAX_RXNUM)
	        {
	        	rx_start = 0;
	        	rx_finish = 0;
	        	rx_lenflag = 0;
	        }	        
	        return;
        }
        rx_buff[rx_i] = Rxtemp;
	    rx_i++;
	    rx_len--;
	    if(rx_len ==0)
	    {
	    	rx_start = 0;
	        rx_finish = 1;
	        rx_lenflag = 0;
	        if(rx_buff[rx_i-1] != ETX)
	        {	        	
	        	rx_finish = 0;	        	
	        }	        
	    }       
		return;
	}
	if(TI)
	{
		TI = 0;
		MYTI = 1;		
 	}
}

// ==================================================================
void Timer2_int(void) interrupt 5 using 2
{
  	if (currentMaxTimeHi != 0xFF) 
  	{                 
    	currentMaxTimeHi = 0xFF;
	} 
	else 
	{
    	flag_wait=0;
    	ET2=0;  
  	}
}

void main(void)
{
	uchar i;
	uchar checksum;
	//使能winbond W78E365内部1K SRAM
	CHPENR = 0x87;
    CHPENR = 0x59;
    CHPCON = (CHPCON|0x10);
 	CHPENR = 0x00;

	//串口,定时器1,双倍速率,9600bps
	SCON = 0x50;		
	TMOD = 0x20;
	TH1 = 0xf4;TL1 = 0xf4;
	PCON = PCON|0x80;
	TR1 = 1;
	ES = 1;
	TI = 0;RI = 0;		
	EA = 1;
	C_T2 = 1;				//T2脚的负跳变计数,TH2,TL2自动重装
	//EM4095 初始化
	MOD = 0;
	SHD = 0;
	//串口接收初始化
	rx_start = 0;
    rx_finish = 0;
	rx_lenflag = 0;
    rx_len = 0;				//还要接收的数据个数
	rx_i = 0;               //接收到个数
	MYTI = 0;
	
	//配置读卡器默认值,RF/64,Manchester解码
    config_delayed = 0;
    config_lwr = 8;                      
    config_raw = 0;	

	halfDataRate = 32;//default values, RF/64
	MaxCaptureHalfDateRate = halfDataRate + (halfDataRate >> 1);		//=48 
	MaxCaptureDateRate = halfDataRate + halfDataRate + (halfDataRate >> 1);	//=80
	lwr = config_lwr;
	delayed = config_delayed;
	raw = config_raw;
	//forward_link_type = 0x01; 
	maxTLogin = 4 + (4 + 9) * 2 * (uint)halfDataRate;		//0x0344
	maxTWrite = 1144 + (4 + 8) * 2 * (uint)halfDataRate;
	maxTWriteRaw = 1144 + (4 + 5 + 54) * 2 * (uint)halfDataRate;
	maxTRead = (100) + 4 + (5 + 54) * 2 * (uint)halfDataRate;		//3880
	maxTDisable = maxTLogin;
	maxTDefaultRead = 2*((lwr-4)*4*8)*2*((uint32)halfDataRate);
	tpp_period = 4 + 2 * (uint)halfDataRate - 4;		//64
	twr_period = (68 + 64 + 896 + 116) + 2 * (uint)halfDataRate - 4;
	
	while(1)
	{
		if(rx_finish == 1)//串口完成合法的接收
	    {	    	
		  	rx_finish = 0;
		    checksum = rx_buff[1];
			for(i=2;i<=(rx_buff[1]-1);i++)
			{
				checksum ^= rx_buff[i];
			}
			if (checksum != rx_buff[rx_buff[1]])	//检查校验和	
				continue;
	    }
	    else continue;
				
		forward_ptr = forwardLink_data;	
//		num_addr = rx_buff[3];
		switch(rx_buff[2]) 			
		{
			case 0x80 :
				ReadWordToPC();		//读卡
				break;
			case 0x81 :
				WriteWordtoCard();		//写卡
				break;
			case 0x82 :
				Login();			//
				break;
			case 0x83 :
				Disable();
				break;
			case 0x84 : 
				PCLinkReader();		//PC要求与读卡器连接
				break;
			case 0x85 : 
				//DefaultRead();		//
				break;
			case 0x86 : 
				Readonly_autodetection();		//只读,自动检测,可读4100,配置4469,读4469
				break;			
			case 0xFB :
				GetReaderConfiguration();		//读取读卡器的配置参数
				break;
			case 0xFC :
				SetReaderConfiguration();		//设置读卡器的配置参数
				break;
			case 0xFD :
				ReadStatusToPC();				//读卡
				break;
			case 0xFE : 
				FieldSwitch();
				break;		
			default : 
				break;
		}
	}
}

//读卡数据,区地址=rx_buff[3],发送到PC,本版本支持的PC演示软件可以看到相应的数据
void ReadWordToPC(void)
{
	uchar fwd_bit_count;	
	fwd_bit_count = Prepare_Cmd( FWD_CMD_READ );
	fwd_bit_count += Prepare_Addr(rx_buff[3]);
	SendForward(fwd_bit_count);		
	Wait(tpp_period);		  
	maxCaptureTimeLow = maxTRead; 		//=3880
	maxCaptureTimeHi = 0;		  
	ManchesterRead();			
	tx_buff[0]=0x02;		//帧头
	tx_buff[1]=0x09;		//帧信息长度,从tx_buff[2]开始计算,到tx_buff[10]=0x03结束
	tx_buff[2]=0x80;		//命令字
	tx_buff[3]=check_stat;
	tx_buff[4]= rx_buff[3];		//地址
	tx_buff[5]=capture_data[0];	//数据
	tx_buff[6]=capture_data[1];	//数据
	tx_buff[7]=capture_data[2];	//数据
	tx_buff[8]=capture_data[3];	//数据
	tx_buff[9]=(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]^tx_buff[8]);
	//tx_buff[9]是校验和
	tx_buff[10]=0x03;		//帧结束标志
	trace(tx_buff,11);		//发送到PC 11个字节
}

//写PC传过来的数据到ID卡上
void WriteWordtoCard(void)
{
	uchar fwd_bit_count;

	fwd_bit_count = Prepare_Cmd( FWD_CMD_WRITE );
  	fwd_bit_count += Prepare_Addr(rx_buff[3]);
  	fwd_bit_count += Prepare_Data(( ((uint)rx_buff[5] << 8) + rx_buff[4]), ( ((uint)rx_buff[7] << 8) + rx_buff[6]));
	if (rx_buff[3] == 0x04)
	{			//32位配置字
		
		halfDataRate = 32;// datarate = RF/64
		MaxCaptureHalfDateRate = halfDataRate + (halfDataRate >> 1);    //=48
		MaxCaptureDateRate = halfDataRate + halfDataRate + (halfDataRate >> 1);		//=80
		lwr = config_lwr;
		delayed = config_delayed;
		raw = config_raw;
		//forward_link_type = 0x01; 
		maxTLogin = 4 + (4 + 9) * 2 * (uint)halfDataRate;
		maxTWrite = 1144 + (4 + 8) * 2 * (uint)halfDataRate;
		maxTWriteRaw = 1144 + (4 + 5 + 54) * 2 * (uint)halfDataRate;
		maxTRead = (100) + 4 + (5 + 54) * 2 * (uint)halfDataRate;
		maxTDisable = maxTLogin;
		maxTDefaultRead = 2*((lwr-4)*4*8)*2*((uint32)halfDataRate);
		tpp_period = 4 + 2 * (uint)halfDataRate - 4;		//64
		twr_period = (68 + 64 + 896 + 116) + 2 * (uint)halfDataRate - 4;
	}

	SendForward(fwd_bit_count);	
	Wait(twr_period);
	maxCaptureTimeHi = 0;
	maxCaptureTimeLow = maxTWrite;
	
	ManchesterWrite();

	tx_buff[0]=0x02;
	tx_buff[1]=0x04;
	tx_buff[2]=0x81;
	tx_buff[3]=check_stat;
	tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);
	tx_buff[5]=0x03;
	trace(tx_buff,6);
}

//控制天线命令
void FieldSwitch(void)
{
	if (rx_buff[3] & 1 )
	{
		SHD=0;			//打开天线
	}
	else 
	{
		SHD=1;			// 关闭天线
	}
	tx_buff[0]=0x02;		//帧头
	tx_buff[1]=0x04;		//长度
	tx_buff[2]=0xfe;		//命令
	tx_buff[3]=0;
	tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);		//检验和
	tx_buff[5]=0x03;		//帧结束
	trace(tx_buff,6);
}

//不可用,匹配PC演示程序,直接返回 设置成功
void SetReaderConfiguration(void)
{
	tx_buff[0]=0x02;
	tx_buff[1]=0x04;
	tx_buff[2]=0xfc;
	tx_buff[3]=0;
	tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);
	tx_buff[5]=0x03;
	trace(tx_buff,6);
}

//读取DEMO读卡器的配置参数
void GetReaderConfiguration(void)
{
	uchar q;	
	q = 1;  	                         
	get_settings_low = (q<<6) | (halfDataRate - 1);
	q = (q >> 2) | (delayed << 4) | ((lwr & 3) << 6);
	get_settings_low |= (uint)q << 8;
	get_settings_hi = ((raw << 6) | (lwr >> 2));// | (forward_link_type >> 1);

	tx_buff[0]=0x02;
	tx_buff[1]=0x08;
	tx_buff[2]=0xfb;
	tx_buff[3]=0;
	tx_buff[4]=(uchar)get_settings_low;
	tx_buff[5]=get_settings_low>>8;
	tx_buff[6]=(uchar)get_settings_hi;
	tx_buff[7]=get_settings_hi>>8;
	tx_buff[8]=(tx_buff[1]^tx_buff[2]^tx_buff[3]^tx_buff[4]^tx_buff[5]^tx_buff[6]^tx_buff[7]);
	tx_buff[9]=0x03;
	trace(tx_buff,10);
}

void Disable(void)
{
	uchar fwd_bit_count;
    fwd_bit_count = Prepare_Cmd( FWD_CMD_DISABLE );
    fwd_bit_count += Prepare_Data( 0xFFFF, 0xFFFF );
    SendForward(fwd_bit_count);	   
    Wait(tpp_period);	   
    maxCaptureTimeLow = maxTDisable; 
    maxCaptureTimeHi = 0;

	ManchesterRead();

	tx_buff[0]=0x02;
	tx_buff[1]=0x04;
	tx_buff[2]=0x83;
	tx_buff[3]=check_stat;
	tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);
	tx_buff[5]=0x03;
	trace(tx_buff,6);
}

void Login(void)
{
	uchar fwd_bit_count;
	fwd_bit_count = Prepare_Cmd( FWD_CMD_LOGIN );
	fwd_bit_count += Prepare_Data(( ((uint)rx_buff[4] << 8) + rx_buff[3]), ( ((uint)rx_buff[6] << 8) + rx_buff[5]));
	SendForward(fwd_bit_count);
	Wait(tpp_period);
	maxCaptureTimeLow = maxTLogin; 
    maxCaptureTimeHi = 0;
	ManchesterWrite();
	tx_buff[0]=0x02;
	tx_buff[1]=0x04;
	tx_buff[2]=0x82;
	tx_buff[3]=check_stat;
	tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);
	tx_buff[5]=0x03;
	trace(tx_buff,6);
}

  
void PCLinkReader(void)
{
	tx_buff[3]=UART_MESSAGE_OK;
	tx_buff[0]=0x02;
	tx_buff[1]=0x04;
	tx_buff[2]=0x84;
	tx_buff[4]=(tx_buff[1]^tx_buff[2]^tx_buff[3]);
	tx_buff[5]=0x03;
	trace(tx_buff,6);

⌨️ 快捷键说明

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