您的位置:首页 > 其它

RC522 读卡器和写卡器 读写测试程序----基于cc2530开发板

2015-12-29 23:39 316 查看
RC522 写卡器操作步骤:1)寻卡,2)防冲突;3)选卡;4)授权;5)写操作;6)读操作;具体步骤见源码,红色的部分是我增加的代码,其它的都是开发板自带的代码;
/****************************************************************************
* 文 件 名: main.c
* 描    述: 读写RFID
****************************************************************************/
#include <ioCC2530.h>
#include <string.h>
#include "LCD.h"
#include "mfrc522.h"

typedef unsigned char uchar;
typedef unsigned char uint8;
typedef unsigned int  uint;
typedef unsigned long ulong;

#define ON 0
#define OFF 1
#define LED1 P1_0 //定义P1.0口为LED1控制端
#define LED2 P1_1 //定义P1.1口为LED2控制端
#define LED3 P1_4 //定义P1.4口为LED3控制端

#define BUZZER_PIN  P0_7   //蜂鸣器控制脚

#define KEY1  0x01
#define KEY2  0x02

//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char data2[4]  = {0x12,0,0,0};
unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char g_ucTempbuf[20];
unsigned char MLastSelectedSnr[4];
unsigned char RevBuffer[30];
unsigned char SerBuffer[20];
unsigned char CmdValid;
unsigned char waitCommData=1;
int data_len=0;
int data_index=0;

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
P1DIR |= 0x13; //P1.0、P1.1、p1.4定义为输出
LED1 = 1; //默认LED灯为熄灭状态
LED2 = 1;
LED3 = 1;

P0_7=1;
}

void InitUart0(void)
{
PERCFG  &= ~ 0x01;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0xC0;          //P0优先作为UART0

U0CSR |= 0x80;           //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216;           //波特率设为115200

UTX0IF = 0;              //UART0 TX中断标志初始置位0
U0CSR |= 0x40;           //允许接收
IEN0 |= 0x84;            //开总中断允许接收中断
}

/****************************************************************************
* 名    称: UART0_ISR(void) 串口中断处理函数
* 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
unsigned char bbb=U0DBUF;

URX0IF=0;
if(waitCommData>0)
{
waitCommData=0;
data_len=U0DBUF;
data_index=0;
memset(RevBuffer, 0, sizeof(RevBuffer));
}
else
{
RevBuffer[data_index]=U0DBUF;
data_index++;

if(data_len==data_index)
{
U0CSR &= ~0x40;                    //禁止接收
CmdValid=1;

waitCommData=1;

U0CSR |= 0x40;
}
}
}

void Uart0SendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}

void InitClockTo32M(void)
{
CLKCONCMD &= ~0x40;              //设置系统时钟源为 32MHZ晶振
while(CLKCONSTA & 0x40);         //等待晶振稳定
CLKCONCMD &= ~0x47;              //设置系统主时钟频率为 32MHZ
}

void iccardcode()
{
unsigned char cmd;
unsigned char status;

cmd = RevBuffer[0];
switch(cmd)
{
case 1:     // Halt the card     //终止卡的操作
status= PcdHalt();;
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 2:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
// 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;

case 3:                         // 防冲突 读卡的系列号 MLastSelectedSnr
status = PcdAnticoll(&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
memcpy(MLastSelectedSnr,&RevBuffer[2],4);
RevBuffer[0]=5;
RevBuffer[1]=status;
break;
case 4:		                    // 选择卡 Select Card
status=PcdSelect(MLastSelectedSnr);
if(status!=MI_OK)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;
case 5:	    // Key loading into the MF RC500's EEPROM
status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 6:
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 7:
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 8:     // Read the mifare card
// 读卡
status=PcdRead(RevBuffer[1],&RevBuffer[2]);
if(status==0)
{RevBuffer[0]=17;}
else
{RevBuffer[0]=1;}
RevBuffer[1]=status;
break;
case 9:     // Write the mifare card
// 写卡  下载密码
status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 10:
PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
case 12:    // 参数设置
PcdBakValue(RevBuffer[1], RevBuffer[2]);
RevBuffer[0]=1;	//contact
RevBuffer[1]=0;
break;
}
}

/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
//P0_4、P0_5、P0_6、p1_0和p1_1用于控制RFID
//P0_7用于控制蜂鸣器

P0DIR |= 0xF0; //P0_4、P0_5、P0_6、P0_7定义为输出
P1DIR |= 0x03;//p1_0、p1_1输出

P0 |= 0xF0; //P0_4、P0_5、P0_6、P0_7输出1
P1 |= 0x03; //P1_0输出高电平

CmdValid=0;

PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );

delay_10ms(10);
LED2=OFF;
delay_10ms(10);
}

//BCD码转成ASC码
char NumberToLetter(unsigned char number)
{
char buff[]="0123456789ABCDEF";

if(number>15) return 0;

return buff[number];

}

//蜂鸣器响两声
void buzzerOn()
{
BUZZER_PIN=0;
DelayMS(200);
BUZZER_PIN=1;
DelayMS(50);
BUZZER_PIN=0;
DelayMS(200);
BUZZER_PIN=1;
}

void main(void)
{
uint8 SendBuf[10]={0};
uint8 error=0;

InitLed();
InitializeSystem();
InitClockTo32M();
InitUart0();
LCD_Init();
LCD_CLS();
LCD_P8x16Str(20, 0, "SZ_YY RFID");

//周期地在寻卡
while (1)
{
//寻卡命令
RevBuffer[0]=0x02;
RevBuffer[1]=0x26;

// 寻卡
iccardcode();

error=0;
if(RevBuffer[1]==0)//寻卡成功
{
//读卡命令
SendBuf[0]=RevBuffer[2];  //data
SendBuf[1]=RevBuffer[3];  //data

//找到卡
//读卡
RevBuffer[0]=0x03;
iccardcode();

if(RevBuffer[1]==0)
{
//读卡成功
//记录卡ID
SendBuf[2]=RevBuffer[2];  //data
SendBuf[3]=RevBuffer[3];  //data
SendBuf[4]=RevBuffer[4];  //data
SendBuf[5]=RevBuffer[5];  //data
}
else
{
error=1;
}
}
else
{
error=1;
}

if(error==0)
{
char card_buff[20]={0};

//各种卡的含义
//                0x4400 = Mifare_UltraLight
//                0x0400 = Mifare_One(S50)
//                0x0200 = Mifare_One(S70)
//                0x0800 = Mifare_Pro(X)
//                0x4403 = Mifare_DESFire

if(SendBuf[0]==0x44 && SendBuf[1]==0x00)
{
LCD_P8x16Str(0, 2, "Mifare_UltraLight");
Uart0SendString((uint8 *)"Mifare_UltraLight", strlen("Mifare_UltraLight"));
}
else if(SendBuf[0]==0x04 && SendBuf[1]==0x00)
{
LCD_P8x16Str(0, 2, "Mifare_One(S50)");
Uart0SendString((uint8 *)"Mifare_One(S50)", strlen("Mifare_One(S50)"));
}
else if(SendBuf[0]==0x02 && SendBuf[1]==0x00)
{
LCD_P8x16Str(0, 2, "Mifare_One(S70)");
Uart0SendString((uint8 *)"Mifare_One(S70)", strlen("Mifare_One(S70)"));
}
else if(SendBuf[0]==0x08 && SendBuf[1]==0x00)
{
LCD_P8x16Str(0, 2, "Mifare_One(X)");
Uart0SendString((uint8 *)"Mifare_One(X)", strlen("Mifare_One(X)"));
}
else if(SendBuf[0]==0x44 && SendBuf[1]==0x03)
{
LCD_P8x16Str(0, 2, "Mifare_DESFire");
Uart0SendString((uint8 *)"Mifare_DESFire", strlen("Mifare_DESFire"));
}
else
{
error=1;
LCD_P8x16Str(0, 2, "");
LCD_P8x16Str(0, 4, "");
Uart0SendString((uint8 *)"find error", strlen("find error"));
}
Uart0SendString((uint8 *)"\r\n", 2);

/*
card_buff[0]='I';
card_buff[1]='D';
card_buff[2]=':';

//BCD转ASC码
//ID轮换
for(int i=0; i<4; i++)
{
unsigned char temp= SendBuf[2+i];
card_buff[3+i*2]=NumberToLetter((temp>>4)&0x0f);
card_buff[3+i*2+1]=NumberToLetter(temp&0x0f);
}

//LCD显示ID
LCD_P8x16Str(0, 4,card_buff);

//串口输出ID
Uart0SendString(card_buff, strlen(card_buff));
Uart0SendString((uint8 *)"\r\n", 2);

//蜂鸣器提示
buzzerOn();
*/

<span style="color:#ff0000;"> //选择卡
RevBuffer[0]=0x04;
iccardcode();

//授权
RevBuffer[0]=0x05;
RevBuffer[1]=0x60;
RevBuffer[3]=0x06;
iccardcode();

if(RevBuffer[1]==0)
{
//授权成功,进行写操作
//mifire卡写卡
RevBuffer[0]=0x09;
RevBuffer[1]=0x06;

for(int j=0;j<16;j++)
{
RevBuffer[j+2]=j;
}

iccardcode();

//mifire 卡读卡;
RevBuffer[0]=0x08;
RevBuffer[1]=0x06;

//清空缓存区
for(int j=0;j<16;j++)
{
RevBuffer[j+2]=0;
}

iccardcode();
//LCD显示读到的数据

for(int i=0; i<8; i++)
{
unsigned char temp= RevBuffer[2+i];
card_buff[i*2]=NumberToLetter((temp>>4)&0x0f);
card_buff[i*2+1]=NumberToLetter(temp&0x0f);
}

LCD_P8x16Str(0, 4,card_buff);
Uart0SendString((uint8 *)"\r\n", 2);
</span>              }
}
else
{
//寻不到卡
LCD_P8x16Str(0, 2,"                ");
LCD_P8x16Str(0, 4,"                ");
}

DelayMS(500);
}
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: