世界上有一个wordpress站点,制作网站的公司怎么样,网站添加手机站,免费行情软件网站下载大全安全吗Rc522对时序的要求很高#xff0c;不能太快了#xff0c;太快了它反应不过来#xff0c;还有对硬件要求#xff0c;线圈的长度等都会导致不灵敏#xff0c;这个要调电容。下面这大哥说的很清楚。
RC522的天线设计和参考示例_rc522天线计算-CSDN博客 RC522.c
#include 不能太快了太快了它反应不过来还有对硬件要求线圈的长度等都会导致不灵敏这个要调电容。下面这大哥说的很清楚。
RC522的天线设计和参考示例_rc522天线计算-CSDN博客 RC522.c
#include main.h#define MAXRLEN 18
#define time_s 96
//MFRC522
#define MF522_RST PAout(8) //RC500片选
#define MF522_NSS PBout(12) //
#define MF522_SCK PBout(13)
#define MF522_SO PBin(15)
#define MF522_SI PBout(14)
//#define MF522_SO PBout(15)
//#define MF522_SI PBin(14) #define MF522_RST_pin GPIO_PIN_8 //RC500片选
#define MF522_NSS_pin GPIO_PIN_12
#define MF522_SCK_pin GPIO_PIN_13
#define MF522_SI_pin GPIO_PIN_14
#define MF522_SO_pin GPIO_PIN_15#define MF522_RST_GP GPIOA //RC500片选
#define MF522_NSS_GP GPIOB
#define MF522_SCK_GP GPIOB
#define MF522_SI_GP GPIOB
#define MF522_SO_GP GPIOB#define RCAP2LH 0xCA;
#define T2LH 0xCC;
#define MAXRLEN 18 void SPI_inti(void){GPIO_InitTypeDef GPIO_InitStruct {0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull GPIO_NOPULL;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pin MF522_SCK_pin; //sckHAL_GPIO_Init(MF522_SCK_GP,GPIO_InitStruct);GPIO_InitStruct.Pin MF522_RST_pin; //RSTHAL_GPIO_Init(MF522_RST_GP,GPIO_InitStruct);GPIO_InitStruct.Pin MF522_NSS_pin; //SNNHAL_GPIO_Init(MF522_NSS_GP,GPIO_InitStruct);//LED灯GPIO_InitStruct.Pin GPIO_PIN_4;HAL_GPIO_Init(GPIOB,GPIO_InitStruct);GPIO_InitStruct.Pin MF522_SI_pin;HAL_GPIO_Init(MF522_SI_GP,GPIO_InitStruct); //MSI 输出GPIO_InitStruct.Mode GPIO_MODE_INPUT;GPIO_InitStruct.Pin MF522_SO_pin; //MSO 输入HAL_GPIO_Init(MF522_SO_GP,GPIO_InitStruct);
}void FRID_init(void){
// PcdReset();PcdAntennaOff(); PcdAntennaOn();
// M500PcdConfigISOType( A );
// HAL_Delay(100);
// PcdAntennaOff();
// PcdAntennaOn();SPI_inti();PcdReset();PcdAntennaOff(); PcdAntennaOn(); M500PcdConfigISOType( A );HAL_Delay(100);}
/
//功 能寻
//参数说明: Key_A:密码A
// Key_B:密码A
// Control控制码
// Section: 扇区 0-15
//返 回: 成功返回MI_OK
/char Set_Control_Password(unsigned char* Key_A, unsigned char* Key_B,unsigned char* Control,unsigned char Section){unsigned char Set_data[16];unsigned int i0;if(My_Request(26) ! MI_OK){return MI_ERR;}for(;i16;i){if(i6){Set_data[i]Key_A[i];}else if(i6 i 10){Set_data[i]Control[i-6];}else if(i10){Set_data[i]Key_B[i-10];}}if(PcdWrite(Section*43,Set_data) MI_OK){
// printf(设置成功\n);return MI_OK;}return MI_ERR;
}/
//功 能寻卡,读取卡号防碰撞验证密码
//返 回: 成功返回MI_OK
/
char My_Request(u8 type){if( PcdRequest(type,(RevBuffer[0])) MI_OK ){
// printf(检测到卡片\n);if(PcdAnticoll((RevBuffer[0])) MI_OK){
// printf(防碰撞成功获取卡号);
// for(int i 0;i strlen((char *)RevBuffer);i){
// printf(%x,RevBuffer[i]);
// }
// u8_to_HexStr((u8*)RevBuffer,(u8*)parameterAll.SN,4);
// strncpy(parameterAll.SN,RevBuffer,4);
// printf(\n);if(PcdSelect(RevBuffer) MI_OK ){
// printf(选卡成功\n);return MI_OK;// if( PcdAuthState(0x60,page,DefaultKey,RevBuffer) MI_OK PcdAuthState(0x61,page,DefaultKey,RevBuffer) MI_OK ){
// printf(AB密码同时验证成功\n);
// return MI_OK;
// }}}}return MI_ERR;
}char Read_Card(unsigned char read_page,unsigned char* password_A,unsigned char*password_B,unsigned char * card_num ,unsigned char* read_buf){if( PcdAuthState(0x60,read_page,password_A,card_num) MI_OK PcdAuthState(0x61,read_page,password_A,card_num) MI_OK ){printf(AB密码同时验证成功\n);if(PcdRead(read_page,read_buf) MI_OK){return MI_OK;}}return MI_ERR;
}char Write_Card(unsigned char read_page,unsigned char* password_A,unsigned char*password_B,unsigned char * card_num,unsigned char* write_buf){if( PcdAuthState(0x60,read_page,password_A,card_num) MI_OK PcdAuthState(0x61,read_page,password_A,card_num) MI_OK ){printf(AB密码同时验证成功\n);if(PcdWrite(read_page,write_buf) MI_OK){printf(写入成功\n);return MI_OK;}}return MI_ERR;}
/
//功 能寻卡
//参数说明: req_code[IN]:寻卡方式
// 0x52 寻感应区内所有符合14443A标准的卡
// 0x26 寻未进入休眠状态的卡
// pTagType[OUT]卡片类型代码
// 0x4400 Mifare_UltraLight
// 0x0400 Mifare_One(S50)
// 0x0200 Mifare_One(S70)
// 0x0800 Mifare_Pro(X)
// 0x4403 Mifare_DESFire
//返 回: 成功返回MI_OK
/
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{char status; unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN];
// unsigned char xTest ;ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);// xTest ReadRawRC(BitFramingReg);
// if(xTest 0x07 )// { LED_GREEN 0 ;}// else {LED_GREEN 1 ;while(1){}}SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] req_code;status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,unLen);
// if(status MI_OK )
// { LED_GREEN 0 ;}
// else {LED_GREEN 1 ;}if ((status MI_OK) (unLen 0x10)){ *pTagType ucComMF522Buf[0];*(pTagType1) ucComMF522Buf[1];}else{ status MI_ERR; }return status;
}/
//功 能防冲撞
//参数说明: pSnr[OUT]:卡片序列号4字节
//返 回: 成功返回MI_OK
/
char PcdAnticoll(unsigned char *pSnr)
{char status;unsigned char i,snr_check0;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] PICC_ANTICOLL1;ucComMF522Buf[1] 0x20;status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,unLen);if (status MI_OK){for (i0; i4; i){ *(pSnri) ucComMF522Buf[i];snr_check ^ ucComMF522Buf[i];}if (snr_check ! ucComMF522Buf[i]){ status MI_ERR; }}SetBitMask(CollReg,0x80);return status;
}/
//功 能选定卡片
//参数说明: pSnr[IN]:卡片序列号4字节
//返 回: 成功返回MI_OK
/
char PcdSelect(unsigned char *pSnr)
{char status;unsigned char i;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] PICC_ANTICOLL1;ucComMF522Buf[1] 0x70;ucComMF522Buf[6] 0;for (i0; i4; i){ucComMF522Buf[i2] *(pSnri);ucComMF522Buf[6] ^ *(pSnri);}CalulateCRC(ucComMF522Buf,7,ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,unLen);if ((status MI_OK) (unLen 0x18)){ status MI_OK; }else{ status MI_ERR; }return status;
}/
//功 能验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式
// 0x60 验证A密钥
// 0x61 验证B密钥
// addr[IN]块地址
// pKey[IN]密码
// pSnr[IN]卡片序列号4字节
//返 回: 成功返回MI_OK
/
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
{char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] auth_mode;ucComMF522Buf[1] addr;for (i0; i6; i){ ucComMF522Buf[i2] *(pKeyi); }for (i0; i6; i){ ucComMF522Buf[i8] *(pSnri); }// memcpy(ucComMF522Buf[2], pKey, 6); // memcpy(ucComMF522Buf[8], pSnr, 4); status PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,unLen);if ((status ! MI_OK) || (!(ReadRawRC(Status2Reg) 0x08))){ status MI_ERR; }return status;}/
//功 能读取M1卡一块数据
//参数说明: addr[IN]块地址
// pData[OUT]读出的数据16字节
//返 回: 成功返回MI_OK
/
char PcdRead(unsigned char addr,unsigned char *pData)
{char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] PICC_READ;ucComMF522Buf[1] addr;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);if ((status MI_OK) (unLen 0x90))// { memcpy(pData, ucComMF522Buf, 16); }{for (i0; i16; i){ *(pDatai) ucComMF522Buf[i]; }}else{ status MI_ERR; }return status;
}/
//功 能写数据到M1卡一块
//参数说明: addr[IN]块地址
// pData[IN]写入的数据16字节
//返 回: 成功返回MI_OK
/
char PcdWrite(unsigned char addr,unsigned char *pData)
{char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] PICC_WRITE;ucComMF522Buf[1] addr;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);if ((status ! MI_OK) || (unLen ! 4) || ((ucComMF522Buf[0] 0x0F) ! 0x0A)){ status MI_ERR; }if (status MI_OK){//memcpy(ucComMF522Buf, pData, 16);for (i0; i16; i){ ucComMF522Buf[i] *(pDatai); }CalulateCRC(ucComMF522Buf,16,ucComMF522Buf[16]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,unLen);if ((status ! MI_OK) || (unLen ! 4) || ((ucComMF522Buf[0] 0x0F) ! 0x0A)){ status MI_ERR; }}return status;
}/
//功 能命令卡片进入休眠状态
//返 回: 成功返回MI_OK
/
char PcdHalt(void)
{char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] PICC_HALT;ucComMF522Buf[1] 0;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);return MI_OK;
}/
//用MF522计算CRC16函数
/
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
{unsigned char i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i0; ilen; i){ WriteRawRC(FIFODataReg, *(pIndatai)); }WriteRawRC(CommandReg, PCD_CALCCRC);i 0xFF;do {n ReadRawRC(DivIrqReg);i--;}while ((i!0) !(n0x04));pOutData[0] ReadRawRC(CRCResultRegL);pOutData[1] ReadRawRC(CRCResultRegM);
}/
//功 能复位RC522
//返 回: 成功返回MI_OK
/
char PcdReset(void)
{MF522_RST1;delay_us(10);MF522_RST0;delay_us(10);MF522_RST1;delay_us(10);WriteRawRC(CommandReg,PCD_RESETPHASE);WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯CRC初始值0x6363WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40); return MI_OK;
}
//
//设置RC632的工作方式
//
char M500PcdConfigISOType(unsigned char type)
{if (type A) //ISO14443_A{ ClearBitMask(Status2Reg,0x08);/* WriteRawRC(CommandReg,0x20); //as default WriteRawRC(ComIEnReg,0x80); //as defaultWriteRawRC(DivlEnReg,0x0); //as defaultWriteRawRC(ComIrqReg,0x04); //as defaultWriteRawRC(DivIrqReg,0x0); //as defaultWriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensorWriteRawRC(WaterLevelReg,0x08); //as defaultWriteRawRC(ControlReg,0x20); //as defaultWriteRawRC(CollReg,0x80); //as default
*/WriteRawRC(ModeReg,0x3D);//3F
/* WriteRawRC(TxModeReg,0x0); //as default???WriteRawRC(RxModeReg,0x0); //as default???WriteRawRC(TxControlReg,0x80); //as default???WriteRawRC(TxSelReg,0x10); //as default???*/WriteRawRC(RxSelReg,0x86);//84// WriteRawRC(RxThresholdReg,0x84);//as default// WriteRawRC(DemodReg,0x4D); //as default// WriteRawRC(ModWidthReg,0x13);//26WriteRawRC(RFCfgReg,0x7F); //4F/* WriteRawRC(GsNReg,0x88); //as default???WriteRawRC(CWGsCfgReg,0x20); //as default???WriteRawRC(ModGsCfgReg,0x20); //as default???
*/WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal h6a tmoLength(dec) WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);// PcdSetTmo(106);delay_10ms(1);PcdAntennaOn();}else{ return -1; }return MI_OK;
}
/
//功 能读RC632寄存器
//参数说明Address[IN]:寄存器地址
//返 回读出的值
/
unsigned char ReadRawRC(unsigned char Address)
{unsigned char i, ucAddr;unsigned char ucResult0;MF522_SCK 0;MF522_NSS 0;ucAddr ((Address1)0x7E)|0x80;for(i8;i0;i--){MF522_SI ((ucAddr0x80)0x80);MF522_SCK 1;ucAddr 1;MF522_SCK 0;}for(i8;i0;i--){MF522_SCK 1;ucResult 1;ucResult|MF522_SO;MF522_SCK 0;}MF522_NSS 1;MF522_SCK 1;return ucResult;
}/
//功 能写RC632寄存器
//参数说明Address[IN]:寄存器地址
// value[IN]:写入的值
/void WriteRawRC(unsigned char Address, unsigned char value)
{ unsigned char i, ucAddr;MF522_SCK 0;// 片选MF522_NSS 0;// 先左移是为了确定地址与上0x7e即取1到6位ucAddr ((Address1)0x7E);// 先送地址位for(i8;i0;i--){MF522_SI ((ucAddr0x80)0x80);// 时钟线变换MF522_SCK 1;ucAddr 1;MF522_SCK 0;delay_us(10); }// 再送数据for(i8;i0;i--){MF522_SI ((value0x80)0x80);// 时钟线变换MF522_SCK 1;value 1;MF522_SCK 0;delay_us(10); }MF522_NSS 1;MF522_SCK 1;
}#if 0
void WriteRawRC(unsigned char Address, unsigned char value)
{ unsigned char i, ucAddr;MF522_SCK 0;MF522_NSS 0;ucAddr ((Address1)0x7E);for(i8;i0;i--){
// MF522_SI ((ucAddr0x80)0x80);
// MF522_SCK 1;
// delay_us(time_s);
// ucAddr 1;
// MF522_SCK 0;
// delay_us(time_s);MF522_SI ((ucAddr0x80)0x80);MF522_SCK 1;delay_us(time_s);ucAddr 1;MF522_SCK 0;delay_us(time_s);}for(i8;i0;i--){MF522_SI ((value0x80)0x80);MF522_SCK 1;delay_us(5);value 1;MF522_SCK 0;}MF522_NSS 1;MF522_SCK 1;
}
#endif
/
//功 能置RC522寄存器位
//参数说明reg[IN]:寄存器地址
// mask[IN]:置位值
/
void SetBitMask(unsigned char reg,unsigned char mask)
{char tmp 0x0;tmp ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask
}/
//功 能清RC522寄存器位
//参数说明reg[IN]:寄存器地址
// mask[IN]:清位值
/
void ClearBitMask(unsigned char reg,unsigned char mask)
{char tmp 0x0;tmp ReadRawRC(reg);WriteRawRC(reg, tmp ~mask); // clear bit mask
} /
//功 能通过RC522和ISO14443卡通讯
//参数说明Command[IN]:RC522命令字
// pInData[IN]:通过RC522发送到卡片的数据
// InLenByte[IN]:发送数据的字节长度
// pOutData[OUT]:接收到的卡片返回数据
// *pOutLenBit[OUT]:返回数据的位长度
/
char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit)
{char status MI_ERR;unsigned char irqEn 0x00;unsigned char waitFor 0x00;unsigned char lastBits;unsigned char n;unsigned int i;switch (Command){case PCD_AUTHENT:irqEn 0x12;waitFor 0x10;break;case PCD_TRANSCEIVE:irqEn 0x77;waitFor 0x30;break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x80);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i0; iInLenByte; i){ WriteRawRC(FIFODataReg, pInData[i]); }WriteRawRC(CommandReg, Command);if (Command PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }// i 600;//根据时钟频率调整操作M1卡最大等待时间25msi 2000;do {n ReadRawRC(ComIrqReg);i--;}while ((i!0) !(n0x01) !(nwaitFor));ClearBitMask(BitFramingReg,0x80);if (i!0){ if(!(ReadRawRC(ErrorReg)0x1B)){status MI_OK;if (n irqEn 0x01){ status MI_NOTAGERR; }if (Command PCD_TRANSCEIVE){n ReadRawRC(FIFOLevelReg);lastBits ReadRawRC(ControlReg) 0x07;if (lastBits){ *pOutLenBit (n-1)*8 lastBits; }else{ *pOutLenBit n*8; }if (n 0){ n 1; }if (n MAXRLEN){ n MAXRLEN; }for (i0; in; i){ pOutData[i] ReadRawRC(FIFODataReg); }}}else{ status MI_ERR; }}SetBitMask(ControlReg,0x80); // stop timer nowWriteRawRC(CommandReg,PCD_IDLE); return status;
}/
//开启天线
//每次启动或关闭天险发射之间应至少有1ms的间隔
/
void PcdAntennaOn()
{unsigned char i;i ReadRawRC(TxControlReg);if (!(i 0x03)){SetBitMask(TxControlReg, 0x03);}
}/
//关闭天线
/
void PcdAntennaOff()
{ClearBitMask(TxControlReg, 0x03);
}/
//功 能扣款和充值
//参数说明: dd_mode[IN]命令字
// 0xC0 扣款
// 0xC1 充值
// addr[IN]钱包地址
// pValue[IN]4字节增(减)值低位在前
//返 回: 成功返回MI_OK
/
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] dd_mode;ucComMF522Buf[1] addr;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);if ((status ! MI_OK) || (unLen ! 4) || ((ucComMF522Buf[0] 0x0F) ! 0x0A)){ status MI_ERR; }if (status MI_OK){memcpy(ucComMF522Buf, pValue, 4);// for (i0; i16; i)// { ucComMF522Buf[i] *(pValuei); }CalulateCRC(ucComMF522Buf,4,ucComMF522Buf[4]);unLen 0;status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,unLen);if (status ! MI_ERR){ status MI_OK; }}if (status MI_OK){ucComMF522Buf[0] PICC_TRANSFER;ucComMF522Buf[1] addr;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]); status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);if ((status ! MI_OK) || (unLen ! 4) || ((ucComMF522Buf[0] 0x0F) ! 0x0A)){ status MI_ERR; }}return status;
}/
//功 能备份钱包
//参数说明: sourceaddr[IN]源地址
// goaladdr[IN]目标地址
//返 回: 成功返回MI_OK
/
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
{char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] PICC_RESTORE;ucComMF522Buf[1] sourceaddr;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);if ((status ! MI_OK) || (unLen ! 4) || ((ucComMF522Buf[0] 0x0F) ! 0x0A)){ status MI_ERR; }if (status MI_OK){ucComMF522Buf[0] 0;ucComMF522Buf[1] 0;ucComMF522Buf[2] 0;ucComMF522Buf[3] 0;CalulateCRC(ucComMF522Buf,4,ucComMF522Buf[4]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,unLen);if (status ! MI_ERR){ status MI_OK; }}if (status ! MI_OK){ return MI_ERR; }ucComMF522Buf[0] PICC_TRANSFER;ucComMF522Buf[1] goaladdr;CalulateCRC(ucComMF522Buf,2,ucComMF522Buf[2]);status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,unLen);if ((status ! MI_OK) || (unLen ! 4) || ((ucComMF522Buf[0] 0x0F) ! 0x0A)){ status MI_ERR; }return status;
}///
// Delay 10ms
///
void delay_10ms(unsigned int _10ms)
{delay_ms(_10ms*10);
}RC522.h
#ifndef MFRC522_H
#define MFRC522_H/
//外部变量
/
extern unsigned char RevBuffer[30];
extern unsigned char DefaultKey[6];
extern unsigned char page ;
//
//函数原型
/char PcdReset(void);
void PcdAntennaOn(void);
void PcdAntennaOff(void);
char PcdRequest(unsigned char req_code,unsigned char *pTagType);
char PcdAnticoll(unsigned char *pSnr);
char PcdSelect(unsigned char *pSnr);
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr);
char PcdRead(unsigned char addr,unsigned char *pData);
char PcdWrite(unsigned char addr,unsigned char *pData);
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr);
char PcdHalt(void);
char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit);
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData);
void WriteRawRC(unsigned char Address,unsigned char value);
unsigned char ReadRawRC(unsigned char Address);
void SetBitMask(unsigned char reg,unsigned char mask);
void ClearBitMask(unsigned char reg,unsigned char mask);
char M500PcdConfigISOType(unsigned char type);
void delay_10ms(unsigned int _10ms);
//void iccardcode();
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr);
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);
/
//MF522命令字
/
#define PCD_IDLE 0x00 //取消当前命令
#define PCD_AUTHENT 0x0E //验证密钥
#define PCD_RECEIVE 0x08 //接收数据
#define PCD_TRANSMIT 0x04 //发送数据
#define PCD_TRANSCEIVE 0x0C //发送并接收数据
#define PCD_RESETPHASE 0x0F //复位
#define PCD_CALCCRC 0x03 //CRC计算/
//Mifare_One卡片命令字
/
#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态
#define PICC_REQALL 0x52 //寻天线区内全部卡
#define PICC_ANTICOLL1 0x93 //防冲撞
#define PICC_ANTICOLL2 0x95 //防冲撞
#define PICC_AUTHENT1A 0x60 //验证A密钥
#define PICC_AUTHENT1B 0x61 //验证B密钥
#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 //休眠/
//MF522 FIFO长度定义
/
#define DEF_FIFO_LENGTH 64 //FIFO size64byte/
//MF522寄存器定义
/
// PAGE 0
#define RFU00 0x00
#define CommandReg 0x01
#define ComIEnReg 0x02
#define DivlEnReg 0x03
#define ComIrqReg 0x04
#define DivIrqReg 0x05
#define ErrorReg 0x06
#define Status1Reg 0x07
#define Status2Reg 0x08
#define FIFODataReg 0x09
#define FIFOLevelReg 0x0A
#define WaterLevelReg 0x0B
#define ControlReg 0x0C
#define BitFramingReg 0x0D
#define CollReg 0x0E
#define RFU0F 0x0F
// PAGE 1
#define RFU10 0x10
#define ModeReg 0x11
#define TxModeReg 0x12
#define RxModeReg 0x13
#define TxControlReg 0x14
#define TxAutoReg 0x15
#define TxSelReg 0x16
#define RxSelReg 0x17
#define RxThresholdReg 0x18
#define DemodReg 0x19
#define RFU1A 0x1A
#define RFU1B 0x1B
#define MifareReg 0x1C
#define RFU1D 0x1D
#define RFU1E 0x1E
#define SerialSpeedReg 0x1F
// PAGE 2
#define RFU20 0x20
#define CRCResultRegM 0x21
#define CRCResultRegL 0x22
#define RFU23 0x23
#define ModWidthReg 0x24
#define RFU25 0x25
#define RFCfgReg 0x26
#define GsNReg 0x27
#define CWGsCfgReg 0x28
#define ModGsCfgReg 0x29
#define TModeReg 0x2A
#define TPrescalerReg 0x2B
#define TReloadRegH 0x2C
#define TReloadRegL 0x2D
#define TCounterValueRegH 0x2E
#define TCounterValueRegL 0x2F
// PAGE 3
#define RFU30 0x30
#define TestSel1Reg 0x31
#define TestSel2Reg 0x32
#define TestPinEnReg 0x33
#define TestPinValueReg 0x34
#define TestBusReg 0x35
#define AutoTestReg 0x36
#define VersionReg 0x37
#define AnalogTestReg 0x38
#define TestDAC1Reg 0x39
#define TestDAC2Reg 0x3A
#define TestADCReg 0x3B
#define RFU3C 0x3C
#define RFU3D 0x3D
#define RFU3E 0x3E
#define RFU3F 0x3F/
//和MF522通讯时返回的错误代码
/
#define MI_OK 0
#define MI_NOTAGERR (-1)
#define MI_ERR (-2)//自定义函数
/
char My_Request(unsigned char type);
void SPI_inti(void);
char Set_Control_Password(unsigned char* Key_A, unsigned char* Key_B,unsigned char* Control,unsigned char Section);
void FRID_init(void);
char Write_Card(unsigned char read_page,unsigned char* password_A,unsigned char*password_B,unsigned char * card_num,unsigned char* write_buf);
char Read_Card(unsigned char read_page,unsigned char* password_A,unsigned char*password_B,unsigned char * card_num,unsigned char* read_buf);#endif