实验所需硬件

序号

名称

数量

备注

1

电脑

1台

系统Windows7及以上

2

CC2530底座模块

1个

·

3

RFID模块

1个

·

4

OLED屏模块

1个

·

5

CC Debugger 仿真器和连接线

1套

·

6

USB线

1根

·

7

HF_RFID卡

1张

·

8

RFID模块实验代码

1份

·

实验所需软件

CC2530底座:HIVE ZigBee Pro(简称CC2530底座)是一种基于CC2530F256芯片的蜂巢底座。

实验硬件

CC Debugger 仿真器和连接线

实验硬件

RFID模块

RFID模块

OLED模块

OLED模块

USB线

USB线

RFID技术介绍

RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。应用分布在身份证件和门禁控制、供应链和库存跟踪、汽车收费、防盗、生产控制和资产管理。

RFID的使用频段分布有低频(125KHz到135KHz),高频(13.56MHz)和超高频(860MHz到960MHz)之间。

RFID技术与NFC技术的区别

NFC(Near Field Communication)技术,即近距离无线通讯技术。NFC是在RFID的基础上发展而来,NFC从本质上与RFID没有太大区别,从名字可以看出NFC技术增加了点对点通信(Communication)功能,NFC设备彼此寻找对方并建立通信连接,而RFID通信的双方设备是主从关系。 其余还有一些技术细节方面。NFC相较于RFID技术,具有距离近、带宽高、能耗低等一些特点:

高频RFID系统

典型的高频HF(13.56MHz)RFID系统包括阅读器(Reader)和电子标签(Tag,也称应答器Responder)。电子标签通常选用非接触式IC卡,又称智能卡具有可读写,容量大,加密及数据记录可靠等功能。IC卡目前已经大量使用在校园一卡通系统、消费系统、考勤系统和公交消费系统等。目前市场上使用最多的是PHILIPS的Mifare系列IC卡。读写器(也称为阅读器)包含有高频模块(发送器和接收器)、控制单元以及与卡连接的耦合元件。由高频模块和耦合元件发送电磁场,以提供非接触式IC卡所需要的工作能量以及发送数据给卡,同时接收来自卡的数据。IC卡由主控芯片ASIC(专用集成电路)和天线组成,标签的天线只由线圈组成,很适合封状到卡片中,常见IC卡内部结构如图:

IC卡内部结构图

较常见的高频RFID应用系统如图所示,IC卡通过电感耦合的方式从读卡器处获得能量。

RFID高频应用系统组成

下面以典型的IC卡MIARE 1为例说明电子标签获得能量的整个过程。读卡器向IC卡发送一组固定频率的电磁波,标签内有一个LC串联谐振电路(如下图所示),其谐振频率与读写器发出的频率相同,这样当标签进入读写器范围时便产生电磁共振,从而使电容内有了电荷,在电容的另一端接有一个单向通的电子泵,将电容内的电荷送到另一个电容内储存,当储存积累的电荷达到2V时,此电源可作为其他电路提供工作电压,将标签内数据发射出去或接收读写器的数据。

IC功能示意图

ISO 14443协议标准

ISO 14443协议是超短距离智慧卡标准,该标准定义出读取距离7~15公分的短距离非接触智能卡的功能及运作标准,ISO 14443为TYPE A和TYPE B两种。TYPE A产品具有更高的市场占有率,如Philips公司的MIFARE系列占有了当前约80%的市场,且在较为恶劣的工作环境下有很高的优势。而TYPE B在安全性、高速率和适应性方面有很好的前景,特别适合于CPU卡。这里重点介绍MIFARE1符合ISO 14443 TYPE A标准。

  1. ISO 14443 TYPE A标准中规定的基本空中接口基本标准:
  1. ISO 14443 TYPE A标准中规定的PICC标签状态集,读卡器对进入其工作范围的多张IC卡的有效命令有:

下图为PICC(IC卡)接收到PCD(读卡器)发送命令后,可能引起状态的转换图。传输错误的命令(不符合ISO 14443 TYPE A协议的命令)不包括在内。

PICC状态转化图

非接触式IC卡

目前市面上有多种类型的非接触式IC卡,它们按照遵从的不同协议大体可以分为三类,各类IC卡特点及工作特性如表2所示。PHILIPS的Mifare 1卡(简称M1卡)属于PICC卡,该类卡的读写器可以称为PCD。

IC卡分类:

IC卡

读写器

国际标准

读写距离

工作频率

CICC

CCD

ISO/IEC 10536

密耦合(0~1cm)

0~30MHz

PICC

PCD

ISO/IEC 14443

近耦合(7~10cm)

35MHz,6.75MHz,13.56MHz,27.125MHz

VICC

VCD

ISO/IEC 15693

疏耦合(<1m)

135MHz,6.75MHz,13.56MHz,27.125MHz

高频RFID系统选用PICC类IC卡作为其电子标签,这里以Philips公司典型的PICC卡Mifare1为例,详细讲解IC卡内部结构。Philips是世界上最早研制非接触式IC卡的公司,其Mifare技术已经被制定为IS0 14443 TYPE A国际标准。本平台选用Mifare1(S50)卡作为电子标签,其内部原理如下图所示:

M1卡内部原理

射频接口部分主要包括有波形转换模块。它可将读写器发出的13.56MHz的无线电调制频率接收,一方面送调制/解调模块,另一方面进行波形转换,将正弦波转换为方波,然后对其整流滤波,由电压调节模块对电压进行进一步的处理,包括稳压等,最终输出供给卡片上的各电路。数字控制单元主要针对接收到的数据进行相关处理,包括选卡、防冲突等。Mifare1卡片采取EEPROM作为存储介质,其内部可以分为16个扇区,每个扇区由4块组成,(我们也将16个扇区的64个块按绝对地址编号为0-63,存贮结构如下图所示。

MF1卡存储结构:

MF1卡存储结构

第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化不可更改。其中:第0~3个字节为卡片的序列号;第4个字节为序列号的校验码;第5个字节为卡片内容"size"字节,第6~7个字节为卡片的类型字节。

每个扇区的块0、块1、块2为数据块,可用于存贮数据。数据块可作两种应用:用作一般的数据保存,可以进行读、写操作。用做数据值,可以进行初始化加值、减值、读值操作。

每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下表所示:

A0 A1 A2 A3 A4 A5

FF 07 80 69

B0 B1 B2 B3 B4 B5

A0—A5代表密码A的六个字节;
FF 07 80 69为四字节存取控制字的默认值,FF为低字节;
B0—B5代表密码B的六个字节。
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制位在存取控制字节中的位置,以块0为例,如下所示:_b表示取反。

控制字结构

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

字节6

C20_b

C10_b

字节7

C10

C30_b

字节8

C30

C20

字节9

控制字结构

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

字节6

C23_b

C22_b

C21_b

C20_b

C13_b

C12_b

C11_b

C10_b

字节7

C13

C12

C11

C10

C33_b

C32_b

C31_b

C30_b

字节8

C33

C32

C31

C30

C23

C22

C21

C20

字节9

数据块的存取控制:
数据块的存取控制

上图中KeyA|B表示密码A或密码B,Never表示任何条件下不能实现。如:当块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读。验证密码B正确后可写;不能进行加值、减值操作。

控制块块3的存取控制与数据块0、1、2不同,它的存取控制如下图所示:

控制块3的存取控制

例如:当块3的存取控制位C13 C23 C33=1 0 0时,表示:密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。存取控制:验证KEYA或KEYB正确后,可读、可写。密码B:验证KEYA或KEYB正确后,可读、可写。

通过以上控制器的描述可知,如果控制字为0xFF 0x07 0x80 0x69时,即如下图所示:

控制字(0xFF 0x07 0x80 0x69)

块0:C10 C20 C30————0 0 0

对每个扇区的块0,我们在验证秘钥A或者秘钥B以后可以进行读、写、增加(Increment)、减值(Decrement)等操作,但绝对地址块0只读;

块1:C11 C21 C31————0 0 0

对每个扇区的块1我们在验证秘钥A或者秘钥B以后可以进行读、写、增加(Increment)、减值(Decrement)等操作;

块2:C12 C22 C32————0 0 0

对每个扇区的块2我们在验证秘钥A或者秘钥B以后可以进行读、写、增加(Increment)、减值(Decrement)等操作;

块3:C13 C23 C33————0 0 1

密码A:验证密码A正确后不可读(所以默认情况下我们用秘钥A"FF FF FF FF FF FF"读扇区块3的数据时候返回的秘钥A数据是00 00 00 00 00 00其实就表示空数据不可读的意思),验证秘钥A或者秘钥B正确后,可写(更改)。

存取控制:验证KEYA或KEYB正确后可读、可写。

密码B:验证KEYA或KEYB正确后,可读、可写。

硬件设计

RFID模块采用NXP RFID芯片MFRC522如图7,MFRC522是高度集成的非接触式(13.56MHz)读写卡芯片,此发送模块利用调制和调节的原理,并将它们完全集成到各种非接触式通信方法和协议中。它支持ISO 14443A/MIFARE。MFRC522支持SPI、IIC和UART接口。在本次实验程序采用SPI接口。RFID感应天线采用板载PCB天线。

RFID模块电路

模块组装

② 轻按CCDebugger复位按键,指示灯变绿,表示连接正常。如下图:

模块组装

③ 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:

操作步骤

④ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):

$ cd workspace

⑤ 运行clone命令:

$ git clone https://github.com/aiotcom/eps.git 

下载目录至指定文件夹下。
如果提示"command not found"表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code -> DownLoad ZIP 下载所有工程代码。如下图所示:
下载代码
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。

⑥ 打开 IAR Embedded Workbench 工程软件,点击工具栏: File -> Open -> Workspace,选择工程文件:基于CC2530的模块实验\8.HF-RFID模块\RFID.eww 并打开。

打开工程

选择文件

⑦ 点击Make按钮,重新编译文件,显示没有错误。

文件编译

⑧ 点击Download and Debug按钮,将程序下载到模块中。

下载程序

代码下载成功

⑨ 点击X退出仿真模式。

退出仿真

⑩ 移除CC Debugger仿真器,采用USB线供电。

⑪ 读卡:将HF_RFID卡贴靠RFID的感应线圈,RFID卡的信息将在OLED屏上显示:

感应线圈
显示卡号

① 程序目录结构,源代码文件如下图:

代码目录结构

② main.c代码,对OLED屏、OLED屏IIC接口、RFID芯片驱动初始化完成后,检测是否读到卡号,当读到卡号转成字符串口显示在OLED屏上。

    uint8 Buffer_CarID[5];//保存卡片卡号
    uint8 Buffer_Tmp[16];
    void main(void)
    {
		Hal_Init_32M();//初始化32M时钟
		OLED_IIC_Init();//初始化OLEDIIC
		OLED_Init();//初始化OLED
		RC522_Init();//初始化RFID芯片
		
		/*显示标题及默认值*/
		OLED_P8x16Str(0,0,"     HF_RFID   ");
		sprintf((void*)&Buffer_Tmp[0],"ID:XX XX XX XX",Buffer_CarID[0],Buffer_CarID[1],Buffer_CarID[2],Buffer_CarID[3]);
		OLED_P8x16Str(0,4,&Buffer_Tmp[0]);//OLED显示
		while(1){
			if(IC_Card_Search(&Buffer_CarID[0])){//读取卡信息
				/*将卡号转成字符器*/
				sprintf((void*)&Buffer_Tmp[0],"ID:%02X %02X %02X %02X",
				Buffer_CarID[0],Buffer_CarID[1],Buffer_CarID[2],Buffer_CarID[3]);
				OLED_P8x16Str(0,4,&Buffer_Tmp[0]);//OLED显示
				}
		    }
        }
	}

通过调用IC_Card_Searc()函数,传入保存卡号的数组,当读到卡号IC_Card_Searc()返回1,卡号保存了Buffer_CarID数组中。

    if(IC_Card_Search(&Buffer_CarID[0])){//读取卡信息
		/*将卡号转成字符器*/
		sprintf((void*)&Buffer_Tmp[0],"ID:%02X %02X %02X %02X",
		Buffer_CarID[0],Buffer_CarID[1],Buffer_CarID[2],Buffer_CarID[3]);
		OLED_P8x16Str(0,4,&Buffer_Tmp[0]);//OLED显示
	}
  1. 弹出警告窗口,不能下载程序。
    • 请确认CCDebugger驱动否安装。
    • 轻按CCDebugger仿真器的按键,指示灯不是绿色连接有问题。
    • CCDebugger仿真器是否正常接入到底座,参考实验步骤第一步。
  2. 下载代码后程序没观察到实验现象。
    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。
  3. 卡号读不出来。
    • 是否拿错卡片,HF_RFID的卡片正反两面均为空白。
  1. 显示屏显示最近三次输入的卡号,如果卡号相同只显示一次。