PN532
PN532是一款功能丰富的非接触式通讯收发模块,其基于8051单片机核心,集成了多种通信接口和工作模式,以满足不同应用场景的需求。以下是PN532功能相关的详细介绍:
- 多种通信接口:PN532支持I2C、SPI和UART(包括高速UART,即HSU)等多种通信接口,这使得它能够方便地与各种主控设备进行连接和通信。这些接口使得PN532能够灵活地嵌入到各种设备和系统中,实现非接触式通信。
- 多种工作模式:PN532支持多种工作模式,包括读写模式、卡模拟模式和点对点模式等。
- 读写模式:PN532可以作为读写器,支持ISO/IEC 14443 Type A和Type B标准,以及Mifare Classic、Mifare Ultralight和NTAG等多种标签。这使得PN532能够读取和写入各种非接触式智能卡,如门禁卡、公交卡等。
- 卡模拟模式:在卡模拟模式下,PN532可以模拟非接触式智能卡的行为,与读写器进行通信。这使得PN532能够作为智能卡使用,例如在手机中模拟门禁卡或公交卡。
- 点对点模式:PN532还支持点对点模式,即两个PN532设备之间可以直接进行通信,无需通过读写器或智能卡。这使得PN532能够用于实现设备间的无线通信和数据传输。
- 高度兼容性:PN532不仅支持上述的ISO/IEC 14443标准,还支持其他非接触式通信协议,如FeliCa等。这使得PN532能够兼容多种非接触式智能卡和读写器,提高了其适用范围和兼容性。
- 灵活的配置和选择:PN532具有多种配置和选择方式,例如可以通过引脚选择不同的工作模式或通信接口。此外,PN532还支持不同的帧格式和波特率设置,以适应不同的通信需求。
- 强大的安全性: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”免费下载。