RFID开发与应用(中)

RFID开发与应用(中)

我写的RFID系列总共分为三篇,上一次讲了ISO1443-A协议,这个协议主要的功能是读卡器与卡片之间数据传输的约定。这一次就来聊聊读卡器,看MCU要怎么控制读卡器。


在上篇博文中已经谈到,读卡器(RC522)是没有自主功能的,没法对数据进行处理,所以需要MCU来控制,那MCU来控制读卡器就需要有通信接口,因为有了通信接口才能够实现数据交互。以下就是RC522与外部的通信接口:

  1. SPI接口;
  2. 串行UART;
  3. I2C接口。

本文只讲解SPI接口。


SPI接口

SPI是很常见的一种通信方式,在网络上关于SPI的资料也是一抓一大把,但是在RC522中SPI和普通的SPI略有不同,不同的地方主要在地址方面体现。


先简单介绍一下普通SPI的地址使用。我们的主机如果想读取从机的数据,就需要先向从机发送一个地址(写数据也要先发送地址),这个地址为从机中寄存器的地址。简单来说,就是主机告诉从机,我现在要读取你某个寄存器中的数据。从机在接收到这个地址后,就会到对应的地址去,取出数据并通过SPI发送到主机。具体顺序如下表:
在这里插入图片描述

在了解普通的SPI接口后,就来看看RC522下的SPI接口,它的SPI地址会有些特殊,它的最高位表示读或者写,第6位到第1位表示地址,而最低位还不允许使用。具体如下表:

在这里插入图片描述

看了上面两个表格,应该对这个地址有了一点印象了,但是只有文字似乎有点苍白,所以下面展示一下是读数据的代码。

在这里插入图片描述
在上述函数中,先传入一个地址给函数,然后选择从机,将从机的NSS线拉低,再将地址进行一个变换。即先将地址左移一位,把地址放到第6位至第1位,然后进行一个与运算,将最低位变成0,最后就是进行或运算,将最高位变成1,表示这是读数据。经过这些变换过后,就成功将地址转换为RC522所规定的地址,后面的操作就和普通的SPI操作相同。(此处特别说明,RC522中的地址不会出现最高位为1的情况,所以在进行移位时,也不会丢失地址。)


RC522命令集

先简单回顾一下整个通信过程,首先我们有一个MCU,然后还有一个RC522,RC522后面还有一个卡片,那么整个通信过程是基于FIFO存储器的,那FIFO里面放的就是一些命令或者是数据。


接下来介绍一下,RC522的命令集,RC522的命令集总共有两种,第一种命令是用来控制RC522本身的,第二种命令则是用来控制卡的,在这里我们只需要重点关注第二种命令即可。


第一种命令举例:

  1. DLE:RC522处于空闲模式;这条命令也用来终止实际正在执行的命令。
  2. CALCCRC:FIFO的内容被传输到CRC协处理器并执行CRC计算,这个命令必须通过向命令寄存器写入任何一个命令来软件清除。

第二种命令举例:

  1. TRANSCEIVE: 重复发送FIFP的数据,并不断接收返回的数据;这条命令的意义就是让读卡器将MCU的数据发送给卡片,然后卡片有响应之后,读卡器再接收。(0X0C)
  2. MFAUTENT: 用来处理Mifare认证以使能到任何Mifare普通卡的安全通信;这条命令的意义就是,MCU里有一些数据,然后要让RC522将这些数据进行一个认证,然后再将数据传给卡片。这里面的认证就是比对卡片中的密码。(0X0E)

大概了解了这些命令都有什么作用之后,就来看下具体是怎么使用,或者说怎么实现的。下图就是我们常说的整个RFID流程。

在这里插入图片描述
从上图可以看出,数据的传输有两个过程,过程一为MCU传输到读卡器,过程二是读卡器传输到卡片。其中,过程一所传输的内容,就是我们上面介绍的命令和数据,而过程二传输的内容,就必须符合我们之前介绍的ISO14443-A协议。


下面以唤醒卡片为例,首先我们先回顾一下ISO14443-A协议中,唤醒的命令,在14443协议中唤醒卡片的命令为0X26。但这个命令是从读卡器传输到卡片的,我们要怎么让读卡器知道,要把0X26发送到卡片?

要解决这个问题,就必须要用到我们刚刚介绍的TRANSCEIVE命令,那整个通信过程就会变成,MCU向读卡器发送TRANSCEIVE命令(0X0C) + 0X26,读卡器在解析到TRANSCEIVE命令之后,就会把后面的数据都发给卡片,这里的数据就是指0X26。卡片在接收到0X26之后就被唤醒了,当然卡片在被唤醒之后,也会返回一个标志位给读卡器,读卡器接收到之后再返回给MCU,告诉MCU卡片已经被唤醒。在完成唤醒(0X26或者0X52)之后,卡片会返回一个2字节的卡片类型。


完成唤醒操作之后,还有一个防冲突和选卡操作,接下来就分别介绍一下这两个命令要怎么书写。

防冲突:我们之前就讲过了,防冲突整个过程是由硬件来完成的,但是我们还是需要将开始进行防冲突的命令发送到卡片去,所以MCU只要向读卡器发送TRANSCEIVE命令(0X0C) + 0X93 + 0X20即可。执行防冲突后,会返回4个字节的卡片ID,还有1个字节的异或校验。

选卡:在之前就已经介绍过,选卡的命令是0X93 + 0X70,那是不是还像前面两个例子一样,直接发送TRANSCEIVE命令(0X0C) + 0X93 + 0X70就可以?

事实上并不这么简单,我们知道选卡就是选定一张卡片,很显然我们不只是要发送选卡的命令,还要把我们要选择的卡片ID也发送过去。到了这一步选卡命令还没有结束,现在我们先来分析一下这整个命令,TRANSCEIVE命令(0X0C) + 0X93 + 0X70 + ID1 + ID2 + ID3 + ID4,不知道大家还记不记得前面讲过选卡命令是当NVB=0X70时,后面再追加一个CRC校验,才变成选卡命令,那么我们前面也讲过NVB的高4位记录的是数据总的字节数,低4位代表没有传输完字节的位数。那么上面命令中属于ISO14443协议的字节只有0X93 + 0X70 + ID1 + ID2 + ID3 + ID4 这6个字节,因为TRANSCEIVE命令(0X0C)并不是发送给卡片的命令,所以不能够算进字节数中,也就是说我们那条命令中还少了一个字节,这个字节实际上就是我们进行防冲突返回回来的校验,加上这个那就满足了7个字节,最后一步就是把这7个字节进行一次CRC计算,再把返回的结果追加到后面,选卡命令就选完成了。如果选卡成功了就会返回0X08,这个返回结果和后面所讲的S50卡片有关联。


说完了唤醒、防冲突和选卡,TRANSCEIVE命令就算是讲完了,后面还有一个MFAUTENT命令,需要结合S50卡来理解,所以就留到下篇博文来讲吧。(又不知道要拖到什么时候才会更行 =_= )






RFID开发与应用(上)
RFID开发与应用(下)

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值