
常用 NFC 卡片数据解析 ...... 矜辰所致前言我们已经学习完 NFC 基础知识也了解了 CH585 NFC 示例的基本流程我们可以使用示例进行读卡操作对于不同的卡片有不同的数据格式。本文我们就来演示一下如何通过示例判断不同类型的卡片以及介绍一下常用 NFC 卡片的数据格式。相关博文NFC 基础知识汇总.我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、卡类型判断二、M1 卡数据解析三、NTAG21x 卡数据解析3.1 Type 2 Tag 必要的说明3.2 卡片容量的说明3.3 卡数据解析3.4 Type 2 Tag 类卡片对比结语一、卡类型判断只要是 ISO 14443-A 类型的卡都会有 ATQA 和 SAK。即便读取不到卡片的数据我们也可以通过日志判断卡片的类型 。示例会打印读到的这两个值CARD DETECT ATQA:0x0004uid:c363d35e select OK,SAK:08卡类型常见组合如下卡类型ATQASAK说明预留MIFARE Classic 1KM1 S5000 0408国内最常用4 字节 UIDMIFARE Classic 4KM1 S7000 0218MIFARE Classic Mini00 0409Type 2 标签 (Ultralight/NTAG21x)00 4400这是一个大类系列MIFARE Classic 1K7字节 UID00 4408这里只列举最常见的组合其他类型的后期如果有遇到再来补充 。我们根据 ATQA 和 SAK 可以初步判断卡片的大类吗对于有些卡片还需要更多的信息判断距离类型比如 Type 2 标签系列本文后面会有讲解。二、M1 卡数据解析通过之前的学习我们应该知道示例能够读取到的数据的卡只有两种ATQA 为 0x0004 的 S501KB16扇区×4块ATQA 为 0x0002 的 S704KB40扇区比如我们实际测试一张 M1读到的数据如下示例代码通过串口会有日志输出ATQA:0x0004uid:c363d35e select OK,SAK:08Auth60,addr:0block00:c363d35e2d08040004de326b2c da1590block01:00000000000000000000000000000000block02:00000000000000000000000000000000block03:000000000000ff078069ff ff ff ff ff ff Auth60,addr:4read:block04:00000000000000000000000000000000block05:00000000000000000000000000000000block06:00000000000000000000000000000000Auth60,addr:8read:block08:00000000000000000000000000000000block09:00000000000000000000000000000000block10:00000000000000000000000000000000数据说明Block 0 制造商块只读 UID、SAK、ATQA、厂商数据——卡的身份证。Block 0 前 8 字节的布局是 M1 协议规定的固定格式UID[4] BCC[1] SAK[1] ATQA[2] 厂商自定义[8]Block 1-2 用户数据块用户数据块 全 00 → 这张卡没存任何应用数据。Block 3 管理块密钥 权限控制 。每个扇区都有自己的 Block 3它管两件事① 本扇区两把钥匙KeyA/KeyB② 本扇区 4 个块各自的读/写权限改坏了这一块 会导致 整个扇区锁死。所以示例代码后面扇区只读 0/1/2 块。格式如下Key A[6] 访问控制位[3] GPB[1] Key B[6] 16 字节这里再配上几张图片更直观的说明数据格式首先是 Block 0 接着是 Block 3三、NTAG21x 卡数据解析3.1 Type 2 Tag 必要的说明要读取 NTAG21x 卡我们需要使用 NTAG21x 例程。然后呢需要再次说明的是 Type 2 Tag 是一套 NFC Forum 的标签通信/存储访问规范MIFARE Ultralight、NTAG21x 等芯片都可以实现这套 Type 2 Tag 体系ISO/IEC 14443-A↓Type 2 Tag│├── MIFARE Ultralight├── MIFARE Ultralight EV1├── MIFARE Ultralight C├── NTAG210├── NTAG212├── NTAG213├── NTAG215└── NTAG216它们实际上数据格式差不多遵循同一套 Type 2 页格式UID 2 页 锁 1 页 CC 1 页 数据区区别只是页数多少和尾部配置。对于这些系列的标准文档可参考 NXP 的标准文档NTAG213/215/216:https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdfNTAG210/212:https://www.nxp.com/docs/en/data-sheet/NTAG210_212.pdfMIFARE Ultralight EV1:https://www.nxp.com/docs/en/data-sheet/MF0ULX1.pdf3.2 卡片容量的说明NTAG21x 示例中是根据 storage_size 去判断卡片的类型这里也单独说明一下。示例中#defineNTAG213_STORAGE_SIZE0x0f#defineNTAG215_STORAGE_SIZE0x11#defineNTAG216_STORAGE_SIZE0x13是如何根据这个值去判断卡片类型的呢首先 NXP 官方定义 storage_size 编码规则如下最高 7 bit → 一个无符号整数 n最低 1 bit → 表示容量是“刚好等于 2^n”还是“处于 2^n ~ 2^(n1) 之间”/当最低位 0 时用户内存 2^n当最低为 1 时用户内存介于 2^n 和 2^(n1) 之间比如 storage_size 读到 0x110x11 0001 00010001000 | 1高7位 8 最低位12^8 2562^9 512所以 0x11 表示用户内存在 256 ~ 512 Bytes 之间然后官方手册明确规定不同卡片的内存大小文档标题都有所以 0x11 就对应 NTAG215 类型的卡这样 storage_size 和 卡片类型就关联起来了。3.3 卡数据解析下面使用一张卡片读取的例子说明数据格式adc_value:2514CARD DETECT ATQA:0x0044uid:04d7 e11a955b80SELECT OK,SAK:00GetVersion OK fixed_header:0x00vendor_id:0x04product_type:0x03product_subtype:0x01major_product_version:0x01minor_product_version:0x00storage_size:0x0bprotocol_type:0x03CARD CHIP:UNKNOWN SIG:0x420x2b0x090x660x220x6d0x940xf70x330x140x730x220x570xe50x030x790xe70xd90xcc0xc50x300xe90x6d0x460x330xbc0xf30x4e0xf50x5f0xaf0x32PAGE0-3:0x040xd70xe10xba0x1a0x950x5b0x800x540x480x000x000x000x000x000x00PcdNTAG21xReadCNT:0x0001通过 GetVersion 信息我们可以得到如下信息00 04 03 01 01 00 0B 03从左到右00 Fixed Header 固定头04 NXP Semiconductors03 MIFARE Ultralight 家族01 Product Subtype 输入电容档位01 EV1 主版本00 V0 次版本号0B Storage Size 48字节用户内存(25~26之间)03 ISO/IEC 14443-3所以这张卡信息为字段值含义ATQA0x00447字节 UID 的 Type A 卡SAK0x00Type 2 标签不支持 TCLUID04 d7 e1 1a 95 5b 807字节首字节 04 NXP 厂商芯片型号MF0UL1101MIFARE Ultralight EV1product_type0x03(Ultralight) storage_size0x0B(48字节)接下来 SIG 为原厂签名32字节ECC 原始性签名每张卡唯一配合 NXP 公钥做防伪验真 。再后面就是我们卡片的数据 PAGE 0 - 3 页0: 04 d7 e1 BA ← SN0 SN1 SN2 BCC0页1: 1a 95 5b 80 ← SN3 SN4 SN5 SN6页2: 54 48 00 00 ← BCC1 Internal Lock0 Lock1页3: 00 00 00 00 ← OTP × 4其中 Page 0 Page 1 UID 区域7字节 BCC04 d7 e1 ← UID[0:3]Page 0 前 3 字节ba ← BCC01a 95 5b 80 ← UID[3:7]Page 1 全部 4 字节uid: 04 d7 e1 1a 95 5b 80其中的 BCC0 的计算BCC0 0x88 ^ SN0 ^ SN1 ^ SN2 0x88 ^ 04 ^ d7 ^ e1 0xBA接下来看 Page 2 54 ← BCC1第二校验字节48 ← Internal EV1 标识00 ← Lock byte 000 ← Lock byte 1 —— 全 0 无任何页锁定其中的 BCC1 的计算BCC1 SN3 ^ SN4 ^ SN5 ^ SN6 1a ^ 95 ^ 5b ^ 80 0x54接下来看 Page 3 对于 MF0UL11这里是 OTP One-Time Programmable 区域。OTP 的特点写入只能把 bit 从 0 变成 1位一旦写 1 不可回 0。对于 NXP MIFARE Ultralight EV1MF0UL11卡片NXP 官方定义MF0UL11 总共 20 pages每页 4 bytes其中 48 字节用户区Page 4 ~ 15他的数据格式如下Page 0:UID0 UID1 UID2 BCC0Page 1:UID3 UID4 UID5 UID6Page 2:BCC1 Internal Lock0 Lock1Page 3:OTPPage 4 ~ 15:User Memory12 pages × 4 Bytes 48 BytesPage 16 (10h):Configuration 0CFG0Page 17 (11h):Configuration 1CFG1Page 18 (12h):PWD32-bit PasswordPage 19 (13h):PACK16-bit Password Acknowledge上面我们给出的打印中只能读到 PAGE 0 - 3 的数据后面的用户数据读不出来这是因为MF0UL11 总 EEPROM 是 20 页示例代码里面读取后面数据的语句为res PcdNTAG21xFastRead(4, 35, ntag_page_data);读越界了卡返回 NAK 错误示例是为 NTAG21345 页0~44设计的。NTAG213 的用户数据区是页 4~35所以 FastRead(4, 35) 刚好读完全部用户数据NTAG215/6 数据更大也可以正常读取 。所以为了读取这种卡片我们可以直接在修改一下示例如下resPcdNTAG21xFastRead(4,15,ntag_page_data);if(resPCD_NO_ERROR){PRINT(PAGE 4 - 15:);//....再次读取测试结果如下3.4 Type 2 Tag 类卡片对比经过前面测试我们应该对此类型卡片有一定的认识这里最后上一张 Type 2 Tag 类型对比表格大家看起来应该就比较容易看懂芯片型号总页数总 EEPROM用户内存用户页UIDGET_VERSION典型用途MIFARE Ultralight (MF0ICU1)1664 B48 B页 4~1512页7 B❌ 不支持一次性票务MIFARE Ultralight C (MF0ICU2)48192 B144 B页 4~3936页7 B❌ 不支持需认证的票务MIFARE Ultralight EV1 MF0UL112080 B48 B页 4~1512页7 Btype03h, size0Bh票务/活动卡MIFARE Ultralight EV1 MF0UL2141164 B128 B页 4~3532页7 Btype03h, size0Eh票务/活动卡NTAG2102080 B48 B页 4~1512页7 Btype04h低成本 NFC 标签NTAG21241164 B128 B页 4~3532页7 Btype04h通用 NFC 标签NTAG21345180 B144 B页 4~3936页7 Btype04h, size0Fh主流 NDEF 标签NTAG215135540 B504 B页 4~129126页7 Btype04h, size11hAmiibo / 大容量标签NTAG216231924 B888 B页 4~225222页7 Btype04h, size13h名片 / 大容量 NDEF结语本文我们通过实际读卡的数据分析了一下常用 NFC 卡片的数据结构 大家在实际应用的时候应该知道如何通过读到的信息判断自己测试的卡片类型 。到目前位置我们还没有学习如何写卡虽然示例中提供了写卡的函数但是在一般的应用中基本都是读卡所以如果博主后期遇到写卡的需求应用再来补充把那么接下来博主就要准备之前提到的 NFC 天线设计以及匹配电路的调节相关的文章了。好了本文就到这里。谢谢大家