山西建设厅网站2016年3号文件,木匠手做网站,严什么的烟 网站建设,城市建设网站金文章目录 一、RFID是什么#xff1f;二、RC522模块三、使用步骤1.硬件1.硬件连接2.引脚定义 2.软件1.初始化配置代码如下#xff08;示例#xff09;#xff1a;2.引脚配置代码如下#xff08;示例#xff09;#xff1a;3.模块复位代码如下#xff08;示例#xff09… 文章目录 一、RFID是什么二、RC522模块三、使用步骤1.硬件1.硬件连接2.引脚定义 2.软件1.初始化配置代码如下示例2.引脚配置代码如下示例3.模块复位代码如下示例4.关闭天线代码如下示例5.打开天线代码如下示例6.SPI写字节代码如下示例7.SPI读字节代码如下示例8.写寄存器代码如下示例9.读寄存器代码如下示例10.寻卡代码如下示例11.防止多卡冲突代码如下示例12.选定卡片代码如下示例13.验证卡片密码代码如下示例14.测试程序代码如下示例15.测试结果示例1.演示视频2.串口打印 四.总结 一、RFID是什么
射频识别RFID是一种通过使用无线电波来识别和跟踪物体的技术。它主要由一个小标签和一个读取器两部分组成。
标签是一种小型装置可以附在物体上。它里面有一个芯片和一个天线。芯片存储了关于物体的信息比如唯一的标识码。天线用来接收和发送无线电信号。
读取器是一个设备可以与标签进行通信。它发出无线电波并接收标签返回的信号。当读取器接近标签时它能够读取标签中存储的信息。
通过使用射频识别我们可以追踪和管理物体因为每个标签都有一个独特的标识码。例如在物流和供应链管理中可以使用RFID来跟踪货物的位置和状态。在库存管理中可以使用RFID来自动记录库存量。在门禁系统中可以使用RFID来验证身份。
二、RC522模块
MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片是智能仪表和便携式手持设备研发的较好选择。
MFRC522利用了先进的调制和解调概念完全集成了在13.56MHZ下所有类型的被动非接触式通信方式和协议。支持14443A兼容应答器信号。数字部分处理ISO14443A和错误检测。支持快速CRYPTO1加密算法双向数据传输速率高达848kbit/s64Byte收发FIFO缓冲器、可编程定时器、中断、CRC协处理器内部自检硬件复位。
网上买回来的实物如下所示 其中S50钥匙卡和S50复旦卡工作频率均为13.56MHZ。 三、使用步骤
1.硬件
1.硬件连接
RC522 接口STM32引脚SDA(数据接口)PA1SCK时钟接口PA2MOSISPI 接口主出从入PA3MISOSPI 接口主入从出PA4IRQPA5没用上可不接 GND地GNDRST复位信号PA63.3V电源3.3V
2.引脚定义
/* Defines ------------------------------------------------------------------*/
#define RC522_GPIO_RCC RCC_APB2Periph_GPIOA
#define RC522_GPIO_Port GPIOA
#define RC522_RST_Pin GPIO_Pin_6//复位信号
#define RC522_IRQ_Pin GPIO_Pin_5//中断没用上可不接
#define RC522_MISO_Pin GPIO_Pin_4//MISOSPI 接口主入从出
#define RC522_MOSI_Pin GPIO_Pin_3//MOSISPI 接口主出从入
#define RC522_SCK_Pin GPIO_Pin_2//SCK时钟接口
#define RC522_SDA_Pin GPIO_Pin_1//SDA(数据接口)//根据实际的引脚修改2.软件
1.初始化配置代码如下示例
/******************************************************************************** 函数名User_RC522_Init* 描述 RC522初始化* 输入 void* 输出 void* 调用 初始化* 备注
*******************************************************************************/
void User_RC522_Init(void)
{RC522_GPIO_Init();RC522_RESET();Turn_off_Antenna();delay_syms(1);Open_on_Antenna();
}2.引脚配置代码如下示例
/******************************************************************************** 函数名RC522_GPIO_Init* 描述 RC522引脚配置初始化* 输入 void* 输出 void* 调用 初始化* 备注
*******************************************************************************/
void RC522_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RC522_GPIO_RCC, ENABLE);GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin RC522_RST_Pin | RC522_MOSI_Pin | RC522_SCK_Pin | RC522_SDA_Pin; GPIO_Init(RC522_GPIO_Port, GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_InitStructure.GPIO_Pin RC522_MISO_Pin; GPIO_Init(RC522_GPIO_Port, GPIO_InitStructure);
}3.模块复位代码如下示例
/******************************************************************************** 函数名RC522_RESET* 描述 RC522模块复位* 输入 void* 输出 uint8_t* 调用 * 备注
*******************************************************************************/
uint8_t RC522_RESET(void)
{RC522_RST_HIGH();delay_syms(1); RC522_RST_LOW();delay_syms(1); RC522_RST_HIGH();delay_syms(1); WriteRawRC(CommandReg,PCD_RESETPHASE);delay_syms(1); WriteRawRC(ModeReg,0x3D);//和Mifare卡通讯CRC初始值0x6363WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E); WriteRawRC(TxAutoReg,0x40);//调制发送信号为100%ASK特别注意return MI_OK;
}4.关闭天线代码如下示例
/******************************************************************************** 函数名Turn_off_Antenna* 描述 关闭天线* 输入 void* 输出 void* 调用 * 备注
*******************************************************************************/
void Turn_off_Antenna(void)
{ClearBitMask(TxControlReg, 0x03);
}5.打开天线代码如下示例
/******************************************************************************** 函数名Open_on_Antenna* 描述 打开天线* 输入 void* 输出 void* 调用 * 备注 每次启动或关闭天险发射之间应至少有1ms的间隔
*******************************************************************************/
void Open_on_Antenna(void)
{uint8_t i;i ReadRawRC(TxControlReg);if (!(i 0x03)){SetBitMask(TxControlReg, 0x03);}
}6.SPI写字节代码如下示例
/******************************************************************************** 函数名SPI_Send_Byte* 描述 SPI写字节* 输入 byte* 输出 void* 调用 * 备注
*******************************************************************************/
void SPI_Send_Byte(uint8_t byte)
{uint8_t i; for(i 0; i 8; i){ if(byte 0x80){RC522_MOSI_HIGH();}else {RC522_MOSI_LOW();}delay_syms(1); RC522_SCK_LOW();delay_syms(1); RC522_SCK_HIGH();delay_syms(1); byte 1; }
}7.SPI读字节代码如下示例
/******************************************************************************** 函数名SPI_Read_Byte* 描述 SPI读字节* 输入 byte* 输出 void* 调用 * 备注
*******************************************************************************/
uint8_t SPI_Read_Byte(void)
{uint8_t i;uint8_t Data; for(i 0; i 8; i){Data 1; RC522_SCK_LOW(); delay_syms(1); if(MISO_IN_Read() 1){Data | 0x01;}delay_syms(1); RC522_SCK_HIGH(); delay_syms(1); }return Data;
}8.写寄存器代码如下示例
/******************************************************************************** 函数名WriteRawRC* 描述 RC522写寄存器* 输入 Address[IN]:寄存器地址,value[IN]:写入的* 输出 void* 调用 * 备注
*******************************************************************************/
void WriteRawRC(uint8_t Address, uint8_t value)
{ uint8_t ucAddr;ucAddr ((Address1)0x7E);RC522_SDA_LOW();SPI_Send_Byte(ucAddr); SPI_Send_Byte(value); RC522_SDA_HIGH();
}9.读寄存器代码如下示例
/******************************************************************************** 函数名ReadRawRC* 描述 RC522读寄存器* 输入 Address[IN]:寄存器地址* 输出 void* 调用 * 备注
*******************************************************************************/
uint8_t ReadRawRC(uint8_t Address)
{uint8_t ucAddr,ucResult;ucAddr ((Address1)0x7E)|0x80; RC522_SDA_LOW(); SPI_Send_Byte(ucAddr); ucResult SPI_Read_Byte();RC522_SDA_HIGH();return ucResult;
}10.寻卡代码如下示例
/******************************************************************************** 函数名Search_card* 描述 RC522寻卡* 输入 req_code[IN]:寻卡方式0x52 寻感应区内所有符合14443A标准的卡0x26 寻未进入休眠状态的卡pTagType[OUT]卡片类型代码0x4400 Mifare_UltraLight0x0400 Mifare_One(S50)0x0200 Mifare_One(S70)0x0800 Mifare_Pro(X)0x4403 Mifare_DESFire* 输出 成功返回MI_OK* 调用 * 备注
*******************************************************************************/
uint8_t Search_card(uint8_t req_code,uint8_t *pTagType)
{uint8_t status; uint16_t unLen;uint8_t ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03); ucComMF522Buf[0] req_code;status Communication_card(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,unLen); if ((status MI_OK) (unLen 0x10)){ *pTagType ucComMF522Buf[0];*(pTagType1) ucComMF522Buf[1];}else{ status MI_ERR; } return status;
}11.防止多卡冲突代码如下示例
/******************************************************************************** 函数名Anti_collision* 描述 防冲撞* 输入 pSnr[OUT]:卡片序列号4字节* 输出 成功返回MI_OK* 调用 * 备注
*******************************************************************************/
uint8_t Anti_collision(uint8_t *pSnr)
{uint8_t status;uint8_t i,snr_check0;uint16_t unLen;uint8_t ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80); ucComMF522Buf[0] PICC_ANTICOLL1;ucComMF522Buf[1] 0x20;status Communication_card(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;
}12.选定卡片代码如下示例
/******************************************************************************** 函数名Selected_card* 描述 选定卡片* 输入 pSnr[IN]:卡片序列号4字节* 输出 成功返回MI_OK* 调用 * 备注
*******************************************************************************/
uint8_t Selected_card(uint8_t *pSnr)
{uint8_t status;uint8_t i;uint16_t unLen;uint8_t 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 Communication_card(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,unLen); if ((status MI_OK) (unLen 0x18)){ status MI_OK;}else{ status MI_ERR; }return status;
}13.验证卡片密码代码如下示例
/******************************************************************************** 函数名Verify_card* 描述 验证卡片密码* 输入 auth_mode[IN]: 密码验证模式0x60 验证A密钥0x61 验证B密钥 addr[IN]块地址pKey[IN]密码pSnr[IN]卡片序列号4字节* 输出 成功返回MI_OK* 调用 * 备注
*******************************************************************************/
uint8_t Verify_card(uint8_t auth_mode,uint8_t addr,uint8_t *pKey,uint8_t *pSnr)
{uint8_t status;uint16_t unLen;uint8_t i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] auth_mode;ucComMF522Buf[1] addr;for (i0; i6; i){ ucComMF522Buf[i2] *(pKeyi); }for (i0; i6; i){ ucComMF522Buf[i8] *(pSnri); } status Communication_card(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,unLen);if ((status ! MI_OK) || (!(ReadRawRC(Status2Reg) 0x08))){ status MI_ERR;} return status;
}14.测试程序代码如下示例
/******************************************************************************** 函数名RC522_Test* 描述 RC522测试* 输入 void* 输出 void* 调用 * 备注
*******************************************************************************/
void RC522_Test(void)
{uint8_t i;status Search_card(PICC_REQALL, g_ucTempbuf);//寻天线区内全部卡if(status MI_OK)//寻卡成功{ status MI_ERR;status Anti_collision(g_ucTempbuf);//防卡片冲突} if(status MI_OK)//防冲突检测成功{ status MI_ERR;status Selected_card(g_ucTempbuf);//选定卡片}if(status MI_OK)//选定卡片成功{ Beep_Test();status MI_ERR;Uart1Prints(g_ucTempbuf);for(i 0;i 4; i){Byte2Str(g_ucTempbuf[i], g_ucTempbuf_str[i*2]);}LCD_Clear_Str(WHITE);//清屏LCD_Fill(40,80,128,128,POINT_COLOR); status Verify_card(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码}Sleep_card();//进入休眠状态
}显示ID部分这里的显示是用1.44寸彩屏显示的不懂的话可以参考我的另外一篇博客:1.44寸TFT彩屏SPI接口图像显示应用 Gui_Drawbmp16(0,0,gImage_xiaobuding); Show_Str(10,80,RED,WHITE,ID:,20,1); Show_Str(40,80,RED,WHITE,(u8*)(g_ucTempbuf_str),20,1); 15.测试结果示例
1.演示视频
测试视频内容就是先拿IC钥匙扣去刷可以听到清脆的蜂鸣器叫声并识别到卡片ID为90C00155接着拿S50复旦卡去刷可以听到清脆的蜂鸣器叫声并识别到卡片ID为03878D03。 RC522测试视频 2.串口打印
串口打印内容就是先拿IC钥匙扣去刷打印卡片ID为90C00155接着拿S50复旦卡去刷打印卡片ID为03878D03。 四.总结
今天主要实现了用RFID射频模块来读取IC钥匙扣以及S50复旦卡的ID至于实现扣款和充值钱包功能等感兴趣的可以下载附件试试感谢你的观看谢谢