📄 msr.c
字号:
/****************************************************************************
* *
* File: MSR.C (Source) *
* *
* Description: 87C52-Firmware for mifare (R) Serial Reader (MSR + SerMMM) *
* *
*****************************************************************************
* *
* Version | Date | Description *
* --------+----------+----------------------------------------------------- *
* | | MEDIUM_TIMEOUT = 16 (1.5 ms) *
* | | LONG_TIMEOUT = 95 (9.0 ms) *
* | | mifs_write, mifs_transfer: SHORT_TIMEOUT -> MEDIUM_T.*
* V1.00 | | adaption of check_write *
* | | commands 0x56 and 0x57 added *
* *
****************************************************************************/
#include <reg52.h>
#define NO_TIMER2
#include <string.h>
#include <intrins.h>
#define __SRC
#include "msr.h"
#undef __SRC
#include "lll_msr.h"
// Serial Number of the MSR/MMM (at the Top of Code Memory: 8 kByte)
uchar code Snr_MSR[4] _at_ 0x1FFC;
// Release Number of the Firmware
#ifdef MMM
uchar code SW_Rel[] = "\n\r Rongcai(V1.00 16.03.01)\n\r";
#else
uchar code SW_Rel[] = "\n\r Rongcai(V1.00 16.03.01) \n\r";
#endif
static uint Crc;
// Local Prototypes
void main(void);
void init(void);
void cmd_execution(void);
void putchar(uchar c);
// Interrupt Service Routines
void isr_timer0(void);
void isr_ext_intr1(void);
void isr_UART(void);
/****************************************************************************
* *
* Function: main *
* *
* Input: - *
* Output: - *
* *
****************************************************************************/
void main(void)
{
init();
auto_baud();
while (1)
{
auto_baud();
if (CmdValid)
{
CmdValid = FALSE;
cmd_execution();
CALL_isr_UART();
Idle = FALSE;
}
else if (Idle)
{
auto_baud();
idle_mifs_request();
auto_baud();
}
else
{
delay_10ms(10);
}
auto_baud();
MCM_CS =0;
MCM_CRCDATA = 0; // Because of missing internal MIFSLS1x2
MCM_CS =1;
// pull-ups (reduces current consumption)
auto_baud();
}
}
/****************************************************************************
* *
* Function: init *
* *
* Input: - *
* Output: - *
* *
* Description: *
* *
* execute the initialize of the machine *
* *
****************************************************************************/
void init(void)
{
EA = TRUE; // Enable all interrupts
EX1 = FALSE;
// EX1 = TRUE; // Enable external interrupt 1 (overvoltage)
// RS485_DE = ON; // Enable RS485 Transmitter
CmdReceived = FALSE;
CmdValid = FALSE;
Quit = FALSE;
LLfReady = TRUE;
SendReady = TRUE;
Idle = TRUE;
RepCnt = 0;
RecvState = RECV_STX;
EnableTransferCmd = FALSE;
CheckByteCnt = BCC_CHECKBYTECNT;
#ifdef AUTODELAY
DelayRate = 0;
DelayRateLocked = TRUE;
#endif
PCON = 0x80; // SMOD = 1;
SCON = 0x50; // Mode 1, 8-bit UART, enable receiption
T2CON = 0x30; // add in 2001;
AutoBaud = TRUE;
TMOD = 0x20; // Timer 1, mode 2, 8-bit auto reload,
// Timer 0, mode 0, 13-bit counter
Capt_L = 0;
Capt_H = 0;
Enable_LEDs = TRUE;
LED(GRUEN, OFF);
if (Enable_LEDs){
delay_10ms(20);
}
#ifdef MMM
LED(GELB, OFF);
#endif
LED(GRUEN, ON);
TOGGLE_WD();
}
/****************************************************************************
* *
* Function: cmd_execution *
* *
* Input: SerBuffer[] *
* Output: SerBuffer[] *
* *
* Description: *
* *
* according to the cmd received,to act the command *
****************************************************************************/
void cmd_execution(void)
{
uchar Status;
uchar len;
uchar cmd;
uchar adr;
uchar idata tmp[16];
uchar idata snr[4];
uchar idata size;
uchar idata tt[2];
len = SerBuffer[LENGTH];
SerBuffer[LENGTH] = 0;
cmd = SerBuffer[COMMAND];
switch (cmd)
{
case 0x40: // HL-Authentication
Status = mifs_request(SerBuffer[HLREQMODE] | ALL, tt);
if (Status != OK)
{
break;
}
Status = mifs_select(&SerBuffer[HL_SERNR], &size);
if (Status != OK)
{
break;
}
Status = mifs_authentication(SerBuffer[HLAUTHMODE], SerBuffer[HLSECNR]);
break;
case 0x41: // Request
Status = mifs_request(SerBuffer[MODE], &SerBuffer[TAGTYPE]);
if (Status == OK)
{
SerBuffer[LENGTH] = 2;
}
break;
case 0x42: // Anticoll
Status = mifs_anticoll(SerBuffer[BCNT], &SerBuffer[SERNR]);
if (Status == OK)
{
SerBuffer[LENGTH] = 4;
}
break;
case 0x43: // Select
Status = mifs_select(&SerBuffer[SERNR], &SerBuffer[SIZE]);
if (Status == OK)
{
SerBuffer[LENGTH] = 1;
}
break;
case 0x44: // Authentication
Status = mifs_authentication(SerBuffer[MODE], SerBuffer[SECNR]);
break;
case 0x45: // Halt
Status = mifs_halt();
break;
case 0x46: // Read
Status = mifs_read(SerBuffer[ADR], &SerBuffer[ADR]);
if (Status == OK)
{
SerBuffer[LENGTH] = 16;
}
break;
case 0x47: // Write
Status = mifs_write(SerBuffer[ADR], &SerBuffer[DATABYTES]);
break;
case 0x48: // Increment
Status = mifs_increment(SerBuffer[ADR], &SerBuffer[VALUE]);
break;
case 0x49: // Decrement
Status = mifs_decrement(SerBuffer[ADR], &SerBuffer[VALUE]);
break;
case 0x4A: // Restore
Status = mifs_restore(SerBuffer[ADR]);
break;
case 0x4B: // Transfer
if (EnableTransferCmd)
{
Status = mifs_transfer(SerBuffer[ADR]);
}
else
{
Status = W_CODE;
}
break;
case 0x4C: // Load Key
adr = (len == 18)? NKEY8 : NKEY6;
Status = mifs_load_key(SerBuffer[MODE],
SerBuffer[SECNR],
(KEY idata *)&SerBuffer[TKEY],
(KEY idata *)&SerBuffer[adr]);
break;
case 0x4D:
if (SerBuffer[MODE] == SER_BCC)
{
CheckByteCnt = BCC_CHECKBYTECNT;
}
else
{
CheckByteCnt = CRC_CHECKBYTECNT;
}
Status = OK;
break;
case 0x4E: // Reset
mifs_reset(&SerBuffer[TIME]); ////TIME = 3;
Status = OK;
break;
case 0x4F: // Get Info
if ((len == 0) || (len == 1 && SerBuffer[MODE] == 1)) ///MODE = 3
{
for (adr = INFO; adr < INFO_CNT + INFO; adr++) ///INFO=3 ; INFO_CNT=18
{
SerBuffer[adr] = SW_Rel[INFO_TXT - INFO + adr]; ////INFO_TXT=11
}
SerBuffer[adr++] = ' ';
SerBuffer[adr++] = '0';
SerBuffer[adr++] = 'x';
SerBuffer[adr++] = xtoa_h(Snr_MSR[3]);
SerBuffer[adr++] = xtoa_l(Snr_MSR[3]);
SerBuffer[adr++] = xtoa_h(Snr_MSR[2]);
SerBuffer[adr++] = xtoa_l(Snr_MSR[2]);
SerBuffer[adr++] = xtoa_h(Snr_MSR[1]);
SerBuffer[adr++] = xtoa_l(Snr_MSR[1]);
SerBuffer[adr++] = xtoa_h(Snr_MSR[0]);
SerBuffer[adr++] = xtoa_l(Snr_MSR[0]);
SerBuffer[adr++] = '\0';
SerBuffer[LENGTH] = adr - INFO; ///LENGTH IS DEFINE TO 2
}
else
{
if (SerBuffer[MODE] == 2)
{
SerBuffer[INFO] = (uchar) Capt;
SerBuffer[INFO + 1] = (uchar)(Capt >> 8);
SerBuffer[INFO + 2] = BaudRate;
SerBuffer[INFO + 3] = DelayRate;
}
else
{
SerBuffer[INFO] = Snr_MSR[0];
SerBuffer[INFO + 1] = Snr_MSR[1];
SerBuffer[INFO + 2] = Snr_MSR[2];
SerBuffer[INFO + 3] = Snr_MSR[3];
}
SerBuffer[LENGTH] = 4;
}
Status = OK;
break;
case 0x50: // Set Control Bit
mifs_set_control_bit(SerBuffer[CTLBYTE]);
Status = OK;
break;
case 0x51: // Clr Control Bit
mifs_clr_control_bit(SerBuffer[CTLBYTE]);
Status = OK;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -