📄 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"
#include "string.h"
#include "intrins.h"
#include "stdio.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 - 30; //18个RF周期
uchar field_stop; //next field stop in RF clocks
uchar fwd_01_zero = 256 - 24; //complement to fwd_01_stop,20个RF周期
uchar fwd_01_one = 256 - 56; //notmod full period '1',29个RF周期
uchar fwd_01_stop = 256 - 20; //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 == 4)
{
TR0= 0;
ET0=0; //disable T0 interrupt
TF0=0;
MOD=0;
return;
}
if (fwd_bit_phase == 1)
{
MOD=1;
TR0=0;
TH0=0xFF;
TL0 = 255-19;//field_stop;
TR0=1;
field_stop = fwd_01_stop;
//fwd_bit_phase = 2;
if(fwd_bit_sz-- > 0)
{
if(((*fwd_write_ptr++) & 1) == 1)
fwd_bit_phase = 2;
else
fwd_bit_phase = 3;
}
else
{
fwd_bit_phase = 4;
}
return;
}
MOD=0;
TR0=0;
if (fwd_bit_phase == 2)
{
TH0=0xFF;
TL0=255-55;//fwd_01_zero;
fwd_bit_phase = 1;
}
else
{
TH0=0xFF;
TL0= 255-23;//fwd_01_one;
fwd_bit_phase = 1;
}
TR0=1;
}
//串口中断标志位
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
{
uint i;
if(RI)
{
rx_finish = 0;
RI = 0;
EA = 0;
//Rxtemp = SBUF;
rx_buff[0] = SBUF;
rx_i=1;
for(;;)
{
for(i=0;i<0xfff;i++)
{
if(RI)
{
RI = 0;
rx_buff[rx_i] = SBUF;
rx_i++;
break;
}
}
if(i>=0xfff)
{
rx_finish = 1;
EA = 1;
break;
}
}
}
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 = 0x21;
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 = 16;//default values, RF/32
MaxCaptureHalfDateRate = halfDataRate + (halfDataRate >> 1); //=0x18
MaxCaptureDateRate = halfDataRate + halfDataRate + (halfDataRate >> 1); //0x28
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;
// trace(rx_buff,rx_i);
// continue;
}
else continue;
rx_finish = 0;
forward_ptr = forwardLink_data;
// num_addr = rx_buff[3];
switch(rx_buff[0])
{
case 0x00 :
ResetT5557();
break;
case 0x10 :
WakeUpT5557();
break;
case 0x11 :
GeneralRead_T5557();
break;
case 0x12 :
ReadT5557();
break;
case 0x13 :
WriteT5557();
break;
case 0x14 :
ReadT5557_PWD();
break;
case 0x15 :
WriteT5557_PWD();
break;
default :
break;
}
}
}
uchar Prepare_Cmd(uchar cmd)
{
*forward_ptr++ = cmd; //start bit
cmd = cmd>>1;
*forward_ptr++ = cmd;
return 2;
}
uchar Prepare_Lock(void)
{
*forward_ptr++ = 0;
return 1;
}
uchar Prepare_Addr( uchar addr )
{
*forward_ptr++ = (addr>>2);
*forward_ptr++ = (addr>>1);
*forward_ptr++ = addr;
return 3; //return number of emited bits
}
uchar Prepare_Data( uchar *data_tx)
{
register uchar i, j;
register uchar datas;
for(j=1; j<5; j++)
{
datas = *(data_tx + j);
for(i=8; i>0; i--)
{
*forward_ptr++ = (datas >> (i-1));
}
}
return 32; //return number of emited bits
}
// Forward Link setup function
// Requires: forwarLink_data filled with valid bits (1 bit per byte)
// fwd_bit_count set with number of bits to be sent
void SendForward(uchar fwd_bit_count)
{
uchar sync=1;
fwd_write_ptr = forwardLink_data;
fwd_bit_sz = fwd_bit_count;
fwd_bit_phase = 3;
field_stop = fwd_1st_pulse; //fwd_1st_pulse = 256-20
TR0=0;
TH0=0xff;TL0=1; //minimum startup pulse length,255
MOD=0;
TF0=0;
ET0=0; //disable T0 interrupt
TMOD=(TMOD|0x05); //计数器,16位计数器
TR0=1;
// waiting for clearing T0IE0 => command sending
while (!TF0)
{
if ((sync == 1) && (!DEMOD_OUT))
sync = 0;
if ((sync == 0) && (DEMOD_OUT))
break;
}
MOD=1; //force 1st mod pulse
fwd_bit_sz--; //prepare next bit modulation
fwd_write_ptr++;
TF0=0; //clear any pending flag
TR0=0;
TH0=0xFF;TL0= 255-60;
TR0=1;
field_stop = fwd_01_stop;
fwd_bit_phase = 2;
ET0=1; //enable overflow interrupt
// waiting for clearing T0IE0 => command sending
while ( ET0== 1 ) ;
}
//读卡程序, Manchester解码
void ManchesterRead(void)
{
uchar i,j;
uchar captured_bits_count;
//ClearCaptureBuffers();
captured_bit_count = 0;
capture_cnt = 0;
captured_byte=0;
capture_check=0;
capture_check_count=0;
buffer_capture_check=0;
compute_capture_check=0;
check_stat=0;
TR2 = 0;
TF2 = 0;
TL2 = 0;//(uchar)(~maxCaptureTimeLow); //0xd7
TH2 = 0;//(uchar)((~maxCaptureTimeLow)>>8); //0xf0, //set timer with initial time
currentMaxTimeHi = ~maxCaptureTimeHi; //0xff
last_capture = 0;//~maxCaptureTimeLow; //~0x0f28
capture_read_time_data_ptr = capture_time; // capture ptr
flag_wait=1;
ET2=1; //enable t2 interrupt
check_stat=ERR_EM4469_NEITHER_ACK; //if read card ok,check_stat will change
cap_count = 0;
TR2=1; //
while ( flag_wait ) //接收
{
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 0)
break;
}
if(i>=0xf0)
return;
capture(); //hi电平时间
cap_count++;
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 1)
break;
}
if(i>=0xf0)
return;
capture(); //low电平时间
cap_count++;
if(cap_count > 150)
break;
}
//capture_time[253]= cap_count;
//trace(capture_time,254);
check_stat=ERR_EM4469_NEITHER_ACK;
for(j=0;j<10;j++)
{
if(((halfDataRate*2+8)<capture_time[j])&&(capture_time[j]<(halfDataRate*3+8))
&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]>MaxCaptureHalfDateRate)
&&(capture_time[j+2]<(halfDataRate*3+8)))
break;
}
if(j==10)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -