?? rfmodulefunc.c
字號:
#include <Reg52.H>
#include <string.h>
#include <INTRINS.H>
#include "RfModuleFunc.H"
//各延時定義
#define DELAY_TIME0 100
#define DELAY_TIME1 2500
#define DELAY_TIME2 3000
#define DELAY_TIME3 55000
#define SPI_CMD_GET_VERSION 0x32 //讀機內版本號
#define SPI_CMD_GET_INFO 0x34 //讀取RF模塊固件信息序列號
#define SPI_CMD_SET_CONTROL_BIT 0x50 //設置RC500中的控制位
#define SPI_CMD_CLR_CONTROL_BIT 0x51 //清除RC500中的控制位
#define SPI_CMD_BUZZER 0x60 //輸出驅動無源蜂鳴器信號
//Mifare模塊基本命令部分
#define SPI_CMD_MIFARE_CONFIG 0x52 //復位且配置RC500
#define SPI_CMD_MIFARE_CLOSE 0x3F //關閉RC500,使讀寫模塊進入掉電模式
#define SPI_CMD_MIFARE_REQUEST 0x41 //尋卡
#define SPI_CMD_MIFARE_ANTICOLL 0x42 //防沖突
#define SPI_CMD_MIFARE_ANTICOLL2 0x71 //防沖突2,允許多張卡進入
#define SPI_CMD_MIFARE_SELECT 0x43 //選擇卡
#define SPI_CMD_MIFARE_AUTH 0x44 //開始校驗密鑰
#define SPI_CMD_MIFARE_AUTH2 0x72 //可選擇密鑰區驗證
#define SPI_CMD_MIFARE_AUTHKEY 0x73 //直接校驗密鑰
#define SPI_CMD_MIFARE_HALT_CARD 0x45 //停止當前卡
#define SPI_CMD_MIFARE_READ 0x46 //讀卡
#define SPI_CMD_MIFARE_WRITE 0x47 //寫卡
#define SPI_CMD_MIFARE_INC 0x48 //增值操作
#define SPI_CMD_MIFARE_DEC 0x49 //減值操作
#define SPI_CMD_MIFARE_RESORE 0x4A //將所訪問單元塊的字節數保存在卡的內部寄存器中
#define SPI_CMD_MIFARE_TRANS 0x4B //將卡內部寄存器的內容轉輸到訪問快的字節數
#define SPI_CMD_MIFARE_VALUE 0x70 //增減值操作
#define SPI_CMD_MIFARE_LOADKEY 0x4C //改變存貯在EEPROM 中的密鑰
#define SPI_CMD_MIFARE_RESET_CARD 0x4E //關閉天線輸出數ms 使卡復位
#define SPI_CMD_MIFARE_AUTHE2KEY 0x56 //從Mifare模塊的E2校驗密鑰
#define SPI_CMD_MIFARE_CHECK_WRITE 0x53 //將所傳送的數據和上一次所寫的數據進行比較
#define SPI_CMD_MIFARE_READ_E2 0x61 //讀RC500 內EEPROM 的內容
#define SPI_CMD_MIFARE_WRITE_E2 0x62 //寫數據到RC500 內EEPROM
//卡操作命令部分
#define SPI_CMD_SET_CARD_APP_SECTOR 0x80 //設置卡扇區應用參數
#define SPI_CMD_GET_CARD_APP_SECTOR 0x81 //讀取卡扇區應用參數
#define SPI_CMD_SET_BASE_KEY 0x82 //設置基密鑰
#define SPI_CMD_GET_BASE_KEY 0x83 //讀取基密鑰
#define SPI_CMD_GET_CARD_KEY 0x84 //取得卡密鑰
#define SPI_CMD_IS_CARD_IN 0x85 //是否有卡進入讀卡區
#define SPI_CMD_READ_COMPANY_INFO 0x86 //讀卡上公司信息
#define SPI_CMD_READ_CARDHOLDER_INFO 0x87 //讀卡上持卡人信息
#define SPI_CMD_READ_BUSINESS_INFO 0x88 //讀卡上交易數據(含卡恢復流程)
#define SPI_CMD_CONSUME 0x89 //消費
#define SPI_CMD_FILL 0x8A //充值
#define SPI_CMD_READ_ORDER_DINNER_INFO 0x8B //讀卡上訂餐信息
#define SPI_CMD_WRITE_ORDER_DINNER_INFO 0x8C //寫訂餐信息到卡上
#define SPI_CMD_READ_TIME_COUNT_INFO 0x8D //讀卡上計時消費信息
#define SPI_CMD_WRITE_TIME_COUNT_INFO 0x8E //寫計時消費信息到卡上
#define SPI_CMD_SET_CARD_STATE 0x8F //設置卡狀態
//============================管腳定義====================================
sbit RF_RST = P2^6;
sbit RF_CS = P3^2; //INT0
sbit RF_SCLK = P3^5;
sbit RF_SDAT = P3^4;
#define RF_OPEN() IE0=0;EX0=1;
#define RF_CLOSE() EX0=0;
//============================常量定義================================
#define RF_BUFFER_MAX_ZIAE 64 //不能超255,否則需加長度字節數
unsigned char pdata Rf_Buffer[RF_BUFFER_MAX_ZIAE];
bit newdata = 0;
//BCC校驗計算
unsigned char GetBCC(unsigned char *Buffer, unsigned char Len)
{
unsigned char value=0;
while(Len--)
{
value ^= *Buffer;
Buffer++;
}
return ~value;
}
//外部提供延時1ms的子程序
//extern Delay1ms(unsigned char _1ms);
extern void do_nop(unsigned char Count);
void Rf_Int0(void) interrupt 0 using 1 //rf_rcv(Rf_Buffer);
{
unsigned char Rf_count;
unsigned char i,j,ch;
RF_SCLK = 0;
RF_SDAT = 1;
for(i=10;i--;);//delay;
Rf_count= 0;
while(!RF_CS)
{
for(i=0;i<8;i++)
{
RF_SCLK = 1;ch <<=1;
ch |= RF_SDAT;for(j=2;j--;);//delay;
RF_SCLK = 0;for(j=2;j--;);//delay;
}
Rf_Buffer[Rf_count]= ch;
if(++Rf_count>=RF_BUFFER_MAX_ZIAE)break;
}
RF_SDAT = 0;
newdata = 1;
}
void Rf_Init(void)
{
EA = 0;
IP &= ~0X01; //X0優先級0
//IPH &= ~0X01;
IT0 = 1; //INT1 is falling edg trig
EA = 1;
RF_CS = 1;
RF_SCLK = 0;
RF_SDAT = 0;
// 模塊復位(模塊已由外部阻容電路復位)
// RF_RST = 0; Delay1ms(45);
// RF_RST = 1; Delay1ms(45);
}
unsigned char Rf_Send(unsigned char *buf,unsigned char Count)
{
unsigned char i,j,ch;
RF_CLOSE();
RF_SDAT = 1;
RF_SCLK = 0;
i=200;
while(RF_SDAT) i--;
if(!i) return(RF_ERR);
RF_CS = 0;
i=200;
while(!RF_SDAT) i--;
if(!i) return(RF_ERR);
for(i=0;i<Count;i++)
{
ch=buf[i];
for(j=0;j<8;j++)
{
RF_SDAT = (bit)(ch&0x80);do_nop(1);
RF_SCLK = 1;do_nop(3);
RF_SCLK = 0;ch<<=1;do_nop(1);
}
}
RF_CS = 1;
RF_SDAT = 0;
//TR1 = 0;
return(MI_OK);
}
unsigned char Rf_Command(unsigned int DelayTime)
{
unsigned char Len,BCC_Value;
Len = Rf_Buffer[LENGTH] + 3; //計算總長度
Rf_Buffer[Len]=GetBCC(Rf_Buffer,Len); //計算BCC
if(Rf_Send(Rf_Buffer,Len+1)!=MI_OK) return RF_ERR;
RF_OPEN();
while(!newdata && DelayTime) DelayTime--;
RF_CLOSE();
if(newdata==0) return RF_ERR; //接收超時判斷
newdata=0;
Len = Rf_Buffer[LENGTH] + 3; //計算總長度(不含BCC)
BCC_Value=GetBCC(Rf_Buffer,Len); //計算BCC
if(BCC_Value == Rf_Buffer[Len])
return RF_OK;
return MI_CRCERR;
}
//=========================卡操作基本函數=================================
unsigned char mifs_request(unsigned char _Mode,unsigned char *_TagType)
{
Rf_Buffer[SEQNR]=1;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_REQUEST;
Rf_Buffer[LENGTH]=0x01;
Rf_Buffer[MODE]=_Mode;
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
{
_TagType[0]=Rf_Buffer[TAGTYPE];
_TagType[1]=Rf_Buffer[TAGTYPE+1];
}
return Rf_Buffer[STATUS];
}
unsigned char mifs_anticoll(unsigned char _Bcnt,unsigned char *_SNR)
{
Rf_Buffer[SEQNR]=1;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_ANTICOLL;
Rf_Buffer[LENGTH]=0x01;
Rf_Buffer[MODE]=_Bcnt;
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
{
memcpy(_SNR,&Rf_Buffer[SERNR],4);
}
return Rf_Buffer[STATUS];
}
unsigned char mifs_select(unsigned char *_SNR,unsigned char *_Size)
{
Rf_Buffer[SEQNR]=1;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_SELECT;
Rf_Buffer[LENGTH]=0x04;
memcpy(&Rf_Buffer[SERNR],_SNR,4);
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
{
*_Size=Rf_Buffer[SIZE];
}
return Rf_Buffer[STATUS];
}
unsigned char mifs_authentication(unsigned char _Mode,unsigned char _SecNr)
{
Rf_Buffer[SEQNR]=1;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_AUTH;
Rf_Buffer[LENGTH]=0x02;
Rf_Buffer[MODE]=_Mode;
Rf_Buffer[SECNR]=_SecNr;
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
return Rf_Buffer[STATUS];
}
unsigned char mifs_halt(void)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_HALT_CARD;
Rf_Buffer[LENGTH]=0x00;
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
return Rf_Buffer[STATUS];
}
unsigned char mifs_read(unsigned char _Adr,unsigned char *_Data)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_READ;
Rf_Buffer[LENGTH]=0x01;
Rf_Buffer[ADR]=_Adr;
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
memcpy(_Data,&Rf_Buffer[DATABYTES-1],16);
return Rf_Buffer[STATUS];
}
unsigned char mifs_load_key(unsigned char _Mode,unsigned char _SecNr,unsigned char *_Nkey)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_LOADKEY;
Rf_Buffer[LENGTH]=0x08;
Rf_Buffer[MODE]=_Mode;
Rf_Buffer[SECNR]=_SecNr;
memcpy(&Rf_Buffer[NKEY],_Nkey,6);
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
return Rf_Buffer[STATUS];
}
unsigned char mifs_reset(unsigned char _Msec)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_MIFARE_RESET_CARD;
Rf_Buffer[LENGTH]=1;
Rf_Buffer[TIME]=_Msec;
if(Rf_Command(DELAY_TIME1)!=MI_OK) return RF_ERR;
return Rf_Buffer[STATUS];
}
char SetCardApplicationSector(sttCardStruct *pstCardStruct)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_SET_CARD_APP_SECTOR;
Rf_Buffer[LENGTH]=16;
memcpy(&Rf_Buffer[DATA],pstCardStruct,16);
if(Rf_Command(DELAY_TIME0)!=MI_OK)return RF_ERR;
return Rf_Buffer[STATUS];
}
char ReadCardholderInfo(unsigned char CardSerialNo[],
unsigned char AuthMode,
unsigned char Key[],
sttCardholderInfo *pstCardholderInfo)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_READ_CARDHOLDER_INFO;
Rf_Buffer[LENGTH]=11;
memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
Rf_Buffer[DATA+4] = AuthMode;
memcpy(&Rf_Buffer[DATA+5],Key,6);
if(Rf_Command(DELAY_TIME2)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
memcpy(pstCardholderInfo,&Rf_Buffer[DATA],41);
return Rf_Buffer[STATUS];
}
char ReadBusinessInfo(unsigned char CardSerialNo[],
unsigned char AuthMode,
unsigned char Key[],
sttBusinessInfo *pstBusinessInfo)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_READ_BUSINESS_INFO;
Rf_Buffer[LENGTH]=23;
memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
Rf_Buffer[DATA+4] = AuthMode;
memcpy(&Rf_Buffer[DATA+5],Key,18);
if(Rf_Command(DELAY_TIME3)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
memcpy(pstBusinessInfo,&Rf_Buffer[DATA],44);
return Rf_Buffer[STATUS];
}
char SetCardState(unsigned char CardSerialNo[],
unsigned char AuthMode,
unsigned char Key[],
unsigned char State)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_SET_CARD_STATE;
Rf_Buffer[LENGTH]=12;
memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
Rf_Buffer[DATA+4] = AuthMode;
memcpy(&Rf_Buffer[DATA+5],Key,6);
Rf_Buffer[DATA+11] = State;
if(Rf_Command(DELAY_TIME2)!=MI_OK) return RF_ERR;
return Rf_Buffer[STATUS];
}
char Fill(unsigned char CardSerialNo[],
sttBusinessInfo *pstBusinessInfo)
{
Rf_Buffer[SEQNR]=0;
Rf_Buffer[COMMAND]=SPI_CMD_FILL;
Rf_Buffer[LENGTH]=20;
memcpy(&Rf_Buffer[DATA],CardSerialNo,4);
memcpy(&Rf_Buffer[DATA+4],&pstBusinessInfo->stFillInfo,18);
if(Rf_Command(DELAY_TIME3)!=MI_OK) return RF_ERR;
if(Rf_Buffer[STATUS]==MI_OK)
memcpy(pstBusinessInfo,&Rf_Buffer[DATA],22);
return Rf_Buffer[STATUS];
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -