📄 main.c
字号:
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 1) //,test low time 等待高电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
icr=count_module();
capt=icr-last_capture;
last_capture=icr;
if((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==0))
{ //0.5p low
flag_invalid_edge_manchester=1;
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
else if ((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==1))
{ //0.5p low
flag_invalid_edge_manchester=0;
}
else if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
{ //1p low
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
times_capture_manchester++;
//-----
for(i=0;i<0xf8;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
return_00();
return;
}
icr=count_module();
capt=icr-last_capture;
last_capture=icr;
if((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==0))
{ //0.5p hi
flag_invalid_edge_manchester=1;
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
else if ((capt<MaxCaptureHalfDateRate)&&(flag_invalid_edge_manchester==1))
{ //0.5p hi
flag_invalid_edge_manchester=0;
}
else if ((capt>MaxCaptureHalfDateRate)&&(capt<MaxCaptureDateRate))
{ //1p hi
if((times_capture_manchester%2)==0)
{
array_subscript=(count_autodection_bit>>3);
bit_subscript=(count_autodection_bit%8);
autodection_data[array_subscript]=(autodection_data[array_subscript]|(1<<bit_subscript));
}
count_autodection_bit++;
}
times_capture_manchester++;
}
//数据提取:找标志头、找停止位、检查校验和,一旦正确提取数据退出循环
if(count_autodection_bit>64)
{
flag_header_found=0;
for (j=0;j<(count_autodection_bit-54);j++) //找标志头9 bit 1
{
array_subscript=(j>>3);
bit_subscript=(j%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))==0) //不等于0,即可判断此位为1
{
flag_header_found=1;
for (k=(j+1);k<(j+10);k++)
{
array_subscript=(k>>3);
bit_subscript=(k%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))==0)
{
flag_header_found=0;
break;
}
}
if(flag_header_found==1) break;
}
}
flag_stop_found=0;
if (flag_header_found==1)//停止位
{
array_subscript=((j+64)>>3);
bit_subscript=((j+64)%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))==0) flag_stop_found=1;
}
flag_line_check=0;
if (flag_stop_found==1) //行校验
{
for (k=(j+10);k<(j+60);k=(k+5))
{
check=0;
for(l=k;l<(k+4);l++)
{
array_subscript=(l>>3);
bit_subscript=(l%8);
check=check^((autodection_data[array_subscript]>>bit_subscript)&1);
}
array_subscript=(l>>3);
bit_subscript=(l%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))!=(check<<bit_subscript))
{
flag_line_check=0;
break;
}
flag_line_check=1;
}
}
flag_column_check=0;
if (flag_line_check==1) //列校验
{
for(k=(j+10);k<(j+14);k++)
{
check=0;
for(l=k;l<(k+50);l=(l+5))
{
array_subscript=(l>>3);
bit_subscript=(l%8);
check=check^((autodection_data[array_subscript]>>bit_subscript)&1);
}
array_subscript=(l>>3);
bit_subscript=(l%8);
if ((autodection_data[array_subscript]&(1<<bit_subscript))!=(check<<bit_subscript))
{
flag_column_check=0;
break;
}
flag_column_check=1;
}
}
if (flag_column_check==1) //提取数据
{
custID=0;
DataItem[0]=0;DataItem[1]=0;DataItem[2]=0;DataItem[3]=0;
//客户ID
bit_number=0;
for (k=(j+10);k<(j+14);k++)
{
array_subscript=(k>>3);
bit_subscript=(k%8);
custID=(custID|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
bit_number++;
}
for (k=(j+15);k<(j+19);k++)
{
array_subscript=(k/8);
bit_subscript=(k%8);
custID=(custID|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
bit_number++;
}
//data
k=0;
bit_number=0;
for(l=(j+20);l<(j+59);l++)
{
if (((l-j-20)%5)!=4)
{
array_subscript=(l>>3);
bit_subscript=(l%8);
DataItem[k]=(DataItem[k]|(((autodection_data[array_subscript]&(1<<bit_subscript))>>bit_subscript)<<bit_number));
bit_number++;
if (bit_number==8)
{
bit_number=0;
k++;
}
}
}
}
}
//向PC返回响应信息
check_stat=0x14;
if (flag_column_check==1)
{
check_stat=0;
flag_column_check=0;
}
tx_buff[0]=0x02;
tx_buff[1]=0x0a;
tx_buff[2]=0x86;
tx_buff[3]=check_stat;
tx_buff[4]=1; //RF/64
tx_buff[5]=custID;
tx_buff[6]=DataItem[3]; //读EM4100数据位倒置
tx_buff[7]=DataItem[2];
tx_buff[8]=DataItem[1];
tx_buff[9]=DataItem[0];
tx_buff[10]=(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[11]=0x03;
trace(tx_buff,12);
}
uchar Prepare_Cmd( uchar cmd )
{
register uchar line_parity;
*forward_ptr++ = 0; //start bit
*forward_ptr++ = 0;
*forward_ptr++ = cmd;
line_parity = cmd;
cmd >>= 1;
*forward_ptr++ = cmd;
line_parity ^= cmd;
cmd >>= 1;
*forward_ptr++ = cmd;
line_parity ^= cmd;
*forward_ptr++ = (line_parity & 1);
return 6;
}
uchar Prepare_Addr( uchar addr )
{
register uchar line_parity;
*forward_ptr++ = addr;
line_parity = addr;
addr >>= 1;
*forward_ptr++ = addr;
line_parity ^= addr;
addr >>= 1;
*forward_ptr++ = addr;
line_parity ^= addr;
addr >>= 1;
*forward_ptr++ = addr;
line_parity ^= addr;
*forward_ptr++ = 0;
*forward_ptr++ = 0;
*forward_ptr++ = (line_parity & 1);
return 7; //return number of emited bits
}
uchar Prepare_Data( uint data_low, uint data_hi)
{
register uchar line_parity;
register uchar column_parity;
register uchar i, j;
register uint datas;
datas = data_low;
column_parity = 0;
for(i=0; i<4; i++)
{
line_parity = 0;
for(j=0; j<8; j++)
{
line_parity ^= datas;
column_parity ^= (datas&1) << j;
*forward_ptr++ = datas;
datas >>= 1;
}
*forward_ptr++ = line_parity;
if(i == 1)
datas = data_hi;
}
for(j=0; j<8; j++)
{
*forward_ptr++ = column_parity;
column_parity >>= 1;
}
*forward_ptr = 0;
return 45; //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= field_stop;
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 ) ;
}
void Wait(uint period)
{
TR2 = 0;
TF2=0;
TL2=(uchar)(~period); TH2=(uchar)((~period)>>8);
currentMaxTimeHi = 0xFF;
ET2=1;
TR2=1;
flag_wait=1;
while ( flag_wait);
}
//读卡程序, 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;
for(i=0;i<120;i++) //2006-5-13 14:19
{
capture_time[i]=0xff;
}
TR2 = 0;
TF2 = 0;
TL2 = (uchar)(~maxCaptureTimeLow); //0xd7
TH2 = (uchar)((~maxCaptureTimeLow)>>8); //0xf0, //set timer with initial time
currentMaxTimeHi = ~maxCaptureTimeHi; //0xff
last_capture = ~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
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
return;
}
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 1) //等待高电平,超时退出
break;
}
if(i>=0xf0)
{
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
return;
}
TR2=1; //
while ( flag_wait ) //接收
{
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 0)
break;
}
if(i>=0xf0)
return;
capture(); //hi电平时间
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 1)
break;
}
if(i>=0xf0)
return;
capture(); //low电平时间
}
check_stat=ERR_EM4469_NEITHER_ACK;
for (j=0;j<5;j++)
{
if (((j%2)==0)&&(capture_time[j]<MaxCaptureHalfDateRate)\
&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]>MaxCaptureHalfDateRate)\
&&(capture_time[j+3]>MaxCaptureHalfDateRate)&&(capture_time[j+4]>MaxCaptureHalfDateRate)\
&&(capture_time[j+5]>MaxCaptureHalfDateRate))
{
check_stat = UART_MESSAGE_OK;
break;
}
if (((j%2)==0)&&(capture_time[j]<MaxCaptureHalfDateRate)\
&&(capture_time[j+1]<MaxCaptureHalfDateRate)&&(capture_time[j+2]<MaxCaptureHalfDateRate)\
&&(capture_time[j+3]<MaxCaptureHalfDateRate)&&(capture_time[j+4]<MaxCaptureHalfDateRate)\
&&(capture_time[j+5]<MaxCaptureHalfDateRate)&&(capture_time[j+6]<MaxCaptureHalfDateRate)\
&&(capture_time[j+7]<MaxCaptureHalfDateRate)&&(capture_time[j+8]>MaxCaptureHalfDateRate))
{
check_stat = ERR_EM4469_NACK;
break;
}
}
captured_bits_count=0;
if (check_stat==UART_MESSAGE_OK)
{
//解码
for (i=(j+6);;i++)
{
if (capture_time[i]<MaxCaptureHalfDateRate)
{
if((i%2)==0)
{
store_bit(0);
}
else
{
store_bit(1);
}
i++;
captured_bits_count++;
if (captured_bits_count>45) //45位数据结构,参考EM4469文档
break;
}
else if((capture_time[i]>MaxCaptureHalfDateRate) &&(capture_time[i]<MaxCaptureDateRate))
{
if((i%2)==0)
{
store_bit(1);
}
else
{
store_bit(0);
}
captured_bits_count++;
if (captured_bits_count>45) //45位数据结构,参考EM4469文档
break;
}
else
{
check_stat=ERR_EM4469_FLOWLINK_ERR;
break;
}
}
}
if ((check_stat!=ERR_EM4469_NEITHER_ACK)&&(check_stat!=ERR_EM4469_NACK)&&(check_stat!=ERR_EM4469_FLOWLINK_ERR))
{
if (((capture_check&0x10)!=0)||((compute_capture_check&0x0f)!=(capture_check&0x0f)))
{
check_stat=ERR_EM4469_PARITY_ERR;
}
else
{ //capture_data[4] CRC
if ((capture_data[0]^capture_data[1]^capture_data[2]^capture_data[3])!=capture_data[4])
{
check_stat=ERR_EM4469_PARITY_ERR;
}
else
{
check_stat=UART_MESSAGE_OK; //读卡成功
}
}
}
//trace(capture_time,120);
//trace(capture_data,32);
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
}
//写卡程序,Manchester解码
void ManchesterWrite(void)
{
uchar i,j;
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; //clear pending interrupts
TL2=(uchar)(~maxCaptureTimeLow); TH2=(uchar)((~maxCaptureTimeLow)>>8) ; //set timer with initial time
currentMaxTimeHi = ~maxCaptureTimeHi;
last_capture=~maxCaptureTimeLow;
capture_read_time_data_ptr=capture_time;
flag_wait=1;ET2=1;
for(i=0;i<0xf0;i++)
{
if(DEMOD_OUT == 0) //等待低电平,超时退出
break;
}
if(i>=0xf0)
{
for(i=0;i<120;i++)
{
capture_time[i]=0xff;
}
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -