RC522应用总结

article/2025/8/23 1:16:04

公司需要做刷卡模块,因此选了RC522做demo程序。下面就RC522知识做简要的总结。
本人使用stm32的硬件spi接口搭建工程,相关的配置如下:
spi配置:
引脚配置
SDA -------PA4
SCLK ----PB13
MOSI -------PB15
MISO ------PB14
IRQ —没接
RST ---- PB0

//PB12--NSS PB13--SCK  PB14--MISO  PB15--MOSI
void SPI2_Init(void)
{	 RCC->APB2ENR |= 1 << 3;   //开启PORT b端口时钟      RCC->APB1ENR |= 1 << 14;  //开启SPI2时钟   //	PB13,PB14 PB15复用输出   GPIOB->CRH &= 0X000FFFFF; GPIOB->CRH |= 0XBBB00000;    GPIOB->ODR |= 7 << 13;    SPI2->CR1 |= 0<<10;   //全双工模式SPI2->CR1 |= 1<<9;    //启用软件管理SPI2->CR1 |= 1<<8;      //ssi = 1SPI2->CR1 |= 1<<2;     // 主设备SPI2->CR1 |= 0<<11;    //8 bitSPI2->CR1 |= 1<<1;     //SCK空闲为高SPI2->CR1 |= 1<<0;     //上升沿采样SPI2->CR1 |= 7<<3;     //256分频SPI2->CR1 |= 0<<7;     //先发MSBSPI2->CR1 |= 1<<6;    //开启SPI	SPI2->CR2 |= 1 << 2;//SPI2_ReadWriteByte(0xff);	 
}   void SPI2_SetSpeed(u8 SpeedSet)
{SPI2->CR1 &= 0XFFC7;if(SpeedSet==SPI_SPEED_2){SPI2->CR1|=0<<3;}else if(SpeedSet==SPI_SPEED_8) {SPI2->CR1|=2<<3;}else if(SpeedSet==SPI_SPEED_16){SPI2->CR1|=3<<3;}else			 	 {SPI2->CR1|=7<<3; }SPI2->CR1|=1<<6; 	  
} u8 SPI2_ReadWriteByte(u8 TxData)
{		u8 retry=0;				 while((SPI2->SR&1<<1)==0){retry++;if(retry>200)return 0;}			  SPI2->DR=TxData;	 	 retry=0;while((SPI2->SR&1<<0)==0)  {retry++;if(retry>200)return 0;}	  						    return SPI2->DR;          			    
}

RC522相关接口初始化:
由于spi的cs由软件控制,所以,这里设置PA4为CS,PB0为rst

void RCC52_init(void)
{RCC->APB2ENR |= 1 << 3;       	    RCC->APB2ENR |= 1 << 2;GPIOB->CRL &= 0XFFFFFFF0; GPIOB->CRL |= 0X00000003;   GPIOB->ODR |= 1 << 0;   GPIOA->CRL &= 0XFFF0FFFF; GPIOA->CRL |= 0X00030000;   GPIOA->ODR |= 1 << 4; 
}

rc522的识别过程:
在这里插入图片描述寻卡---------->防冲突---------->寻卡--------->验证密码--------->存储操作
卡的操作包括:
读 (Read):读一个块;
写 (Write):写一个块;
加(Increment):对数值块进行加值;
减(Decrement):对数值块进行减值;
存储(Restore):将块中的内容存到数据寄存器中;
传输(Transfer):将数据寄存器中的内容写入块中;
中止(Halt):将卡置于暂停工作状态;

存储器组织

在这里插入图片描述下面是识别卡过程的主函数

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "led.h" 
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"	   
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
#include "dma.h"
#include "24cxx.h"
#include "flash.h" 		 
#include "RC522.h"
#include "spi2.h"
#include <string.h>
unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char data[16] = {0};
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char bull[16] = {0x01,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x01,0x02,0xFD,0x02,0xFD};
unsigned char value[4] = {0X00,0x00,0x00,0x0A};
int main(void)
{		unsigned char ucArray_ID [ 4 ];   /*先后存放IC卡的类型和UID(IC卡序列号)*/ unsigned char ucStatusReturn = MI_ERR;     /*返回状态 */ 	char cStr [ 30 ];	   int i = 0;unsigned char addr = 2;Stm32_Clock_Init(9);//系统时钟设置delay_init(72);		//延时初始化uart_init(72,9600); //串口1初始化   LED_Init();	   		//LED初始化RCC52_init ();//PB12--NSS PB13--SCK  PB14--MISO  PB15--MOSISPI2_Init()	 ;
//	SPIx_SetSpeed(256);if( MI_OK == PcdReset()){printf("RESET OK\n");}else{printf("reset failed\n");while(1);}PcdConfigISOType();PcdAntennaOff();delay_ms(10);PcdAntennaOn();while(1){ucStatusReturn = PcdRequest(PICC_REQALL,ucArray_ID );if(MI_OK !=  ucStatusReturn){	//	 printf("yanzheng fial\n");PcdAntennaOff();delay_ms(10);PcdAntennaOn();continue;	}if(ucStatusReturn == MI_OK){/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/if ( PcdAnticoll ( ucArray_ID ) == MI_OK )                                                                   {sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X",ucArray_ID [ 0 ],ucArray_ID [ 1 ],ucArray_ID [ 2 ],ucArray_ID [ 3 ] );printf ( "%s\r\n",cStr ); 			}		}ucStatusReturn = PcdSelect(ucArray_ID);if(ucStatusReturn != MI_OK)continue;
#if 0		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, ucArray_ID);//验证卡片密码if(ucStatusReturn != MI_OK)continue;ucStatusReturn = PcdRead(1,data);if(ucStatusReturn == MI_OK){for(i = 0; i < 16; i++){printf("0x%x ",data[i]);}}printf("\n");ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, ucArray_ID);//验证卡片密码if(ucStatusReturn != MI_OK)continue;data[14] = 0x11;data[15] = 0x13;ucStatusReturn = PcdWrite(1,data);if(ucStatusReturn == MI_OK){for(i = 0; i < 16; i++){printf("0x%x ",data[i]);}}printf("\n");
#else//初始化钱包ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 2, DefaultKey, ucArray_ID);//验证卡片密码if(ucStatusReturn != MI_OK)continue;ucStatusReturn = PcdWrite(2,bull);if(ucStatusReturn != MI_OK)continue;//查询钱包ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 2, DefaultKey, ucArray_ID);//验证卡片密码if(ucStatusReturn != MI_OK)continue;ucStatusReturn = PcdRead(2,bull);if(ucStatusReturn == MI_OK){for(i = 0; i < 16; i++){printf("0x%x ",bull[i]);}}printf("\n");//扣值ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, addr, DefaultKey, ucArray_ID);//验证卡片密码if(ucStatusReturn != MI_OK)continue;ucStatusReturn =  PcdValue(PICC_INCREMENT,addr,value)	   ;if(ucStatusReturn != MI_OK){printf("decre fial\n");continue;}ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 2, DefaultKey, ucArray_ID);//验证卡片密码if(ucStatusReturn != MI_OK)continue;//显示余额ucStatusReturn = PcdRead(2,bull);if(ucStatusReturn == MI_OK){for(i = 0; i < 16; i++){printf("0x%x ",bull[i]);}}printf("\n");
#endifdelay_ms(1000);}
}

大概过程就是这样。其中,充值,减值的电子钱包功能测试没有通过,没时间研究了,毕竟跟工作关系不大。相关代码已经上传了。
参考:
https://blog.csdn.net/liujianhua1989/article/details/72639307
https://blog.csdn.net/a827415225/article/details/51898897
https://blog.csdn.net/txf1984/article/details/46560261


http://chatgpt.dhexx.cn/article/qLdbrHHf.shtml

相关文章

RC522 - NFC刷卡模块

RC522 - NFC刷卡模块 芯片介绍/引脚介绍 MF RC522 是应用于 13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是 NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片&#xff0c;是智能仪表和便携式手持设备研发的较好选择。 非接触式…

STM32--RFID无线射频技术(RC522刷卡模块)

文章目录 1、RFID的概念2、RFID的工作原理&#xff08;1&#xff09;RFID中间件的概念&#xff08;2&#xff09;RFID中间件具有以下特点:&#xff08;3&#xff09;RFID中间件的意义: 3、RFID频率划分&#xff08;1&#xff09;RFID低频特性&#xff08;2&#xff09;RFID高频…

STM32——NFC门禁模块(RC522)

文章目录 1. 前言&#xff08;包括一些个人理解&#xff09;2. RC522门禁工作过程3. CubeMx配置3.1 SPI通讯的配置3.2 SDA和REST引脚的配置 4. 外设代码函数编写4.1 主函数能调用的接口函数4.2 二级内部调用函数4.3 第三级最底层函数4.4 头文件 5. 使用教程 1. 前言&#xff08…

RC522(RFID)读写驱动

文章目录 1、RC522驱动原理2、手机APP查看卡信息3、驱动移植4、读写卡5、源码 1、RC522驱动原理 我们常见的RC522大概如下所示&#xff0c;PCB部分是主机&#xff0c;然后白色的和绿色的都是IC卡&#xff0c;IC卡可以存储信息&#xff0c;通过靠近PCB主机部分就可以被感应到从…

RC522模块学习

目录 1.原理简介 2.SPI通信 3.获取卡号实验 3.驱动函数 参考&#xff1a; https://www.cnblogs.com/ivantang/p/3904025.html https://xiaolong.blog.csdn.net/article/details/117075834?spm1001.2014.3001.5506 https://blog.csdn.net/weixin_47316662/article/detai…

Jmeter下载安装配置---测试小白

一&#xff0c;进入官网&#xff1a;http://jmeter.apache.org/ 1.第一步进入官网如下图 2.选择进行下载&#xff0c;下载下来为一个压缩包&#xff0c;解压即可。 3.我下载的是jmeter4.0版本&#xff0c;对应jdk1.8。然后就进行解压。个人认为要注意3点&#xff1a;1.解压之后…

Windows版JMeter下载安装

进入apache官网https://www.apache.org/dist/jmeter/binaries下载Windows版本JMeter&#xff1b;配置环境变量&#xff08;JMETER_HOMED:\JMeter\apache-jmeter-5.1.1&#xff09;配置环境变量&#xff08;classpath%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%…

JMeter下载安装

一、环境准备 1.Jmeter是纯Java开发的&#xff0c; 能够运行Java程序的系统一般都可以运行Jmeter&#xff0c; 如&#xff1a;Windows、 Linux、 mac等。由于是由Java开发&#xff0c;所以自然需要jdk环境。 2.去官方下载JMeter安装包&#xff1a;Apache JMeter - Download Apa…

Mac版本Jmeter下载安装教程

Mac版本Jmeter下载安装教程 1. 下载&安装&启动Jmeter1.1 下载安装包&#xff1a;1.2 解压安装包1.3 启动Jmeter1.4 Jmeter页面 2. Jmeter进一步优化配置2.1 打开&编辑&保存配置文件~/.bash_profile步骤一&#xff1a;打开配置文件~/.bash_profile步骤二&#x…

JMeter-文件下载教程

一、单个下载配置方法 1、先添加线程组 选中测试计划右键添加线程组&#xff1a;测试计划->添加->线程(用户)->线程组 2、添加HTTP请求 ①. 选中线程组右键添加HTTP请求&#xff1a;线程组->添加->取样器->HTTP请求 ②.配置HPPT请求 3、添加BeanShell 取…

jmeter下载与安装教程

jmeter下载与安装教程 下载步骤&#xff1a; 自行百度jmeter下载&#xff0c;找到apache官网&#xff1b;进入网站后&#xff0c;选择左侧Download下的Download Releases&#xff1b;如图所示 2.页面进入新的页面后&#xff0c;点击此页面Binaries标签下的“apache-jmeter-5…

Jmeter下载及安装教程

下载及环境配置 下载 前置条件&#xff0c;电脑得配置Java环境&#xff0c;也就是安装jdk&#xff0c;可百度jdk安装教程。 1、下载地址&#xff1a;Apache JMeter - Download Apache JMeter&#xff0c;&#xff08;Windows版本下载.zip&#xff0c;Linux版本下载.tgz&…

Jmeter下载安装详细步骤(2021)

Jmeter下载安装详细步骤&#xff08;2021&#xff09; 由于项目方有压测需求&#xff0c;因此需要学习Jmeter压测工具的使用&#xff0c;避免遗忘&#xff0c;记录一下Jmeter下载安装的步骤 这里面有个坑就是Jmeter需要依赖JAVA环境&#xff0c;在安装Jmeter之前需要配置好JA…

测试工具:jmeter的下载以及使用

测试不仅要了解项目整体流程&#xff0c;还需要会使用各种测试工具&#xff0c;比如&#xff1a;jmeter压力测试工具。 1.下载地址 https://jmeter.apache.org/download_jmeter.cgi2.下载完直接解压&#xff0c;配置环境 &#xff08;1&#xff09;此电脑-右键属性-高级系统设…

Jmeter安装配置详细教程

目录 1、Jmeter下载1.1、下载地址1.2、选择对应版本 2、JDK安装2.1、java环境检查2.2、JDK安装2.2.1、JDK下载2.2.2、JDK安装2.2.3、JDK环境变量配置2.2.4、验证java环境 3、Jmeter环境部署3.1、环境配置 4、验证jmeter5、修改语言5.1、临时性设置5.2、永久性生效 1、Jmeter下载…

Jmeter常用插件下载

一、jmeter Manager jmeter插件下载地址&#xff1a;https://jmeter-plugins.org/wiki/Start/ 二、PerfMon Metrics Collector&#xff1a;服务器性能监控数据采集器 在性能测试过程中&#xff0c;除了监控TPS和TRT&#xff0c;还需要监控服务器的资源使用情况&#xff0c;比…

【Jmeter】Win10 下载安装Jmeter 5.5

1、Jmeter下载 地址&#xff1a; https://jmeter.apache.org/前提&#xff1a;使用jmeter工具之前需要安装java.并配置好java的环境变量。 注意&#xff1a;jdk版本和jmeter版本匹配问题 2、JAVA8 下载 进入官网&#xff0c;https://www.oracle.com/&#xff0c;点击Resour…

jmeter常用插件下载及安装

jmeter常用插件 一、下载及安装 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ 下载后文件为一个jar包&#xff0c;将其放入jmeter安装目录下的lib/ext目录&#xff0c;然后重启jmeter&#xff0c;即可。 启动jemter&#xff0c;点击选项&#xff0c;最下面…

jmeter的配置与下载详细教程

目录 1、Jmeter下载 1.1、下载地址 1.2、选择对应版本 2、JDK安装 2.1、java环境检查 2.2、JDK安装 2.2.1、JDK下载 2.2.2、JDK安装 2.2.3、JDK环境变量配置 2.2.4、验证java环境 3、Jmeter环境部署 …

Jmeter的下载与安装

Jmeter的下载与安装 Jmeter工具可以用来做接口和性能测试&#xff0c;在使用之前让我们先来学习一下Jmeter是怎样下载和安装的吧&#xff01; 安装Jmter之前的准备工作&#xff1a; 1:下载jdk&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/index.h…