【物联网无线通信技术】NFC从理论到实践(FM17XX)

news2024/11/26 4:55:34

NFC,全称是Near Field Communication,即“近场通信”,也叫“近距离无线通信”。NFC诞生于2004年,是基于RFID非接触式射频识别技术演变而来,由当时的龙头企业NXP(原飞利浦半导体)、诺基亚以及索尼联合发起。NFC采用13.56MHz频段,设计运行于20厘米距离之间,传输速度分为13.25KB/s、26.5KB/s、53KB/s三种。

NFC虽然具有只需要靠近就能快速完成配对和传输全过程的优势,但是所谓成也萧何败也萧何,其短距离才能建立连接,以及低带宽的特点在面对手机与其他电子设备无线连接需求时劣势尽显,再加上跟蓝牙相比,其需要单独的天线(蓝牙可以wifi公用),所以其在刚诞生之际鲜有移动设备搭载此项功能,倒是在门禁等安防系统中有所应用。后来随着移动支付的需求增加,NFC功能又迎来了新的机遇。

本篇文章从NFC的技术诞生背景将起,从最常见的应用入手,由上到下讲述了整个NFC技术从理论到实现的过程,NFC读卡器使用的是复旦微电子的FM17XX系列芯片,NFC卡片为M1。

目录

NFC技术概述

防止冲突机制 

卡片认证

实现原理 

嵌入式软件 

卡片触发

INITVAL VALUE

读卡

写卡 


NFC技术概述

在讲NFC之前,先讲讲它的前辈:RFID,其英文全称是radio-frequency identification,即射频识别技术。RFID系统使用标签(Tag)来识别物体。除了标签,RFID系统还有一个双向无线收发机,被称为读写器(Interrogator/Reader),向标签发送信号,并读取标签的反馈。RFID属于自动识别(AIDC:Automatic Identification and Data Capture)技术中的一种。这个识别过程如下:

  1. 首先,跟物品绑定的数据会预先通过读写器存储在RFID标签中。
  2. 当标签进入读写器扫描天线的范围内时,无源RFID标签的天线将接收到的电磁波能量转化成电能,激活RFID标签中的芯片,并将RFID芯片中的数据发送出来。
  3. 无线电波被读写器的天线接收,读写器将这些无线电波解码为数字信息。

NFC作为RFID技术的后辈,在设计之初旨在智能设备的近场双向通信,但是其诞生之后,应用最为广泛还是门禁的功能。

ISO14443协议是Contactless card standards(非接触式IC卡标准)协议,它定义了以下两个主体:

  • PICC:接近式卡 Proximity Card(PICC) (卡片)。
  • PCD : 接近式耦合设备 Proximity coupling device (PCD)(读卡器)

根据信号发送和接收方式的不同,ISO/IEC14443-3定义了TYPEA、TYPEB两种卡型。  以飞利浦,西门子公司为代表的TYPEA。 以摩托罗拉,意法半导体公司为代表的TYPEB。今天我们讲到的为M1卡,指的是菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,属于TYPEA类型。

读卡机我们文章涉及到的FM17XX系列芯片,可分别支持13.56MHz频率下的typeA、 typeB、15693三种非接触通信协议,支持MIFARE和SH标准的加密算法。

标准不仅定义了射频卡和读写器的物理特性,例如频率和天线设计,还描述了射频卡与读写器之间的初始化和防冲突机制以及数据传输协议和指令集。下图是文章涉及的读卡机与卡片的通信流程。


防止冲突机制 

读卡器正常情况下一个时间点只能对磁场中的一张卡进行读或写操作,但是实际应用中经常有当多张卡片同时进入读写器的射频场,读写器怎么处理呢?读写器需要选出特定的一张卡片进行读或写操作,这就是标签防碰撞。常见的防冲突机制主要有以下几种:

  • 面向比特的防冲突机制,ISO14443A(TYPEA)使用这种防冲突机制,其原理是基于卡片有一个全球唯一的序列号。比如Mifare1卡,每张卡片有一个全球唯一的32位二进制序列号。
  • 面向时隙的防冲突机制,ISO14443B(TYPEB)中使用这种防冲突机制。
  • 位和时隙相结合的防冲突机制,ISO15693中使用这种机制。一方面每张卡片有一个7字节的全球唯一序列号,另一方面读写器在防冲突的过程中也使用时隙叫号的方式,不过这里的号不是卡片随机选择的,而是卡片唯一序列号的一部分。

卡片认证

三重加密算法被用于执行标准认证。在密钥缓冲器中必须存储准确的密钥以便能够进行成功的认证操作。

  1. 通过LoadKeyE2或者LoadKey加载密钥到内部密钥缓冲器。
  2. 启动Authent1指令结束之后,检查错误标志来判断执行结果。
  3. 启动Authent2指令,结束之后,检查错误标志以及Crypto1On标志来判断执行结果。

实现原理 

使用任意型号的MCU(一般需要具有低功耗模式)作为微处理器(下图中的uProcessor),MCU与FM17XX系列芯片采用SPI接口进行通信,天线直接连接FM17XX,具体如下图。


嵌入式软件 

嵌入式软件从下到上主要分为以下三层:

  1. 常用/基本函数,包括卡片UID种类判断,FM17XX初始化,命令传输,向EEPROM以及FIFO读写数据等。
  2. FM17XX卡片操作基本函数,包括HALT,LOADKEY,REQUEST,ANTICOLLISION,SELECT,AUTHENTICATION,READ,WRITE,INCREMENT,DECREMENT,RESTORE,TRANSFER。
  3. 应用功能函数。

下面主要将应用功能的部分函数贴上来供各位深入理解读卡器对卡片的操作功能。


卡片触发

/*************************************
/*名称: HL Active
/*功能: 该函数实现高级 MIFARE 卡激活命今
/*输入: Secnr: 扇区号
/*      Block Adr: 块地址
/*输出:操作状态码
/*     读出数据存于 buffer 中
*************************************/
uchar HL_Active(uchar Block_Adr,uchar Mode)
{
    uchar temp;
    Secnr = Block_Adr/4;
    MIF_Halt();                        //Halt
    temp = Request(RF_CMD_REQUEST+STD);//Request
    if(temp != FM1715_OK)
    {
        return(FM1715_REQERR);
    }
    temp = AntiColl();                //AntiCol
    if(temp != FM1715_OK)
    {
        return(FM1715_ANTICOLLERR);
    }
    temp = Select_Card();             ///Select
    if(temp != FM1715_OK)
    {
        return(FM1715_SELERR);
    }
    Load_keyE2_CPY((Secnr%16),Wode);//LoadKey
    temp = Authentication(UID, Secnr, Mode);//Authentication
    if(temp != FM1715_OK)
    {
        return(FM1715 AUTHERR)
    }
    return FM1715_OK;
}

INITVAL VALUE

/**************************************
/*名称:MIF_Initival
/*功能: 该函数实现 MIFARE 卡初始化值操作
/*输入: buff: 四个字节初始化数值起始地加
/*      Block Adr: 块地址
/*输出: FM1715 NOTAGERR:无卡
/*      FM1715 BYTECOUNTERR: 接收字节错误
/*      FM1715 NOTAUTHERR: 未经权威认证
/*      FM1715 EMPTY:数据溢出错误
/*      FM1715 CRCERR: CRC 校验错
/*      FM1715 PARITYERR: 奇偶校验错
/*      FM1715 WRITEERR: 写卡块数据出错
/*      FM1715 0K: 应答正确
/**************************************
uchar MIF_Initival(uchar idata *buff,uchar Block_Adr)
{
    uchar idata temp;
    uchar i;
    for (i = 0; i < 4: i++)
    {
        *(buff + 4 + i)=~(*(buff + i));
    }    
    for (i = 0;i < 4: i++)
    {
        *(buff + 8 + i)=*(buff + i);
    }
    *(buff + 12) = Block Adr;
    *(buff + 13) =Block Adr;
    *(buff + 14) = Block Adr;
    *(buff + 15) =Block Adr;
    temp = MIF_Write(buff, Block_Adr);
    return temp;
}

读卡

/***************************
/*名称: HL Read
/*功能:该函数实现高级读命令
/*输入:Secnr: 扇区号
/*     Block Adr: 块地址
/*输出:操作状态码
/*读出数据存于 buffer 中
/***************************
uchar HL_Read(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
    uchar temp;
    temp = HL Active(Block_Adr, Mode);
    if(temp != FM1715_OK)
    {
        return temp;
    }
    //Read
    temp = MIF_READ (buff,Block_Adr);
    if(temp != FM1715_OK)
    {
        return temp;
    }
    return FM1715_OK
}

写卡 

/*******************************
/*名称: HL Write
/*功能:该函数实现高级写命令
/*输入: buff: 待写入数据的首地址
/*      Secnr: 刷区号
/*      Block Adr: 块地址
/*输出:操作状态码
/*******************************
uchar HL_Write(uchar idata *buff,uchar Block_Adr,uchar Mode)
{
    uchar temp;
    temp = HL_Active(Block_Adr, Mode);
    if(temp != FM1715_OK)
    {
        return temp;
    }
    //Write
    temp = MIF_Write(buff, Block_Adr);
    if(temp != FM1715_OK)
    {
        return FM1715_WRITEERR;
    }
    return FM1715_OK;
}

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

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

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

相关文章

【ElasticSearch】一键安装IK分词器无需其他操作

要注意的时下面命令中的es是我容器的名称&#xff0c;要换成你对应的es容器名 docker exec -it es /bin/bash # 进入容器 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis- ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.1…

Lookup Singularity

1. 引言 Lookup Singularity概念 由Barry WhiteHat在2022年11月在zkResearch论坛 Lookup Singularity中首次提出&#xff1a; 其主要目的是&#xff1a;让SNARK前端生成仅需做lookup的电路。Barry预测这样有很多好处&#xff0c;特别是对于可审计性 以及 形式化验证&#xff…

Dynamic CRM开发 - 实体字段(一)

字段介绍 Dynamic CRM中&#xff0c;实体是CRM业务数据的基本载体&#xff0c;而字段对于实体同样重要&#xff0c;是其核心部分。 CRM中新增实体后&#xff0c;系统会默认为实体创建一些不可编辑&#xff0c;不可删除的字段&#xff0c;如&#xff1a;主键&#xff0c;创建时…

vue路由及打包部署

vue路由&#xff08;前端路由&#xff09;&#xff1a;URL中的hash&#xff08;#号&#xff09;与组件之间的对应关系。 一、安装vue路由 npm install vue-router3.5.1 二、定义路由表 路由表主要记录hash&#xff08;#号&#xff09;与组件之间的对应关系。主要定义在route…

解决SEGGER Embedded Studio无法显示Nordic MCU外设寄存器问题

如果使用SES调试NRF52840的时候发现&#xff0c;官方例程只能显示CPU寄存器&#xff0c;但是无法显示外设寄存器时&#xff0c;解决办法如下&#xff1a; 1.在解决方案右键→Options→Debug→Debugger&#xff0c;然后Target Device选择正确的型号。 2.Register Definition Fil…

RT-Thread 的环形缓冲区 ---- 镜像指示位

可以看一下这篇我写的博客&#xff0c;了解一下大概&#xff1a; RingBuffer 环形缓冲区----镜像指示位_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132340883?spm1001.2014.3001.5501 【回顾】缓冲区…

Git的正确使用姿势与最佳实践:团队协作和版本控制的最佳实践

Git是一个版本控制系统&#xff0c;用于跟踪和管理软件开发项目中的代码变更。它可以追踪文件的修改、添加和删除&#xff0c;并记录这些变更的历史。Git可以帮助团队成员协同开发&#xff0c;并提供了一种有效的方式来处理并发编辑和代码合并。 在这篇文章中&#xff0c;我们将…

大数据-玩转数据-Flink

一、说明 在电商网站中&#xff0c;订单的支付作为直接与营销收入挂钩的一环&#xff0c;在业务流程中非常重要。对于订单而言&#xff0c;为了正确控制业务流程&#xff0c;也为了增加用户的支付意愿&#xff0c;网站一般会设置一个支付失效时间&#xff0c;超过一段时间不支…

大数据从入门到放弃——浅谈数据架构的前世今生

文章目录 1. 背景2. 数据的定义及分类2.1 数据的定义2.2 数据的分类2.3 数据和信息的区别 3. 数据的作用4. 数据的那些美好时代4.1 人脑时代4.2 文件时代4.3 数据库时代4.3.1 大服务器时代4.3.2 读写分离时代4.4 数据库的分布式时代4.5 云端时代 5. 数据的未来 1. 背景 随着云时…

excel 核心快捷键用法

1、wps怎样只复制公示计算出来的数据 1.1、按下快捷键“CtrlC”&#xff0c;复制该单元格。 1.2、按下快捷键“ShiftCtrlV”&#xff0c;即“粘贴为数值”&#xff0c;即可只复制数字而不复制该单元格的公式 1.3、wps怎样只复制公示计算出来的数据_百度知道https://zhidao.baid…

【福建事业单位-综合基础知识】05民法典

这里写自定义目录标题 一、民法概述概念原则总结 二、自然人概念总结 三、民事法律行为总结 民法考察2-4题&#xff08;重点总则篇&#xff09; 一、民法概述 概念原则 总结 二、自然人 概念 总结 三、民事法律行为 总结

【python】正则表达式

本文介绍正则表达式常用的用法。 有哪些正则字符 正则表达式中有各种各样的正则字符&#xff0c;用于匹配不同情况下的字符串。具体如下&#xff1a; 使用 re 模块进行字符串匹配 比如&#xff0c;我们要从 ‘Xiaoshuaib has 100 bananas’ 中匹配一个数字&#xff0c;可…

Zoho Books的安全性和数据保护:财务信息安全的保障措施揭秘

在信息化时代&#xff0c;如何保障企业信息安全是十分重要的问题&#xff0c;尤其是财务信息。财务管理工具的安全性是否有保障是许多用户担心的问题。 Zoho Books财务管理工具为客户提供了一系列的数据保护和安全措施&#xff0c;以确保客户财务信息的安全。 1. 采用高度加密…

漏洞指北-VluFocus靶场专栏-工具篇

漏洞指北-VluFocus靶场专栏-番外篇奇技淫巧 &#x1f338;1、burp suite 、中国蚁剑工具、Strut2扫描软件地址&#x1f338;&#x1f338;2、burp suite使用&#x1f338;step1 浏览器开启代理&#xff0c;**推荐使用&#xff1a;SwitchyOmega** step2 确认浏览器端口和burp su…

LeetCode 542. 01 Matrix【多源BFS】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

栈空间和栈帧

如图所示&#xff0c;栈空间是每个线程私有的&#xff0c;其中每个方法有一个栈帧&#xff0c;里面保存了局部变量 返回地址等信息。 如果是多线程&#xff0c;每个线程都会有一个栈空间。 多线程切换的时候需要保存局部变量、当前的地址等信息。 线程上下文切换的时机&…

mybatis入门Idea搭建

一、概念 1、什么是mybatis&#xff1f; MyBatis是一个开源的Java持久层框架&#xff0c;它提供了一种简化数据库访问的方式。它的主要作用是将Java对象与数据库表之间进行映射&#xff0c;使开发者可以通过面向对象的方式操作数据库&#xff0c;而不需要编写大量的SQL语句。M…

线性代数的学习和整理5: 矩阵的加减乘除及其几何意义(未完成,建设ing)

目录 1 矩阵加法 1.1 矩阵加法的定义 1.2 加法的属性 1.2.1 只有同类型&#xff0c;相同n*m的矩阵才可以相加 1.2.1 矩阵加法的可交换律&#xff1a; 1.2.2 矩阵加法的可结合律&#xff1a; 1.3矩阵加法的几何意义 2 矩阵的减法 2.1 矩阵减法定义和原理基本同 矩阵的…