RC522 写卡器操作步骤:1)寻卡,2)防冲突;3)选卡;4)授权;5)写操作;6)读操作;具体步骤见源码,红色的部分是我增加的代码,其它的都是开发板自带的代码;
/****************************************************************************
* 文 件 名: main.c
* 描 述: 读写RFID
****************************************************************************/
#include
#include
#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; i15) 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();
*/
//选择卡
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);
}
}
else
{
//寻不到卡
LCD_P8x16Str(0, 2," ");
LCD_P8x16Str(0, 4," ");
}
DelayMS(500);
}
}