【硬件模块】PN532 NFC读卡串口通信

 PN532

PN532是一款功能丰富的非接触式通讯收发模块,其基于8051单片机核心,集成了多种通信接口和工作模式,以满足不同应用场景的需求。以下是PN532功能相关的详细介绍:

  1. 多种通信接口:PN532支持I2C、SPI和UART(包括高速UART,即HSU)等多种通信接口,这使得它能够方便地与各种主控设备进行连接和通信。这些接口使得PN532能够灵活地嵌入到各种设备和系统中,实现非接触式通信。
  2. 多种工作模式:PN532支持多种工作模式,包括读写模式、卡模拟模式和点对点模式等。
  • 读写模式:PN532可以作为读写器,支持ISO/IEC 14443 Type A和Type B标准,以及Mifare Classic、Mifare Ultralight和NTAG等多种标签。这使得PN532能够读取和写入各种非接触式智能卡,如门禁卡、公交卡等。
  • 卡模拟模式:在卡模拟模式下,PN532可以模拟非接触式智能卡的行为,与读写器进行通信。这使得PN532能够作为智能卡使用,例如在手机中模拟门禁卡或公交卡。
  • 点对点模式:PN532还支持点对点模式,即两个PN532设备之间可以直接进行通信,无需通过读写器或智能卡。这使得PN532能够用于实现设备间的无线通信和数据传输。
  1. 高度兼容性:PN532不仅支持上述的ISO/IEC 14443标准,还支持其他非接触式通信协议,如FeliCa等。这使得PN532能够兼容多种非接触式智能卡和读写器,提高了其适用范围和兼容性。
  2. 灵活的配置和选择:PN532具有多种配置和选择方式,例如可以通过引脚选择不同的工作模式或通信接口。此外,PN532还支持不同的帧格式和波特率设置,以适应不同的通信需求。
  3. 强大的安全性:PN532支持数据加密和认证功能,确保通信过程的安全性和可靠性。这使得PN532能够用于需要高安全性的应用场景,如移动支付、门禁系统等。

综上所述,PN532是一款功能强大、高度集成的非接触式通讯收发模块,具有多种通信接口、工作模式、高度兼容性和灵活的配置方式。这些功能使得PN532能够广泛应用于各种需要非接触式通信的场合,如物联网、移动支付、智能门禁等。

以上介绍来自文心一言。

今天我们就来玩玩这个NFC模块,其实买来好久了,一直懒得动,最近有点懈怠了就硬着头皮拿来玩玩,就是下面这个东西。

说实话,身为英语不好的人我真的很难过,因为文档全是英文的,机翻又翻的一言难尽,并且网上大部分教程都是教怎么破解NFC卡的(我只是想读个卡而已。。。),因此前前后后死磕了两三天才勉强理清流程。

我们先来观察一下这个模块,首先是PN532支持I2C,SPI,UART这三种通信方式,在这个模块上也给我们把引脚给留出来了。

串口的引脚在背面是和I2C的引脚共用的,也就是说同一时间我们只能使用一种通信方式。

那么我们如何选择通信方式呢?

回到第二张图的左下角那个蓝色框,我们可以通过拨动那俩小开关来控制使用什么通信方式。

上表中的HSU就是我们的UART,我们这篇文章使用的也是串口来对PN532进行操作。默认的波特率是115200,跟我们之前使用的其他默认是9600的模块不一样了,不过其他都是一样的,是无校验位,一位停止位。

我们之前也用过不少用串口进行通信的模块,过程就是你发一句我发一句,因此我们就需要了解我们能够发送什么。

PN532信息框架

下面的图都是来自官方文档的,因为官方文档都是英文的我看不懂,所以我用的搜狗翻译(不是广告)机翻了一下(每个月免费翻译50页,整个文档200页,钱包受伤了),错误还是不少的,大家可以结合着原文看看,图片左边的是原文,右边的是机翻的结果。 

正常信息框架

上面是正常的信息框架,也就是说我们和PN532通信的时候用的就是这个框架(双方都用)。

首先是序文,是0x00,这个是固定的,后面接两个字节的起始码 0x00 和 0xFF,包括最后面的一个字节的同步信号(结束位)0x00。也就是说我们固定的格式是 0x00 0x00 0xFF ……  0x00。

然后这个框架的第四个字节是长度位,但是注意不是整个信息的长度,而是从TF1到PDn的长度,简单来说就是长度位的下下位开始到结束位的上上位结束的长度。

第五个字节是长度校验位,就是长度位+长度校验位的合需要为0x00(是进位导致的变成0x00而不是加上负数,可以理解成长度位+长度校验位=0x100,但是一个字节是8位,因此把左边多余的部分舍弃就变成了0x00)

第六个字节是数据流动位,如果是D4则表示是我们发给PN532的,如果是D5则表示是PN532发给我们的。

接下来连着的几位是命令+数据,也就是PD0~PDn。

PDn的后一位是数据校验位,就是从数据流动位开始到这个数据校验位相加,结果需要为0x00。

最后一位就是固定的结束位0x00了。

拓展信息框架

我们可以知道,上面正常信息框架的长度位是一个字节,也就是说它最长也就传输255个字节的数据(掐头去尾,去掉前后固定的部分),因此有了拓展信息框架,支持传输更多的数据。

跟正常信息框架相比就是在中间多了俩固定的0xFF,以及就是长度位变成了两位。其他位的含义是一样的。

不过一般情况下我们也用不到,因为255个字节就能够胜任大多数的情况了。

确认帧&不确认帧

两个帧都是固定的。分别是 0x00 0x00 0xFF 0x00 0xFF 0x00和 0x00 0x00 0xFF 0xFF 0x00 0x00。

确认帧(ACK)有两个用途,一个是确认收到了上一帧数据,一般是PN532用来表示收到了来自我们的命令,另一个用途是终止机制(???机翻的有些难以理解,应该是结束当前正在进行的命令),一般是我们给PN532发送的。

另一个不确认帧也就是NACK  ,一般是我们给PN532发送的,发送之后表示我们没收到上一帧数据,也可以是我们在校验数据的时候发现数据有误,总之我们发送完这个NACK之后,PN532就会再给我们发送一次上次发送的数据。

错误信息框架

错误信息框架是PN532用来通知我们发生应用级错误的。

完整的错误代码列表到官方文档里查。

命令

我们接下来挑几个命令介绍,从这几个命令里再挑几个演示一下。

选择数据流路径(初始化)

可以看作是初始化或者是唤醒PN532。因为我们使用PN532的话,首先就是需要发送这个命令。

我们需要发送的是0x14 + 方式。在上图中方式有三种选择,我们正常使用就选第一种0x01,不需要再配置其他参数了。

也就是说我们要发送的是 0x14 0x01

但是不要忘了,我们需要套上上面介绍过的信息框架,我们使用用正常信息框架,那么发送的数据就是下面这一串。

00 00 FF 03 FD D4 14 01 17 00

也有说法是唤醒用的不仅是正常的信息框架,还需要再加上一段特殊的数据,就是下面这串。

55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00

我试了一下,两种方式都可以唤醒PN532,大家各自都试一下,选合适的用就行。 

我们来分析分析(后面就不分析了),首先开头的 00 00 FF是固定的,可以忽略(发送的时候不要忽略!)。

接下来的 03 是长度位,我们发送命令+参数是两个字节,再加上数据流动位一个字节一共是三个,因此长度位是03。

长度位后接的是长度校验位,需要长度位+长度校验位的和为0。计算的话可以这样算:0x100 - 0x03 = 0xFD

长度校验位后接的是数据流动位,因为是我们发送给PN532的,因此固定是D4,如果是PN532发给我们的那么这一位就是D5。

接下来两位就是我们的命令+参数 0x14 0x01。

后面是数据校验位,我们需要从数据流动位一直加到这个数据校验位,要相加的和为0x00(高位舍弃)。

最后一个结束位固定是0x00。这样我们就分析完毕这个命令了,包括我们应该如何使用正常信息框架去发送我们要发送的命令,发送其他命令的时候步骤也是一样的,介绍后续命令的时候就不再这么详细地分析了。

接下来我们直接拿串口助手来操作PN532,用单片机的话就配置个串口即可(波特率115200,无校验位,一位停止位),然后把常用的命令存放进数组里,根据自己项目的逻辑去按照不同的时机去发送不同的用正常信息框架封装好的命令即可。

发送之后我们就收到了上面接收区里的一段数据。

这段数据我们要拆分开来看,我已经用红框和蓝框区分开来了,红框就是标准的确认帧,我们忽略即可,不过如果是用单片机来操作PN532的话就需要做好把处理确认帧的相关逻辑了。

接下来蓝框里的数据我们掐头去尾,只留下命令和参数: 0xD5 和 0x15。

再回到上面文档截的图片,正常回复就是 0xD5 和 0x15 ,因此我们目前为止没出错误。

不过要注意的就是PN532通信的数据中,一共有两个校验位,在实际的项目中我们一定要对收到的数据进行校验,如果校验之后发现数据有误,那么我们发送NACK帧让PN532再发一次,直到数据接收正确。

设置波特率

命令是0x10,再加上参数指定要设置的波特率,默认是115200,没啥事咱也别改了用的好好的。

设定PN532内部参数

除了0x12的命令之外,只需要一个Byte作为参数,通过设置这个Byte的每个位来设定PN532的内部参数。

被动检测目标(读卡)

命令是4A,参数有三个,但是最后一个是可选的,我们可以不用。

第一个参数表示我们需要检测多少个目标(卡),最多是两个,我们一般就检测1个就行了。

第二个参数是初始化期间使用的波特率和调制类型。用五种可选的参数可以参考上面的截图,我们用0x00就行。

00 00 FF 04 FC D4 4A 01 00 E1 00

我们发送这个命令之后,PN532会回复一个ACK,就是我红框框出来的,我们忽略。

然后再把NFC的卡贴在PN532上就会再发送来一大段数据。我们直接看后面来的这一大段。

我把收到的数据掐头去尾拿出来分析分析。

D5 4B 01 01 00 04 08 04 33 88 9C 34

首先是我们发送命令之后会得到的数据是0xD5 和0x4B以及后面一堆数据。

我们收到的数据符合这个输出,我们接着往后看,下一位表示的是初始化目标的数量,因为我们发送命令的时候最多只让初始化1个,因此这个位的值也只能是0x01。

因为我们发送命令的时候指定类型的参数是0x00,对应的是106kbps的A类型,因此我们只需要看上图中框出的格式(其他格式的我也没截进来就是了)。

说实话这翻译的我看不懂,而且就算是原文中的英语也是缩写我还是看不懂,因此这个格式的前半段我们跳过,我们直接看第五个字节,这个能看得懂,就是说NFC的ID号的长度,后面接的就是NFC的ID号,我们需要用的信息也就是这个ID号了,因此我们前面的也不用看懂,只需要知道返回的第二个参数的第五个字节是NFC的ID号长度,剩下的那么多个的字节是NFC的ID号。

当我们发送了这个命令之后,PN532回复ACK,然后一直再检测是否有NFC卡贴上来,贴上来之后才会再发上面那么一大段数据给我们。如果我们发送完命令之后反悔了不想要检测了,我们可以发送一个确认帧,这时候PN532就不会再检测了。

资料免费下载

中文设计的资料,包括官方文档和机翻版的,以及文中没出现的读卡解卡上位机软件我都打包好放公众号里了,小伙伴们可以关注同名公众号“折途想要敲代码”回复关键词“PN532”免费下载。

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

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

相关文章

MySQL的安装和环境配置

1.下载MySQL安装MySQL 选Custom选项为高级自定义模式 2.配置MySQL环境 安装好之后,在桌面右键点击我的电脑(有些是此电脑),然后点击属性,进入系统信息设置,接着点击高级,进入环境变量界面,进入环境变量界面…

【Spring Boot】Java 持久层 API:JPA

Java 持久层 API:JPA 1.Spring Data1.1 主要模块1.2 社区模块 2.JPA3.使用 JPA3.1 添加 JPA 和 MySQL 数据库的依赖3.2 配置数据库连接信息 4.了解 JPA 注解和属性4.1 常用注解4.2 映射关系的注解4.3 映射关系的属性 5.用 JPA 构建实体数据表 1.Spring Data Spring…

Redis基础教程(十):HyperLogLog

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

Linux爱好者能对Linux痴迷到什么程度?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!曾经想帮助全世界的人卸载掉…

技术职务管理助力智慧校园建设:深入解读人事系统

智慧校园人事系统中的技术职务管理模块,专注于高校及教育机构内技术人员及科研人员的职务管理,涵盖职称评审、技术职务任命、项目参与记录、科研成果跟踪及技术能力评估等多个方面,旨在通过信息化手段提升技术人才管理的效率与科学性。 在这一…

Windows如何安装并启动Nginx

0、前言 Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器,广泛应用于互联网领域。它以其高效稳定、内存占用少和丰富的模块化设计而受到开发者们的青睐。 在实际使用过程中,我们多数时候会在Linux系统上运行Nginx,但实际上&#xff…

单目行车测距摄像系统(单目测距-行车)

单目行车测距摄像系统是一种利用单个摄像头实现车辆行驶中前方障碍物距离测量的技术。该系统通过计算机视觉算法,能够实时分析摄像头捕捉的图像,精确计算出车辆与前方物体之间的距离,对于自动驾驶、高级驾驶辅助系统(ADAS&#xf…

24年hvv不要掉进秘网了,特别别被反制了

这两年的hvv,防守方已经不单单是每天坐那看监控、封ip了,越来越多的大佬投身防守工作中,让防守从被动变成了一个主动的活了。 目前最常见的主动防守有2种,1、长时间的蜜罐运营。2、蜜罐反制。 01-蜜罐运营 蜜罐这个词干安全的都…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。(素数只能被1或其本身整除的数) 2. 一个函数判断一年是不是闰年。 3.写一个函数,实现一个整形有序数组的二分查找。 4. 写一个函数,每调用一次这个函数,使得num每次增…

基于PHP花涧订购系统的设计与实现00332

摘 要 近年来,电子商务的快速发展引起了行业和学术界的高度关注。花涧订购系统旨在为用户提供一个简单、高效、便捷的花卉购物体验,它不仅要求用户清晰地查看所需信息,而且还要求界面设计精美,使得功能与页面完美融合,…

AI程序员还是代替不了程序员,震撼硅谷的Devin-ai程序员,再度震撼硅谷——但这次是被打假

文章目录 主要疑点包括但不限于:35年从业者逐帧验证 AI程序员还是代替不了程序员,震撼硅谷的Devin-ai程序员,再度震撼硅谷——但这次是被打假 一位油管程序员博主Internet of Bugs对Devin发布的视频进行了逐帧分析,逐一举证说明了…

【C语言】register 关键字

在C语言中,register关键字用于提示编译器将变量尽量存储在CPU的寄存器中,而不是在内存中。这是为了提高访问速度,因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁? 大家好,我是 猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

目录 1.创建版本库 git init 1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做,完全是本地化的。 在目录中执行 git init,就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件,不…

安卓微商大师V3.4.0/高级版一键群发僵尸粉检测

一款高效获取客源,备受好评的微商工具,资源丰富,秒速获得客源,大量群客源,都是散客,携手创业,是做微商生意的首选工具。打开即是黑钻高级会员 赶快体验吧 很强大 链接:https://pan.…

Java程序设计课后习题(答案版) 期末复习

第一章 Java语言概述 一、选择题 下面哪种类型的文件可以在Java虚拟机中运行?( A ) A. class B. Java C. jre D. exe 如果JDK 的安装路径为“d:\jdk”,若想在命令窗口中任何当前路径下,都可以直接使用javac和java命令,需要将环境变量path设…

携手共筑爱的桥梁:引导接纳自闭症同学

在孩子的班级中,当自闭症儿童成为我们共同的一员时,作为老师和家长,我们肩负着特别的责任——引导孩子们以开放的心态接纳、善待并关爱他们。 首先,我们要以身作则,展现接纳与尊重。无论是老师还是家长,都…

笔记:Git学习之应用场景和使用经验

目标:整理Git工具的应用场景和使用经验 一、开发环境 Git是代码版本控制工具;Github是代码托管平台。 工具组合:VSCode Git 需要安装的软件:vscode、Git 其中vscode需要安装的插件:GitLens、Git History 二、应用…

仓库货物管理系统

摘 要 随着信息技术的迅猛发展,大数据已经成为推动各行各业变革的重要力量。特别是在物流仓储领域,大数据技术的应用不仅能够显著提升仓库货物管理的效率,还能够优化库存管理、减少成本、提高客户满意度。因此,基于大数据的仓库货…

webstorm 高效查看不同分支差异 摒弃你的git diff手动操作

背景 每次代码冲突或者版本发生异常时,排查不同版本时就是一个头大的问题,头大的点在于用 vscode 的 git diff 一点点地排查和比较,耗时耗力,版面展不开,commit 差异看不出来,每个页面的代码不同也不能快速…