📄 mfrc500.h
字号:
#ifndef MFRC500_H
#define MFRC500_H
// #define FORCE_RESET // define to force to complete the reset sequence
// when call to the init/reset function.
#define RSTPIN P2_7
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#ifndef TRUE
#define FALSE 0
#define TRUE 1
#endif
typedef struct
{
unsigned char cmd; //!< command code
char status; // communication status
unsigned char nBytesSent; // how many bytes already sent
unsigned char nBytesToSend; // how many bytes to send
unsigned char nBytesReceived;// how many bytes received
unsigned short nBitsReceived; // how many bits received
unsigned char irqSource; // which interrupts have occured
unsigned char collPos; // at which position occured a
// collision
// unsigned char RxAlignWA; //!< workaround for RxAlign = 7
// unsigned char DisableDF; //!< disable disturbance filter
} MfCmdInfo;
/********mifare card*********************************************/
//reg address
#define RegPage 0x00
#define RegCommand 0x01
#define RegFIFOData 0x02
#define RegPrimaryStatus 0x03
#define RegFIFOLength 0x04
#define RegSecondaryStatus 0x05
#define RegInterruptEn 0x06
#define RegInterruptRq 0x07
#define RegControl 0x09
#define RegErrorFlag 0x0A
#define RegCollpos 0x0B
#define RegTimerValue 0x0C
#define RegCRCResultLSB 0x0D
#define RegCRCResultMSB 0x0E
#define RegBitFraming 0x0F
#define RegTxControl 0x11
#define RegCwConductance 0x12
#define RFU13 0x13
#define RegCoderControl 0x14
#define RegModWidth 0x15
#define RFU16 0x16
#define RFU17 0x17
#define RegRxControl1 0x19
#define RegDecoderControl 0x1A
#define RegBitPhase 0x1B
#define RegRxThreshold 0x1C
#define RFU1D 0x1D
#define RegRxControl2 0x1E
#define RegClockQControl 0x1F
#define RegRxWait 0x21
#define RegChannelRedundancy 0x22
#define RegCRCPresetLSB 0x23
#define RegCRCPresetMSB 0x24
#define RFU25 0x25
#define RegMfOutSelect 0x26
#define RFU27 0x27
#define RegFIFOLevel 0x29
#define RegTimerClock 0x2A
#define RegTimerControl 0x2B
#define RegTimerReload 0x2C
#define RegIRqPinConfig 0x2D
#define RFU2E 0x2E
#define RFU2F 0x2F
#define RFU31 0x31
#define RFU32 0x32
#define RFU33 0x33
#define RFU34 0x34
#define RFU35 0x35
#define RFU36 0x36
#define RFU37 0x37
#define RFU39 0x39
#define RegTestAnaSelect 0x3A
#define RFU3B 0x3B
#define RFU3C 0x3C
#define RegTestDigiSelect 0x3D
#define RFU3E 0x3E
#define RegTestDigiAccess 0x3F
//rc500 command
#define PCD_IDLE 0x00
#define PCD_WRITEE2 0x01
#define PCD_READE2 0x03
#define PCD_LOADCONFIG 0x07
#define PCD_LOADKEYE2 0x0B
#define PCD_AUTHENT1 0x0C
#define PCD_CALCCRC 0x12
#define PCD_AUTHENT2 0x14
#define PCD_RECEIVE 0x16
#define PCD_LOADKEY 0x19
#define PCD_TRANSMIT 0x1A
#define PCD_TRANSCEIVE 0x1E
#define PCD_RESETPHASE 0x3F
//mifare card command
#define PICC_REQSTD 0x26
#define PICC_REQALL 0x52
#define PICC_ANTICOLL1 0x93
#define PICC_ANTICOLL2 0x95
#define PICC_ANTICOLL3 0x97
#define PICC_AUTHENT1A 0x60
#define PICC_AUTHENT1B 0x61
#define PICC_READ 0x30
#define PICC_WRITE 0xA0
#define PICC_DECREMENT 0xC0
#define PICC_INCREMENT 0xC1
#define PICC_RESTORE 0xC2
#define PICC_TRANSFER 0xB0
#define PICC_HALT 0x50
#define PICC_REQIDL 0x26 //!< request idle
#define PICC_ANTICOLL11 0x92 //!< anticollision level 1 212 kBaud
#define PICC_ANTICOLL12 0x94 //!< anticollision level 1 424 kBaud
#define PICC_ANTICOLL13 0x98 //!< anticollision level 1 848 kBaud
#define PICC_RESET 0XE0 // PICC reset signal
//Error codes
#ifndef MI_ERRCODE
#define MI_ERRCODE
#define MI_OK 0 /* 正确 */
#define MI_NOTAGERR 1 /* 无卡 */
#define MI_CRCERR 2 /* CRC校验错误 */
#define MI_AUTHERR 3 /* 认证错 */
#define MI_PARITYERR 4 /* 奇偶校验错 */
#define MI_CODEERR 5 /* 给卡的命令代码错 */
#define MI_SERNRERR 6 /* 卡序列号错 */
#define MI_KEYERR 7 /* 密钥错 */
#define MI_NOTAUTHERR 8 /* 没有认证 */
#define MI_BITCOUNTERR 9 /* 位计数错 */
#define MI_BYTECOUNTERR 10 /* 字节计数错 */
#define MI_WRITEERR 11 /* 写错误 */
#define MI_VALERR 12 /* 值错误 */
#define MI_OVFLERR 13 /* FIFO溢出 */
#define MI_FRAMINGERR 14 /* 桢错误 */
#define MI_UNKNOWN_COMMAND 15 /* 不支持的命令 */
#define MI_COLLERR 16 /* 卡冲突 */
#define MI_RESETERR 17 /* 复位错 */
#define MI_INTERFACEERR 18 /* 接口错 */
#define MI_ACCESSTIMEOUT 19 /* 操作超时 */
#define MI_NY_IMPLEMENTED 20 /* 其他错误 */
#define MI_EPBAKERR 21 /* 写钱包备份错误 */
#define MI_WRONG_PARAMETER_VALUE 22 // 错误参数
#define MI_NOBITWISEANTICOLL 23 //
#define MI_BAUDRATE_NOT_SUPPORTED 24 // 波特率不支持
#define MI_CASCLEVEX 25 //
#endif
#define ICC_ 40 /* */
/**************************************************************************************/
// Receive States
#define RECV_STX 0
#define RECV_DATA 1
#define RECV_DLE 2
#define COMMAND 0
#define STATUS 0
#define LENGTH 1
/*======================== call internal ============================*/
#define M500Reset() {RSTPIN = 1; delay(100); RSTPIN = 0;}
void M500PcdSetTmo(uchar tmoLength);
uchar M500PcdSetDefaultAttrib(void);
uchar M500PiccAuthState(uchar AuthMode, uchar *snr, uchar Sector);
void SetBitMask(uchar reg, uchar mask);
void ClearBitMask(uchar reg, uchar mask);
void ResetInfo(MfCmdInfo *info);
void FlushFIFO(void);
void M500HostCodeKey(uchar *uncoded, uchar *coded);
uchar M500PcdCmd(uchar cmdcode, uchar* send, uchar* rcv, MfCmdInfo *info);
/********************************
* 数据有效性检查 *
********************************/
bit ValueBlockValid(uchar *dts);
/*======================== call user ===============================*/
/********************************
* init mfrc500 *
* do it first *
********************************/
uchar M500PcdInit(void);
/********************************
* set mfrc500 receive gain *
********************************/
void M500SetRcvGain(uchar gain);
/********************************
* mfrc500 uc reset *
********************************/
uchar M500PcdReset(void);
void M500PcdMfOutSelect(unsigned char type);
/********************************
* mfrc500 reset *
* ms: time between clr and set *
* do it after m500pcdinit() *
********************************/
void M500PcdRfReset(uchar ms);
/********************************
* 呼叫卡 *
* req_code: type of request *
* atq: answer to request *
********************************/
uchar M500Request(uchar req_code, uchar *atq);
/********************************
* 防重叠 *
********************************/
uchar M500Anticoll(uchar *Snr);
uchar M500Select(uchar *Snr);
uchar M500Auth(uchar Mode, uchar *snr, uchar *Keys, uchar Sector);
uchar M500Read(uchar Address, uchar *DataBuff);
uchar M500Write(uchar Address, uchar *DataBuff);
// 卡休眠
char M500Halt(void);
/********************************
* 获取RC500版本号 *
* info: 输出, 版本号 *
********************************/
uchar M500GetHareVerNO(uchar* info);
uchar M500ReadValue(uchar addr, uchar* value, uchar bakaddr);
// return value: 0 means read fail or 2 block are both error
// bit0: value in addr is valid or not
// bit1: value in bakaddr is valid or not
// bit54: 01 for ture > bak And 10 for bak > true when bit10 are both '1'
// in lsb 1st ep
// bit76: same as bit54 in msb 1st ep
uchar M500GetEpStatus(uchar addr, uchar bakaddr);
uchar M500WriteValue(uchar addr, uchar* value, uchar bakaddr);
///////////////////////////////////////////////////////////////////////
// V A L U E M A N I P U L A T I O N
///////////////////////////////////////////////////////////////////////
char M500Value(unsigned char dd_mode,
unsigned char addr,
unsigned char *value,
unsigned char trans_addr);
///////////////////////////////////////////////////////////////////////
// V A L U E M A N I P U L A T I O N W I T H B A C K U P
///////////////////////////////////////////////////////////////////////
char M500ValueDebit(unsigned char dd_mode,
unsigned char addr,
unsigned char *value);
uchar M500Increment(uchar addr, uchar *value, uchar bakaddr);
uchar M500Decrement(uchar addr, uchar *value, uchar bakaddr);
uchar M500Restore(uchar Address);
uchar M500Transfer(uchar Adress);
uchar M500Copy(uchar srcaddr, uchar desaddr);
#endif
/***********************************
sequence of operating a card:
request
|
v
anticoll, get snr
|
v
select by snr
|
V
authentication
|
V
read and write
***********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -