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

来源:互联网 发布:xampp中mysql定时重启 编辑:程序博客网 时间:2024/05/17 08:35
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:                         // 防冲突 读卡的系列号 MLastSelectedSnrstatus = 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 Cardstatus=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;//contactRevBuffer[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);}    }


 

 

0 0
原创粉丝点击