NFC RC522开发记录

文章目录

      • 一、ID卡、IC卡(M1卡、CPU卡)的区别
      • 二、RC522读写操作
        • 1. 数据读写流程
      • 三、RC522驱动代码
        • 1. RC522 与 STM32 的接线图
        • 2. RC522.c
        • 3. RC522.h
        • 4. main.c

一、ID卡、IC卡(M1卡、CPU卡)的区别

在这里插入图片描述

  • ID卡 :只存储了ID号,设备识别ID号,没有算法可言,容易复制,安全性低

IC卡包含了M1卡CPU卡

  • M1卡:存储了ID号,可读写数据,M1卡发一个数据到设备,设备再传一个数据给M1卡确认,再进行交易或身份认证,只有一个算法,可在空中盗-取信息,反复计算,算出其中算法,在复制卡,安全性比ID卡高很多,但还是能被破解
  • CPU卡:有操作系统,可存储数据,也有自己的ID号,CPU卡发一串数据给设备,设备与SAM卡进行运算,设备再发一串数据回CPU卡确认,然后进行交易或身份认证;跟M1卡的区别在于一个算法在空中,一个算法在设备里面;无论是卡商,设备商,运营商,都不知道其中的算法,所以这个系统的安全性会高很多

M1卡介绍 :

M1 卡分为 16 个扇区,每个扇区由 4 块(块 0、块 1、块 2、块 3)组成,(我们也将 16 个扇区的 64 个块按绝对地址编号为 0~63,存贮结构(其它扇区依此类推)如下图所示:
在这里插入图片描述

每个扇区的块 0、块 1、块 2 为数据块,可用于存贮数据。数据块可作两种应用:
1、用作一般的数据保存,可以进行读、写操作。
2、用作数据值,可以进行初始化值、加值、减值、读值操作

每个扇区的块 3 为控制块,包括了密码 A、存取控制、密码 B。具体结构如下:
在这里插入图片描述

二、RC522读写操作

1. 数据读写流程

在这里插入图片描述

三、RC522驱动代码

1. RC522 与 STM32 的接线图

硬件平台:正点原子精英开发板 – STM32F103ZET6

*1--SDA <----->PA4--片选脚
*2--SCK <----->PA5--时钟线
*3--MOSI<----->PA7--输出
*4--MISO<----->PA6--输入
*5--悬空
*6--GND <----->GND
*7--RST <----->PA11--复位脚
*8--VCC <----->VCC
2. RC522.c
#include "rc522.h"
#include "string.h"
#include "./SYSTEM/usart/usart.h"#include "RC522.h"
#include "string.h"/*
函数功能:移植接口--SPI时序读写一个字节
函数参数:data:要写入的数据
返 回 值:读到的数据
*/
uint8_t  RC522_SPI_ReadWriteOneByte(uint8_t  tx_data)
{			  	 uint8_t  rx_data=0;				 uint8_t  i;for(i=0;i<8;i++){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0);;  if(tx_data&0x80){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, 1);}else {HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, 0);}tx_data<<=1;	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1);;rx_data<<=1;if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6))rx_data|=0x01;}//检测spi是否接通
//	if(rx_data != 0) {
//		printf("rx_data != 0\r\n");
//	} else {
//		printf("rx_data = 0\r\n");
//	}return rx_data; 
}/*
函数功能:初始化RC522的IO口	 
*1--SDA <----->PA4--片选脚
*2--SCK <----->PA5--时钟线
*3--MOSI<----->PA7--输出
*4--MISO<----->PA6--输入
*5--悬空
*6--GND <----->GND
*7--RST <----->PA11--复位脚
*8--VCC <----->VCC
*/
void RC522_IO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOF_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_11, GPIO_PIN_SET);/*Configure GPIO pins : PA4 PA5 PA7 PA11 */GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pin : PA6 */GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);}	/*
功能描述:选卡读取卡存储器容量
输入参数:serNum 传入卡序列号
返 回 值:成功返回卡容量
*/
uint8_t  RC522_MFRC522_SelectTag(uint8_t  *serNum) //读取卡存储器容量
{     uint8_t  i;     uint8_t  status;     uint8_t  size;     uint8_t  recvBits;     uint8_t  buffer[9];buffer[0]=PICC_ANTICOLL1;	  //防撞码1     buffer[1]=0x70;buffer[6]=0x00;						     for(i=0;i<4;i++)					{buffer[i+2]=*(serNum+i);	//buffer[2]-buffer[5]为卡序列号buffer[6]^=*(serNum+i);	  //卡校验码}RC522_CalulateCRC(buffer,7,&buffer[7]);	//buffer[7]-buffer[8]为RCR校验码RC522_ClearBitMask(Status2Reg,0x08);status=RC522_PcdComMF522(PCD_TRANSCEIVE,buffer,9,buffer,&recvBits);if((status==MI_OK)&&(recvBits==0x18))    size=buffer[0];     else    size=0;return size; 
}/*
延时函数,纳秒级
*/
void RC522_Delay(uint32_t  ns)
{uint32_t  i;for(i=0;i<ns;i++){__nop();__nop();__nop();}
}/*
函数功能:RC522芯片初始化
*/
void RC522_Init(void)
{RC522_IO_Init();	//RC522初始化RC522_PcdReset();  			//复位RC522 RC522_PcdAntennaOff();	//关闭天线DelayMs(2);  		  //延时2毫秒RC522_PcdAntennaOn();		//开启天线M500PcdConfigISOType('A'); //设置RC632的工作方式
}/*
函数功能:复位RC522
*/
void RC522_Reset(void)
{RC522_PcdReset();				//复位RC522RC522_PcdAntennaOff();	//关闭天线DelayMs(2);  		  //延时2毫秒RC522_PcdAntennaOn();		//开启天线  	
}     /*
功    能: 寻卡
参数说明: 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
*/
char RC522_PcdRequest(uint8_t  req_code,uint8_t  *pTagType)
{char status;  uint8_t  unLen;uint8_t  ucComMF522Buf[MAXRLEN];  	   // MAXRLEN  18RC522_ClearBitMask(Status2Reg,0x08);	//清RC522寄存器位,/接收数据命令RC522_WriteRawRC(BitFramingReg,0x07); //写RC632寄存器RC522_SetBitMask(TxControlReg,0x03);  //置RC522寄存器位ucComMF522Buf[0]=req_code; 	    //寻卡方式status=RC522_PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); //通过RC522和ISO14443卡通讯if((status==MI_OK)&&(unLen==0x10)){    *pTagType=ucComMF522Buf[0];*(pTagType+1)=ucComMF522Buf[1];}else{status = MI_ERR;}  return status;
}/*
功    能: 防冲撞
参数说明: pSnr[OUT]:卡片序列号,4字节
返    回: 成功返回MI_OK
*/
char RC522_PcdAnticoll(uint8_t  *pSnr)
{char status;uint8_t  i,snr_check=0;uint8_t  unLen;uint8_t  ucComMF522Buf[MAXRLEN]; RC522_ClearBitMask(Status2Reg,0x08);  //清RC522寄存器位 RC522_WriteRawRC(BitFramingReg,0x00); //写RC522_ClearBitMask(CollReg,0x80);     //清ucComMF522Buf[0]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ALPHA开发板上PHY网络芯片LAN8720:常用的几个寄存器功能

一. 简介 正点原子的开发板 ALPHA开发板&#xff0c;有线网络硬件方案所使用的也是最常用的一种方案&#xff0c;IMX6ULL芯片内部是自带 MAC网络芯片的&#xff0c;所以&#xff0c;也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 前面一篇文章简单了解了…

Asp.net Core 中一键注入接口

Asp.net Core 中一键注入接口 前言准备开始使用 前言 在之前开发Asp.Net Core程序时遇到接口需要一个一个的注入到Services中,当有非常多的接口需要注入时会显得代码成为了一座山,这里记录一下如何通过接口的命名一键自动注入. 准备 IDE: Visual studio 2022 .Net版本:.Net …

机器学习——最优化模型

最优化模型的概述&#xff1a; 从某种程度上说&#xff0c;我们的世界是由最优化问题组成的。每一天&#xff0c;我们的生活都面临无数的最优化问题&#xff1a;上班怎么选择乘车路线&#xff0c;才能舒服又快速地到达公司&#xff1b;旅游如何选择航班和宾馆&#xff0c;既省…

不可变集合及Stream流

若希望某个数据是不可修改的&#xff0c;就可以考虑使用不可变集合&#xff0c;以提高安全性&#xff1b;&#xff08;JKD9之后才有&#xff09; List不可变集合&#xff1a; public static void main(String[] args) {/*创建不可变的List集合"张三", "李四&q…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件&#xff1a;安装 conda配置环境变量验证 Conda 安装结果创建环境&#xff1a;python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统&#xff0c;由Continuum Analytics公司开发。它可以安…

python之@overload

from typing import overloadoverload def repeat(s: str, count: int) -> str:...overload def repeat(s: bytes, count: int) -> bytes:...这段代码是在定义一个名为repeat的函数&#xff0c;其中使用了Python的类型注解和装饰器overload来进行重载&#xff08;Overloa…

批量爬取招聘网站【Boss直聘】上工作岗位的招聘信息

不管是学生还是工作的小伙伴&#xff0c;估计都对不同岗位工作几年的薪酬水平比较感兴趣。本文提供爬取招聘网站&#xff0c;获取某类工作招聘信息的实现逻辑和代码。具体的实施步骤是&#xff1a;明确爬取的招聘网站—确定爬取的工作城市—确定爬取的岗位—获取岗位的招聘子链…

学习Python渗透第14天:用python实现sql注入

sql注入这个漏洞一直位于owasp列出的漏洞排行榜的前几位&#xff0c;虽然这个漏洞的使用难度很低&#xff0c;但是破坏力却极其的大。sql注入的原理是将原本的sql语句与用户可控的参数进行了拼接&#xff0c;形成了非预期的sql语句的执行&#xff0c;从而可能造成信息泄露或者如…

Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境&#xff1a; 宿主机为win11&#xff0c;网络&#xff1a;10.255.50.5 6389 WSL2 ubuntu 目标机的OS&#xff1a;Ubuntu 内核、版本如下&#xff1a; linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…

【Blockchain】区块 | 节点 | 共识机制 | 公链 | 联盟链 | 以太坊 | DApp | 智能合约

Blockchain 初识区块链区块链是什么什么是区块什么是节点什么是分布式什么是共识机制工作量证明(Proof of Work, PoW)权益证明(Proof of Stake, PoS)历史证明(Proof of History, PoH)权威证明(Proof of Authority, PoA)信誉共识(Proof of Reputation, PoR)存储证明(Proof of St…

【3DsMax+Pt】练习案例

目录 一、在3DsMax中展UV 二、在Substance 3D Painter中绘制贴图 一、在3DsMax中展UV 1. 首先创建如下模型 2. 选中如下三条边线作为接缝 重置剥 发现如下部分还没有展开 再选一条边作为接缝 再次拨开 拨开后的UV如下 二、在Substance 3D Painter中绘制贴图 1. 新建项目&am…

C++AVL树拓展之红黑树原理及源码模拟

前言&#xff1a;我们之前已经从零开始掌握AVL树http://t.csdnimg.cn/LaVCChttp://t.csdnimg.cn/LaVCC 现在我们将继续学习红黑树的原理并且实现插入等功能&#xff0c;学习本章的前提要求是掌握排序二叉树和AVL树&#xff0c;本章不再提及一些基础知识&#xff0c;防止本文结…

国产数据库中统计信息自动更新机制

数据库中统计信息描述的数据库中表和索引的大小数以及数据分布状况&#xff0c;统计信息的准确性对优化器选择执行计划时具有重要的参考意义。本文简要整理了下传统数据库和国产数据库中统计信息的自动更新机制&#xff0c;以加深了解。 1、数据库统计信息介绍 优化器是数据库…

纯小白蓝桥杯备赛笔记--DAY5(竞赛常用库函数)

文章目录 大小写转换islower和isupper&#xff1a;检查一个字符是否是小写或者大写。Tolower和toupper函数&#xff1a;ASCII码&#xff1a; 二分查找二分查找的前提&#xff1a;库函数只能对数组进行二分查找&#xff0c;且数组中的元素是单调的。binary_search函数&#xff1…

【C++第五课-C/C++内存管理】C/C++的内存分布、new/delete、new和delete的实现原理

目录 C/C的内存分布new/deletenew内置类型使用new自定义类型使用newnew失败 delete内置类型使用delete自定义类型使用delete new和delete的实现原理new[] 和delete[]的补充知识 定位new&#xff08;了解&#xff09;常见面试题 C/C的内存分布 频繁的new/delete堆容易产生内存碎…

【数据处理包Pandas】DataFrame数据的基本操作

目录 一、DataFrame数据的查询&#xff08;一&#xff09;查询单行数据&#xff08;二&#xff09;查询多行数据&#xff08;三&#xff09;查询列数据&#xff08;四&#xff09;查询指定的行列数据 二、DataFrame数据的编辑&#xff08;一&#xff09;增加数据&#xff08;二…

拦截器未生效的问题

记录一下自己出现的一个问题 配置好拦截器后 protected void addInterceptors(InterceptorRegistry registry) {log.info("开始注册自定义拦截器...");registry.addInterceptor(jwtTokenUserInterceptor).addPathPatterns("/**").excludePathPatterns(&q…

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

怎么开发高可靠、能处理多种复杂问题、处理各种异常情况的爬虫程序

开发高可靠、能处理多种复杂问题、处理各种异常情况的爬虫程序是一个综合性的任务&#xff0c;涉及多个方面的技术和策略。以下是一些关键步骤和最佳实践&#xff0c;可以帮助你实现这样的爬虫程序&#xff1a; 明确需求和目标&#xff1a; 在开始编写代码之前&#xff0c;明确…

图片转换成base64如何在html文件中使用呢

在HTML文件中使用Base64编码的图片非常简单。Base64编码是一种将二进制数据转换为ASCII字符串的方法,这使得可以直接在网页上嵌入图片数据,而无需引用外部图片文件。以下是如何在HTML中使用Base64编码的图片的步骤: 步骤 1: 将图片转换为Base64编码 首先,你需要将图片文件…