📄 main.c
字号:
//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 + -