基于RC522和S50的RFID开发

1. ISO14443-A协议

ISO14443协议是Contactless card standards(非接触式IC卡标准)协议,由4个部分组成:

  • 物理特性:规定了接近式卡(PICC)的物理特性
  • 频谱功率和信号接口:规定了再接近式耦合设备(PCD)和接近式卡(PICC)之间提供功率和双向通信的场的性质与特征
  • 初始化和防冲突算法:描述了PICC进入PCD工作场的轮询;在PCD和PICC之间通信的初始阶段期间所使用的字节格式、帧和定时;初始REQ和ATQ命令内容;探测方法和与几个卡(防冲突)中的某一个通信的方法;初始化PICC和PCD之间的通信所需要的其他参数;容易和加速选择在应用准则基础上的几个卡中的一个(即最需要处理的一个)的任选方法
  • 通讯协议:规定了以无触点环境中的特殊需要为特色的半双工传输协议,并定义了协议的激活和停活序列

ISO14443术语与缩写

– 接近式卡 Proximity card(PICC)
– 接近式耦合设备 Proximity coupling device(PCD)
– 防冲突环 anticollision loop
– 比特冲突检测协议 bit collision detection protocol
– 冲突 collision
– 帧 frame
– REQA:请求命令,类型A(Request To Command, Type A)
– REQB:请求命令,类型B(Request To Command, Type B)
– ATQA:请求应答,类型A(Answer To Request, Type A)
– ATQB:请求应答,类型B(Answer To Request, Type B)
– NVB:有效位的数目(Number of Valid Bits)

1.1 物理特性

PICC应具有ISO/IEC 7810中为ID-1型卡规定的要求相应的一般物理特性。还应具有相应的紫外线、X-射线、动态弯曲应力、动态扭曲应力、交变磁场、交变电场、静电、静态磁场及工作温度等附加特性

1.2 频谱功率和信号接口

PICC的初始对话 PCD和PICC之间的初始对话通过下列连续操作:

– PCD的RF工作场激活PICC
– PICC静待来自PCD的命令
– PCD传输命令
– PICC传输响应

这些操作使用下列条款中规定的射频功率和信号接口:

– PCD应产生给予能量的RF场,为传送功率,该RF场与PICC进行耦合,为了通信,该RF场应被调制。
– RF工作场频率(fc)应为13.56MHz±7kHz

1.3 初始化和防冲突算法

当PICC暴露于未调制的工作场内,它能在5ms内接受一个请求。为了检测进入其激励场的PICC,PCD发送重复的请求命令并寻找ATQ,这个过程被称为轮询

  • REQA和WAKE-UP帧:请求和唤醒帧用来初始化通信并按以下次序组成

– 通信开始:7个数据位发送,LSB首先发送(标准REQA的数据内容是0x26,WAKE-UP请求的数据内容是0x52)
– 通信结束:不加奇偶校验位

  • 标准帧:标准帧用于数据交换并按以下次序组成

– 通信开始:n*(8个数据位+奇数奇偶校验位),n≥1。每个数据字节的LSB首先被发送。每个数据字节后面跟随一个奇数奇偶校验位。
– 通信结束

  • 面向比特的防冲突帧:仅在比特帧防冲突环期间使用,该帧是带有7个数据字节的标准帧,它被分离成两部分,第一部分用于从PCD到PICC的传输,第二部分用于从PICC到PCD的传输

  • PICC状态:下图提供了专门针对比特冲突检测协议的类型A的PICC状态描述

– POWER-OFF状态:在POWER-OFF状态中,由于缺少载波能量,PICC不能被激励并且应不发射副载波
– IDLE状态 :在该状态中,PICC被加电,并且能够解调和识别从PCD来的有效REQA和WAKE-UP命令
– READY状态:一旦收到有效REQA或WAKE-UP报文则立即进入该状态,用其UID选择了PICC时则退出该状态。在这种状态中,比特帧防冲突或其他任选的防冲突方法都可以使用。所有串联级别都在这一状态内处理以取得所有UID CLn
– ACTIVE状态:通过使用其完整UID选择PICC来进入该状态
– HALT状态:在该状态中,PICC应仅响应使PICC转换为READY状态的WAKE-UP命令
注: 处于HALT状态的PICC将不参与任何进一步的通信,除非使用了WAKE-UP命令

  • 命令集:PCD用来管理与几个PICC通信的命令如下示 ,这些命令使用上面描述的字节和帧格式

– REQA:由PCD发出,以探测用于类型A PICC的工作场(0x26)
– WAKE-UP:由PCD发出,使已经进入HALT状态的PICC回到READY状态(0x52)
– ANTICOLLISION:防碰撞(0x93)
– SELECT:选择
– HALT:结束(0x50)

1.4 通讯协议

ISO/IEC14443的这一部分规定了非接触的半双工的块传输协议并定义了激活和停止协议的步骤。这部分传输协议同时适用于A型卡和B型卡

基于14443-A的操作帧格式

– 请求卡 :0x26
– 唤醒所有卡 :0x52
– 防冲突 :0x93,0x20 得到卡ID
– 选择卡片 :0x93,0x70, ID1,ID2,ID3,ID4, checksum, CRC16

2. RC522阅读器

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

  • 支持 ISO 14443A/MIFARE,MFRC522 的内部发送器部分可驱动读写器天线与 ISO 14443A/MIFARE卡和应答机的通信,无需其它的电路
  • 可实现各种不同主机接口的功能:SPI 接口、串行 UART(类似 RS232,电压电平取决于提供的管脚电压)、I2C 接口
  • 64 字节的发送和接收 FIFO 缓冲区
  • 灵活的中断模式
  • 可编程定时器
  • 内部振荡器,连接 27.12MHz 的晶体

RC522的内部框图以及外部功能框图如下所示:

2.1 RC522寄存器

RC522部分内部寄存器组介绍如下:

– CommandReg 启动和停止命令的执行
– ComIrqReg 包含中断请求标志
– ErrorReg 错误标志,指示执行的上个命令的错误状态
– Status2Reg 包含接收器和发送器的状态标志
– FIFODtataReg 64 字节 FIFO 缓冲区的输入和输出
– FIFOLevelReg 指示 FIFO 中存储的字节数
– ControlReg 不同的控制寄存器
– BitFramingReg 面向位的帧的调节
– CollReg RF 接口上检测到的第一个位冲突的位的位置
– ModeReg 定义发送和接收的常用模式
– TxModeReg 定义发送过程的数据传输速率
– TxControlReg 控制天线驱动器管脚 TX1 和 TX2 的逻辑特性
– TModeRegTPrescalerReg定义内部定时器的设置

2.2 RC522功能

主要介绍SPI数字接口以及FIFO缓冲区

  • SPI接口:在与主机微控制器通信时, MFRC522 用作从机

– 在 SPI 通信中 MFRC522 模块用作从机。 SPI 时钟 SCK 由主机产生。数据通过 MOSI线从主机传输到从机;数据通过 MISO 线从 MFRC522 发回到主机
– MOSI 和 MISO 传输每个字节时都是高位在前。MOSI 上的数据在时钟的上升沿保持不变,在时钟的下降沿改变。MISO 也与之类似,在时钟的下降沿,MISO 上的数据由 MFRC522来提供,在时钟的上升沿数据保持不变
– SPI地址,地址字节按下面的格式传输。第一个字节的 MSB 位设置使用的模式。 MSB 位为 1 时从 MFRC522 读出数据; MSB 位为 0 时将数据写入 MFRC522。 第一个字节的位 6-1 定义地址,最后一位应当设置为 0

  • FIFO缓冲区:FIFO缓冲区的输入和输出数据总线连接到 FIFODataReg 寄存器

– 通过写FIFODataReg寄存器来将一个字节的数据存入FIFO缓冲区,之后内部FIFO缓冲区写指针加 1
– 除了读写FIFO缓冲区外,FIFO缓冲区指针还可通过置位寄存器FIFOLevelReg的FlushBuffer位来复位。从而,FIFOLevel位被清零,寄存器ErrorReg的BufferOvfl位被清零,实际存储的字节不能再访问
– 已经存放在 FIFO 缓冲区中的字节数:寄存器FIFOLevelReg的FIFOLevel字段

2.3 RC522命令集

FIFO每个需要数据流(或数据字节流)作为输入的命令在发现FIFO缓冲区有数据时会立刻处理,但收发命令除外。收发命令的发送由寄存器BitFramingReg的StartSend位来启动;每个需要某一数量的参数的命令只有在它通过FIFO缓冲区接收到正确数量的参数时才能开始处理;FIFO缓冲区不能在命令启动时自动清除。而且,也有可能要先将命令参数和/或数据字节写入FIFO缓冲区,再启动命令;每个命令的执行都可能由微控制器向命令寄存器写入一个新的命令代码(如idle命令)来中断

– IDLE 命令:MFRC522 处于空闲模式。该命令也用来终止实际正在执行的命令
– CALCCRC 命令:FIFO 的内容被传输到 CRC 协处理器并执行 CRC 计算这个命令必须通过向命令寄存器写入任何一个命令(如空闲命令)来软件清除
– TRANSMIT 命令:发送 FIFO 的内容。在发送 FIFO 的内容之前必须对所有相关的寄存器进行设置。该命令在 FIFO 变成空后自动终止
– RECEIVE 命令:该命令在接收到的数据流结束时自动终止。
– TRANSCEIVE 命令:该循环命令重复发送 FIFO 的数据,并不断接收 RF 场的数据。第一个动作是发送,发送结束后命令变为接收数据流。
– MFAUTENT 命令:该命令用来处理 Mifare 认证以使能到任何 Mifare 普通卡的安全通信。在命令激活前以下数据必须被写入 FIFO: 认证命令码,块地址,秘钥,序列号。该命令在 Mifare 卡被认证且 Status2Reg 寄存器的 MFCrypto1On 位置位时自动终止。
– SOFTRESET 命令 :所有寄存器都设置成复位值。命令完成后自动终止

2.4 基于14443-A命令集
  • 寻卡 0x26 或者0x52
    寻卡的协议内容:一个寻卡命令就可以了,接着就可以发送
    返回:2byte卡类型(4,0)
  • 防冲突 0x93
    协议:防冲突命令 + 0x20
    返回:4byte卡ID,1byte校验(异或)(62 A8 2B B EA)
  • 选卡
    协议:命令字 + 0x70 + 4byte卡号 + 1byte校验 + 2byte CRC16校验
    返回:卡校验0x08

3. S50电子标签

M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,属于非接触式IC卡。非接触式IC卡又称射频卡,成功地解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。主要用于公交、轮渡、地铁的自动收费系统。M1卡,优点是可读可写的多功能卡,缺点是:价格稍贵,感应距离短

3.1 S50卡概述

工作原理:向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据

3.2 S50卡的结构与操作流程

S50由1KB的EEPROM、RF接口和数字式控制单元组成。能量和数据都通过天线传送,天线由几匝线圈组成并直接连到S50卡上,不需要其他外部元件

操作流程如下表所示:

3.3 S50卡存储器结构

1024*8位的EEPROM存储器被分成16个区,每个区中有4个段,每段有16字节。在擦除状态时,读EEPROM单元的值是逻辑“0”;在写状态时,读EEPROM单元的值是逻辑“1”

  • 厂商段:厂商段是存储器第一个区的第一个数据段(段 0),它包含了 IC 卡厂商的数据,基于保密性和系统的安全性,这一段在IC卡厂商编程之后被置为写保护
  • 数据段:所有的区都包含3个段(每段16字节)保存数据(区0只有两个数据段和一个只读的厂商段),数据段可以被以下的访问位(access bits)配置:

– 读/写段,用于譬如无线访问控制
– 值段,用于譬如电子钱包 它需要额外的命令 像直接控制保存值的增加和减少
在执行任何存储器操作前都要先执行确认命令

  • 值段:值段可以实现电子钱包的功能(有效的命令有:读、写、增、减、恢复、发送);值段有一个固定的数据格式,可以进行错误检测和纠正并备份管理;值段只能在值段格式的写操作时产生

– 值:表示一个带符号 4 字节值 这个值的最低一个字节保存在最低的地址中 取反的字节以标准2 的格式保存 为了保证数据的正确性和保密性 值被保存了 3 次 两次不取反保存 一次取反保存
– Adr:表示一个 1 字节地址 当执行强大的备份管理时用于保存存储段的地址 地址字节保存了 4次 取反和不取反各保存两次 在执行增 减 恢复 传送操作时 地址保持不变 它只能通过写命令改变

  • 区尾:每个区都有一个区尾,它包括:

– 密钥A和B(可选),读密钥时返回逻辑 0
– 访问这个区中4个段的条件(保存在第6字节 ~ 第9字节) 访问位(access bits)也可以指出数据段的类型(读/写或值)
如果不需要密钥 B,那么段3的最后6字节可以作为数据字节
用户数据可以使用区尾的第9字节,这个字节具有和字节6、7和8一样的访问权

3.4 S50卡控制字

每个数据段和区尾的访问条件由3个位来定义,它们以取反和不取反的形式保存在指定区的区尾。访问位控制了使用密钥A和B访问存储器的权力。当知道相关的密钥和当前的访问条件时,可以修改访问条件

– 每个字节的bit7控制block3,Bit6控制block2,Bit5控制block1
– Bit4控制block0,Bit3 ~ 0其实就是bit7 ~ 4取反的结果
– Block3出厂默认 ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff

  • 区尾的访问条件:区尾(段3)的访问位,密钥和访问位的读写访问可分为“从不”,“密钥A”,“密钥B”或“密钥A|B”(A或B),在片给区尾和密钥A传送访问条件被预定义为传送配置。由于密钥B可以在传输配置中被读出,新的卡要用密钥A确认

下表中用灰色标明的行是密钥B可被读的访问条件,此时密钥B可以存放数据

  • 数据段的访问条件:数据段(段0 ~ 2)的访问位,读/写访问可分为“从不”,“密钥A”,“密钥B”或“密钥A|B”(A或B),相关访问位的设置定义了应用以及相应的应用命令

3.5 读写卡
  • S50读卡命令:

– 请求 0x26
– 防冲突 0x93,0x70
– A认证 0x60,addr,keyA, ID
– 读0x30,addr CRC16

  • S50写卡命令:

– 请求 0x26
– 防冲突 0x93,0x70
– A认证 0x60,addr,keyA, ID
– 写0xA0,addr ,CRC16
– 16bytes,CRC16

4. 基于RC522和S50的FRID开发实例

本实例使用STM32F103开发板与RC522连接,通过串口将读取出的S50卡信息打印出来,通过按键控制将相关信息写入到S50卡

4.1 硬件连接

本实例使用到了蜂鸣器(PB5)、按键(PA0/PE2/PE3/PE4)和LED灯(PC0),RC522除了要接入3.3V供电和GND外,还需要接以下四根线:

/*引脚说明*/:
STM32 PB15(MISO) <--- RC522(MOSI)
STM32 PB14(MOSI) ---> RC522(MISO)
STM32 PB13(CLK)  ---> RC522(SCK)
STM32 PB12(CSS)  ---> RC522(SDA)

4.2 软件编程
  • 创建蜂鸣器(beep.c)和按键驱动文件(key.c)以及相关头文件
  • 创建RC522驱动文件RC522.c和RC522.h,下面给出头文件里的各函数声明,具体的函数实现,可在文末下载源码查看
unsigned char ReadRawRC(unsigned char addr);
void WriteRawRC(unsigned char addr,unsigned char val);
void ClearBitMask(unsigned char reg,unsigned char mask);
void SetBitMask(unsigned char reg,unsigned char mask);
void PcdAntennaOn(void);
void PcdAntennaOff(void);
char PcdReset(void);
char PcdComMF522(unsigned char Command,unsigned char *pInData,unsigned char InLenByte,unsigned char *pOutData,unsigned int  *pOutLenBit);
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData);
char PcdRequest(unsigned char req_code,unsigned char *pTagType);
char PcdAnticoll(unsigned char *pSnr);
char PcdSelect(unsigned char *pSnr);
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr);
char PcdRead(unsigned char addr,unsigned char *pData);
char PcdWrite(unsigned char addr,unsigned char *pData);
char PcdHalt(void);
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue);
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr);
void RFID_Read_Data(uint8_t id);
void RFID_Write_Data(uint8_t id);
  • 在main函数中添加读M1卡函数
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();printf("RFID RC522 test start!\r\n");while (1){RFID_Read_Data(0);HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);HAL_Delay(1000);}
}
4.3 下载验证

编译无误下载到开发板,打开串口调试助手后,调用RFID_Read_Data(0) 时,读取M1卡块0的数据,即厂商段,包含了M1卡的序列号即厂商数据;调用RFID_Read_Data(3) 时,读取M1卡块3的数据,即区尾,包含A/B密钥以及访问控制位,该段出厂默认为:ff ff ff ff ff ff ff 07 80 69 ff ff ff ff ff ff

关注我的公众号,在公众号里发如下消息,即可获取相应的工程源代码:

基于RC522和S50的RFID开发实例

一文读懂基于RC522和S50的RFID开发相关推荐

  1. 一文读懂基于PN532和S50的NFC开发

    基于PN532和S50的NFC开发 1. NFC概述 NFC(Near Field Communication)近场通信,这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体 ...

  2. 一文读懂基于神经网络的图片风格转移

    作者 | moliam 转载自 CSDN 博客 前言 将A图片的风格转移到B图片上,指的是将A图片的抽象艺术风格(如线条.色彩等等)和B图片的内容框架合成为一幅图.自然地,A图片称为风格图,而B图片就 ...

  3. 一文读懂基于Redis的Amazon MemoryDB数据库

    目录 前言 1. 配置 MemoryDB 1.1 获取 AWS 访问密钥 1.2 下载和配置 AWS CLI 2. 配置集群 2.1 创建集群 2.2 授予集群访问权限 2.3 连接到集群 2.4 删 ...

  4. 部门角色权限rbac_k8s十 | 一文读懂基于角色的权限控制RBAC

    一.ServiceAccount . 1. ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务 ...

  5. 一文读懂基于小程序的图像识别

    基于微信小程序的图像识别 前言:闲来无事想用小程序做一些简单且容易上手的功能,顺便接触下自己从未涉及到的领域,本文功能采用微信小程序原生开发,纯前端调用开放平台接口,无后端封装,新手也能迅速上手. 目 ...

  6. 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用

    关键词/Nanopore测序技术    文/基因慧 随着基因测序技术不断突破,二代测序的发展也将基因检测成本大幅降低.理想的测序方法,是对原始DNA模板进行直接.准确的测序,消除PCR扩增带来的偏差, ...

  7. ​一文读懂EfficientDet

    一文读懂EfficientDet. 今年年初Google Brain团队在 CVPR 2020 上发布了 EfficientDet目标检测模型, EfficientDet是一系列可扩展的高效的目标检测 ...

  8. AI洞观 | 一文读懂英特尔的AI之路

    AI洞观 | 一文读懂英特尔的AI之路 https://mp.weixin.qq.com/s/E9NqeywzQ4H2XCFFOFcKXw 11月13日-14日,英特尔人工智能大会(AIDC)在北京召 ...

  9. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现

    一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现 导读:近日,马云.马化腾.李彦宏等互联网大佬纷纷亮相2018世界人工智能大会,并登台演讲.关于人工智能的现状与未来,他们提出了各自的观点,也引 ...

最新文章

  1. 困扰爱因斯坦的「幽灵般的超距作用」,是如何被贝尔定理证明确实存在的?...
  2. mysql 单列转换为行,mysql行转换为列
  3. 企业价值观念形成的四个阶段
  4. Keil MDK在个别电脑上下载程序失败的解决办法
  5. H. Fight Against Monsters
  6. linux C/C++开发环境搭建指南
  7. C#获2021年度编程语言奖,开发者们最该关注这些亮点!
  8. 深入分析Spring 与 Spring MVC容器
  9. ES6之Module的语法(3)
  10. docker centos node nginx
  11. Redis面试常问2-- 从海量数据里查询某一固定前缀的key? SCAN cursor
  12. Tomcat catalina.properties配置文件详解
  13. OD常用快捷键(对比SoftICE)
  14. Hibernate pojo对象的三种状态
  15. 贪心算法及其经典例题
  16. 正则表达网络三剑客之sed
  17. Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法
  18. Java 基础知识随笔1
  19. matlab扩充内存,matlab中内存不够用的解决方案
  20. VIC Classic 驱动程序

热门文章

  1. C语言-函数案例-计算圆周长
  2. 通过Python终端输入命令对NAO机器人进行实时控制
  3. Nodejs实现给手机发送短信验证码用于登录功能(免费短信)
  4. 手机h5页面唤起打电话、发短信功能
  5. CTFHUB-WEB-XSS【05】反射型
  6. 十四、 ThinkPHP6_聚合.原生.子查询
  7. 面试的时候面试官问如何看待加班,该怎么回答?
  8. debian linux win7,win7debian双系统
  9. SQL Server无法连接到本地数据库
  10. 时间弥散谱成像和IMPULSED