射频RC522一些知识「建议收藏」

射频RC522一些知识「建议收藏」我的测试为RC522的读写模块和S50的射频卡:一.S50的射频卡有如下特点:1. 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位2. 每个扇区有独立的一组密码及访问控制3. 每张卡有唯一序列号,为32位 二.射频卡的介绍1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我的测试为RC522的读写模块和S50的射频卡:

一.S50的射频卡有如下特点:

1.  分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位

2.  每个扇区有独立的一组密码及访问控制

3.  每张卡有唯一序列号,为32位

 

二.射频卡的介绍

1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:

 

 

 

 

 

 

 

块0

    

数据块

0

扇区0 

块1

 

数据块

1

 

块2

 

数据块

2

 

块3

密码A   存取控制   密码B

控制块

3

 

块0

 

数据块

4

扇区1

块1

 

数据块

5

 

块2

 

数据块

6

 

块3

密码A   存取控制   密码B

控制块

7

 

 

 

            ∶

      ∶

      ∶

 

 

 

 

  0

 

数据块

60

扇区15 

  1

 

数据块

61

 

  2

 

数据块

62

 

  3

密码A    存取控制   密码B

控制块

63

 

2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。

3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。

   数据块可作两种应用:

★ 用作一般的数据保存,可以进行操作。

★ 用作数据值,可以进行初始化值、加值、减值、读值操作。

4、每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:

A0 A1 A2 A3 A4 A5   FF 07 80 69     B0 B1 B2 B3 B4 B5

 

   密码A(6字节)  存取控制(4字节) 密码B(6字节) 

 

5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:

   

          块0:   C10  C20  C30

          块1:   C11  C21  C31

          块2:   C12  C22  C32

          块3:  C13  C23   C33

 

  三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如 

  进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制

  位在存取控制字节中的位置如下:

          bit  7           6         5             4         3          2         1          0

字节6

C23_b

C22_b

C21_b

C20_b1

C13_b

C12_b

C11_b

C10_b1

字节7

C13

C12

C11

C10 0

C33_b

C32_b

C31_b

C30_b1

字节8

C33

C32

C31

C30 0

C23

C22

C21

C20 0

字节9

 

 

 

 

 

 

 

 

                    ( 注: cn.x表示块x的第n个值,_b表示取反 )

    6、数据块(块0、块1、块2)的存取控制如下:

 

  控制位(X=0..2)

 

         访 问 条 件 (对数据块 0、1、2)

C1X

C2X

C3X

 Read

 Write

Increment

Decrement, transfer,

Restore

0

0

0

KeyA|B

KeyA|B

KeyA|B

KeyA|B

0

1

0

KeyA|B

Never

Never

Never

1

0

0

KeyA|B

KeyB

Never

Never

1

1

0

KeyA|B

KeyB

KeyB

KeyA|B

0

0

1

KeyA|B

Never

Never

KeyA|B

0

1

1

KeyB

KeyB

Never

Never

1

0

1

KeyB

Never

Never

Never

1

1

1

Never

Never

Never

Never

     (KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)

 

  例如:当块0的存取控制位C10C20C30=1 0 0时,验证密码A或密码B正确后可读;

        验证密码B正确后可写;不能进行加值、减值操作。

 

    7、控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

 

 

 

 

密码A

存取控制

密码B

C13

C23

C33

Read

Write

Read

Write

Read

Write

0

0

0

Never

KeyA|B

KeyA|B

Never

KeyA|B

KeyA|B

0

1

0

Never

Never

KeyA|B

Never

KeyA|B

Never

1

0

0

Never

KeyB

KeyA|B

Never

Never

KeyB

1

1

0

Never

Never

KeyA|B

Never

Never

Never

0

0

1

Never

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

0

1

1

Never

KeyB

KeyA|B

KeyB

Never

KeyB

1

0

1

Never

Never

KeyA|B

KeyB

Never

Never

1

1

1

Never

Never

KeyA|B

Never

Never

Never

   例如:当块3的存取控制位C13 C23C33=1 0 0时,表示:

           密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。

         存取控制:验证KEYA或KEYB正确后,可读、可写。

           密码B:验证KEYA或KEYB正确后,可读、可写。

 

三.程序访问

在程序中我们首先要获得卡序列号:

status = MFRC522_Anticoll(str);

str里的数据就是卡序列号,status的值可以判断得到结果是否成功;

每次进行读写时都需要进行验证,这里以读写第一扇区的第1块为例:

status = MFRC522_Auth(PICC_AUTHENT1A, 4, sectorKeyA[1], serNum);

这里的块4为扇区11的第1块,sectorKeyA[1]为6个0xFF,是因为卡的密码A初始密码就是6个oxFF,serNum为卡序列号。

 

 uchar sectorKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                           };

 

uchar MFRC522_Auth(uchar authMode, uchar BlockAddr, uchar *Sectorkey,uchar *serNum)

函 数 名:MFRC522_Auth
 * 功能描述:验证卡片密码
 * 输入参数:authMode–密码验证模式
                0x60 = 验证A密钥
                0x61 = 验证B密钥
            BlockAddr–块地址
            Sectorkey–扇区密码
            serNum–卡片序列号,4字节

当验证成功后,会返回相应的值给status;

验证成功后就可以写数据了:

 status = MFRC522_Write(4, writeDate);

 

当要进行读操作时,仍然还需要进行验证:

status = MFRC522_Auth(PICC_AUTHENT1A, 4, sectorKeyA[1], serNum);

验证成功后就可以读数据了:

 status = MFRC522_Read(4, str);

 

以上就是读写操作,新手!多多指教…….

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159332.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是递归函数?[通俗易懂]

    什么是递归函数?[通俗易懂]递归函数递归例题特点效率优点递归函数递归递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。所以递归要有两个要素,结束条件与递推关系注:递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当…

    2025年10月29日
    5
  • 单片机c语言毕业设计,单片机毕业设计的总结.docx

    单片机c语言毕业设计,单片机毕业设计的总结.docx单片机毕业设计的总结单片机毕业设计总结篇一:单片机课程设计总结报告参考模板  湖州师范学院求真学院  课程设计总结报告  课程名称单片机应用系统设计  设计题目基于STC89C51的数字电子钟设计  专业电子科学与技术  班级  姓名张静  学号12  指导教师李祖欣吴小红  报告成绩  求真学院信息与工程系  二〇一一年六月一日  《单片机应用…

    2022年10月3日
    0
  • 数据仓库ods层_设计结果概要

    数据仓库ods层_设计结果概要ODS层辨析ODS全称是OperationalDataStore,即操作数据存储。InmonVSKimballBill.Inmon的定义:ODS是一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。常常被作为数据仓库的过渡,也是数据仓库项目的可选项之一。而Kimball的定义:操作型系统的集成,用于当前、历史以及其它细节查询(业务系统的一部分);为决策支持提供当前细节数据(数据仓库的一部分)。ODSVSDBVSED

    2022年10月6日
    2
  • 全网最热Vue入门教程你不看就吃亏了哦[通俗易懂]

      因为最近需要使用到Vue,所以打算将Vue的学习资料详细整理一份,感兴趣的小伙伴可以一起来哦。一、Vue基础介绍1.什么是Vue.jsVue.js是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App,Vue语法也是可以用于进行手机App开发的,需要借助于Weex)Vue.js是前端的主流框架之一,和Angular.js、Rea…

    2022年4月17日
    92
  • getParameterValues使用

    getParameterValues使用request.getParameterValues:接收名字相同,值有多个的变量,返回一个数据。如: String[]courseNumbers=request.getParameterValues(“courseNumberForCourse”);request.getParameter:接收单一值变量。如:stringtype=request.getPara

    2022年7月22日
    18
  • Oracle 视图索引

    Oracle 视图索引第五章视图索引的操作5.1视图的功能一个视图实际上就是封装了一条复杂的查询语句注:为了在当前用户模式中创建视图,要求数据库用户必须有createanyview(创建任何视图)的权限。5.2创建视图的语法create[orreplace]view视图名称as查询语句例:建立一个视图,包含全部部门编号为20的部门的雇员信息(雇员编号,姓名,工作,部门编号)createview…

    2022年7月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号