?? rc500.c
字號:
/****************************************Copyright (c)**************************************************
**
**
**
**
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: RC500.c
**創 建 人: 李功周
**最后修改日期: 2008年12月18日
**描 述: RC500 驅動與API 函數
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 李功周
** 版 本: v1.0
** 日 期: 2008年12月18日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
*/
#include <LPC2103.H>
#include "../INT0/INT0.H"
//#include "../Uart1/Uart1.h"
#include "../SPI0/SPI0.h"
//#include "../SPK/SPK.h"
#include "RC500.h"
#include <string.h>
#include <stdio.h>
#include <absacc.h>
#ifndef MFERRNO_H
#define MFERRNO_H
#define READER_ERR_BASE_START 0
#define MI_OK 0
#define MI_CHK_OK 0
#define MI_CRC_ZERO 0
#define MI_CRC_NOTZERO 1
#define MI_NOTAGERR 1
#define MI_CHK_FAILED 1
#define MI_CRCERR 2
#define MI_CHK_COMPERR 2
#define MI_EMPTY 3
#define MI_AUTHERR 4
#define MI_PARITYERR 5
#define MI_CODEERR 6
#define MI_SERNRERR 8
#define MI_KEYERR 9
#define MI_NOTAUTHERR 10
#define MI_BITCOUNTERR 11
#define MI_BYTECOUNTERR 12
#define MI_IDLE 13
#define MI_TRANSERR 14
#define MI_WRITEERR 15
#define MI_INCRERR 16
#define MI_DECRERR 17
#define MI_READERR 18
#define MI_OVFLERR 19
#define MI_POLLING 20
#define MI_FRAMINGERR 21
#define MI_ACCESSERR 22
#define MI_UNKNOWN_COMMAND 23
#define MI_COLLERR 24
#define MI_RESETERR 25
#define MI_INITERR 25
#define MI_INTERFACEERR 26
#define MI_ACCESSTIMEOUT 27
#define MI_NOBITWISEANTICOLL 28
#define MI_QUIT 30
#define MI_RECBUF_OVERFLOW 50
#define MI_SENDBYTENR 51
#define MI_SENDBUF_OVERFLOW 53
#define MI_BAUDRATE_NOT_SUPPORTED 54
#define MI_SAME_BAUDRATE_REQUIRED 55
#define MI_WRONG_PARAMETER_VALUE 60
#define MI_BREAK 99
#define MI_NY_IMPLEMENTED 100
#define MI_NO_MFRC 101
#define MI_MFRC_NOTAUTH 102
#define MI_WRONG_DES_MODE 103
#define MI_HOST_AUTH_FAILED 104
#define MI_WRONG_LOAD_MODE 106
#define MI_WRONG_DESKEY 107
#define MI_MKLOAD_FAILED 108
#define MI_FIFOERR 109
#define MI_WRONG_ADDR 110
#define MI_DESKEYLOAD_FAILED 111
#define MI_WRONG_SEL_CNT 114
#define MI_WRONG_TEST_MODE 117
#define MI_TEST_FAILED 118
#define MI_TOC_ERROR 119
#define MI_COMM_ABORT 120
#define MI_INVALID_BASE 121
#define MI_MFRC_RESET 122
#define MI_WRONG_VALUE 123
#define MI_VALERR 124
#define MI_SAKERR 0x46 //added by robbie
#endif // COMMON_H
#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 RegModConductance 0x13 //驅動電導系數寄存器
#define RegCoderControl 0x14
#define RegModWidth 0x15
#define RFU16 0x16
#define RFU17 0x17
#define RegTypeBFraming 0x17 //TypeB幀設置寄存器
#define RegRxControl1 0x19
#define RegDecoderControl 0x1A
#define RegBitPhase 0x1B
#define RegRxThreshold 0x1C
#define RFU1D 0x1D
#define RegBPSKDemControl 0x1D //BPSK解調控制寄存器
#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
#define DEF_FIFO_LENGTH 64
#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
#define PICC_REQIDL 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 mifare1 1
#define mifarepro 2
#define mifarelight 3
#define unkowncard 4
#define GetRegPage(addr) (0x80 | (addr>>3))
typedef struct
{
unsigned char cmd;
char status;
unsigned char nBytesSent;
unsigned char nBytesToSend;
unsigned char nBytesReceived;
unsigned short nBitsReceived;
unsigned char irqSource;
unsigned char collPos;
} MfCmdInfo;
#define ResetInfo(info) \
info.cmd = 0;\
info.status = MI_OK;\
info.irqSource = 0;\
info.nBytesSent = 0;\
info.nBytesToSend = 0;\
info.nBytesReceived = 0;\
info.nBitsReceived = 0;\
info.collPos = 0;
/* RC531RST 引腳 */
#define RC531RST 0x00008000
#define RC531RST_GPIO() PINSEL0 &= ~((unsigned int)0x03 << 30) /* 設置 RC500RST 口為GPIO口 */
#define RC531RST_OUT() IODIR |= RC531RST /* 設置 RC500RST 口為輸出口 */
#define RC531RST_SET() IOSET |= RC531RST /* 置 RC500RST 為高電平 */
#define RC531RST_CLR() IOCLR |= RC531RST /* 置 RC500RST 為低電平 */
/* RC531NSS 引腳 */
#define RC531NSS 0x00000400
#define RC531NSS_GPIO() PINSEL0 &= ~((unsigned int)0x03 << 20) /* 設置 RC500RST 口為GPIO口 */
#define RC531NSS_OUT() IODIR |= RC531NSS /* 設置 RC500RST 口為輸出口 */
#define RC531NSS_SET() IOSET |= RC531NSS /* 置 RC500RST 為高電平 */
#define RC531NSS_CLR() IOCLR |= RC531NSS /* 置 RC500RST 為低電平 */
//全局變量
static volatile MfCmdInfo MInfo;
volatile unsigned char SerBuffer[40];
static volatile MfCmdInfo *MpIsrInfo;
static volatile unsigned char *MpIsrOut;
volatile unsigned char MLastSelectedSnr[4];
/****************************************************************************
* 名 稱:DelayNS()
* 功 能:長軟件延時。
* 入口參數:dly 延時參數,值越大,延時越久
* 出口參數:無
****************************************************************************/
void delay_1ms(unsigned long dly)
{
unsigned long i;
while(dly--)
{
i = 8000;
while(i--);
}
}
/****************************************************************************
* 名 稱:delay_50us()
* 功 能:長軟件延時。
* 入口參數:dly 延時參數,值越大,延時越久
* 出口參數:無
****************************************************************************/
void delay_50us(unsigned char _50us)
{
unsigned long i;
while(_50us--)
{
i = 400;
while(i--);
}
}
/****************************************************************************
* 名 稱:ReadRawIO()
* 功 能:從一個地址讀出一個數據(EEPROM)。
* 入口參數:Address 地址
* 出口參數:數據
****************************************************************************/
unsigned char ReadRawIO(unsigned char Address)
{
unsigned char a;
RC531NSS_CLR();
SPI_SendByte((Address<<1)|0x80);
a = SPI_RecByte();
SPI_SendByte(0x00);
RC531NSS_SET();
return a;
}
/****************************************************************************
* 名 稱:WriteRawIO()
* 功 能:往一個地址寫一個數據(EEPROM)。
* 入口參數:Address 地址
value 數據
* 出口參數:無
****************************************************************************/
void WriteRawIO(unsigned char Address, unsigned char value)
{
RC531NSS_CLR();
SPI_SendByte((Address<<1)&0x7f);
SPI_SendByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 稱:WriteIO()
* 功 能:往一個地址寫一個數據(EEPROM)。
* 入口參數:Address 地址
value 數據
* 出口參數:無
****************************************************************************/
void WriteIO(unsigned char Address, unsigned char value)
{
RC531NSS_CLR();
SPI_SendByte(0x00);
SPI_SendByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte((Address<<1)&0x7f);
SPI_SendByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 稱:ReadIO()
* 功 能:從一個地址讀出一個數據(EEPROM)。
* 入口參數:Address 地址
* 出口參數:數據
****************************************************************************/
unsigned char ReadIO(unsigned char Address)
{
unsigned char a;
RC531NSS_CLR();
SPI_SendByte(0x00);
SPI_SendByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte((Address<<1)|0x80);
a = SPI_RecByte();
SPI_SendByte(0x00);
RC531NSS_SET();
return a;
}
/****************************************************************************
* 名 稱:RFRegWrite()
* 功 能:往一個地址寫一個數據(EEPROM)。
* 入口參數:Address 地址
value 數據
* 出口參數:無
****************************************************************************/
void RFRegWrite(unsigned char Address, unsigned char value)
{
RC531NSS_CLR();
SPI_SendByte(0x00);
SPI_SendByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte((Address<<1)&0x7f);
SPI_SendByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 稱:ReadIO()
* 功 能:從一個地址讀出一個數據(EEPROM)。
* 入口參數:Address 地址
* 出口參數:數據
****************************************************************************/
unsigned char RFRegRead(unsigned char Address)
{
unsigned char a;
RC531NSS_CLR();
SPI_SendByte(0x00);
SPI_SendByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI_SendByte((Address<<1)|0x80);
a = SPI_RecByte();
SPI_SendByte(0x00);
RC531NSS_SET();
return a;
}
/****************************************************************************
* 名 稱:SetBitMask()
* 功 能:清一個bit
* 入口參數:reg 內存
mask俺碼
* 出口參數:無
****************************************************************************/
char SetBitMask(unsigned char reg,unsigned char mask)
{
char tmp = 0x00;
tmp = ReadIO(reg);
WriteIO(reg,tmp | mask); // set bit mask
return 0x00;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -