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,一经查实,立即删除!

相关文章

机器学习——最优化模型

最优化模型的概述&#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公司开发。它可以安…

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

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

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…

【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、数据库统计信息介绍 优化器是数据库…

【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堆容易产生内存碎…

拦截器未生效的问题

记录一下自己出现的一个问题 配置好拦截器后 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;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

WPF+Prism 模块化编程(一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 WPFPrism 模块化编程&#xff08;一&#xff09; 一、Prism项目创建安装二、将项目升级为Prism项目三、将Prism项目升级为支持模块化编程项目 一、Prism项目创建安装 1、新建…

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

蓝桥集训之游戏

蓝桥集训之游戏 核心思想&#xff1a;博弈论 区间dp 设玩家1的最优解为A 玩家2的最优解为B 1的目标就是使A-B最大 2的目标就是使B-A最大 当玩家1取L左端点时 右边子区间结果就是玩家2的最优解B-A 即当前结果为w[L] – (B-A) 当玩家1取R右端点时 左边子区间结果就是玩家2的最…

Mybatis-特殊SQL的执行

1. 模糊查询 在MyBatis中进行模糊查询时&#xff0c;有以下三种常见的实现方式&#xff1a; 1.1. 错误示范 先来个准备操作&#xff0c;并做一个错误示例 根据姓名&#xff0c;模糊查询用户&#xff0c;(x小x) 更新数据表 SQLMapper.java package com.sakurapaid.mybatis3…

Win10 搭建FTP存储服务器站点【超详细教程】

目录 第一步&#xff1a;打开控制面板>程序 第二步&#xff1a;win10左下角搜索IIS并打开 第三步&#xff1a;右键网站&#xff0c;选择添加FTP站点 第四步&#xff1a;添加FTP站点名称 第五步&#xff1a;添加IP地址和端口 第六步&#xff1a;身份验证与授权信息 第…

浅谈Spring体系的理解

浅谈Spring知识体系 Spring Framework架构图Spring家族技术生态全景图XMind汇总 本文不涉及细节&#xff0c;主要回答两个问题&#xff1a; Spring家族技术生态全景图有哪些Spring Framework架构下每个模块有哪些东西&#xff0c;以及部分模块之间的关联关系 Spring Framework架…

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…

华为OD机试 - 芯片资源限制(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

【数据分享】1981-2023年全国各城市逐日、逐月、逐年最高气温(shp格式)

气象数据是我们在各种研究中都会使用到的基础数据&#xff0c;之前我们分享了Excel格式的1981-2023年全国各城市的逐日、逐月、逐年最高气温数据。 好多小伙伴拿到数据后问我们有没有GIS矢量格式的该数据&#xff0c;我们专门对数据进行了处理&#xff0c;转换为了GIS矢量格式…