【IoT】NFC 之 RC522 通信协议包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liwei16611/article/details/90265745

1、通讯格式

数据包长度 L(1byte) + 命令字 C(1byte) + 数据包 D(L-1bytes)

2、通讯方向

->  下位机送给上位机
<-  上位机送给下位机

3、扇区划分

扇区0    块0  块1  块2  块3
扇区1    块4  块5  块6  块7
扇区2    块8  块9  块10 块11
扇区3    块12 块13 块14 块15
扇区4    块16 块17 块18 块19
扇区5    块20 块21 块22 块23
扇区6    块24 块25 块26 块27
扇区7    块28 块29 块30 块31
扇区8    块32 块33 块34 块35
扇区9    块36 块37 块38 块39
扇区10   块40 块41 块42 块43
扇区11   块44 块45 块46 块47
扇区12   块48 块49 块50 块51
扇区13   块52 块53 块54 块55
扇区14   块56 块57 块58 块59
扇区15   块60 块61 块62 块63

4、IC 卡读写器数据包

1) 寻卡

   <-  02 02 26    ( 02 为命令字,26 为 RegMfOutSelect )
   ->  03 00 04 00 ( 00 为命令成功代码,04 表示 Mifare One 卡 )
   <-  02 0B 0F
   ->  01 00

2) 防冲突

   <-  01 03             ( 03 为命令字 )
   ->  05 00 52 00 75 7A ( 52 00 75 7A 为卡号 CardSerialNo )
   <-  02 0B 0F
   ->  01 00

3) 选择

   <-  01 04             ( 04 为命令字)
   ->  03 00 80 00
   <-  02 0B 0F
   ->  01 00

4) 终止

   <-  01 01             ( 01 为命令字)
   ->  01 00
   <-  02 0B 0F
   ->  01 00

5) 参数设置

   <-  01 0C             ( 0C 为命令字 )
   ->  01 00

6) 密码下载 ( 扇区 1 密码为 12 个 F )

   <-  09 06 60 01 FF FF FF FF FF FF (06为命令字,60为PICC_AUTHENT1A(61为PICC_AUTHENT1B),01为扇区号,12个F为密码)
   ->  01 00
   <-  02 0B 0F
   ->  01 00

7) 数据读(扇区1块0块1块2)

   <-  02 02 52          ( 02 为命令字,52 为 PICC_REQALL )
   ->  03 00 04 00       ( 04 为 RegFIFOLength )
   <-  01 03             ( 03 为命令字 )
   ->  05 00 52 00 75 7A ( 52 00 75 7A 为卡号 )
   <-  01 04             ( 04 为命令字 )
   ->  03 00 08 00 
   <-  04 05 60 01 04 (05为命令字,60为PICC_AUTHENT1A(61为PICC_AUTHENT1B),01为扇区1,04为RegFIFOLength)
   ->  01 00
   <-  02 08 04          ( 08 为命令号, 04 为块号 )
   ->  11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (16个00为数据)
   <-  02 08 05          ( 08为命令号, 05 为块号 )
   ->  11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (16个00为数据)
   <-  02 08 06          ( 08 为命令号, 06 为块号 )
   ->  11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (16个00为数据)
   <-  02 08 07          ( 08 为命令号, 07 为块号 )
   ->  11 00 00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff (第一个00为返回代码,后面6个00为密码A,ff 07 80 69为控制位,后面6个ff为密码B)
   <-  02 0B 0F
   ->  01 00

8) 数据写(扇区1块0块1块2)

   <-  12 09 04 12 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ( 09 为命令字, 04 为块号, 12 开始的 16 个字节为要写的数据 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00
   <-  12 09 05 45 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ( 09 为命令字, 05 为块号, 45 开始的 16 个字节为要写的数据 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00
   <-  12 09 06 78 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ( 09 为命令字, 06 为块号, 78 开始的 16 个字节为要写的数据 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00
   <-  12 09 07 11 11 11 11 11 11 ff 07 80 69 11 11 11 11 11 11 ( 09 为命令字, 07 为块号, 把密码 A 和密码 B 都修改成 1 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00

9) 块值操作 ( 初始化 )

   <-  12 09 04 11 11 11 11 EE EE EE EE 11 11 11 11 04 FB 04 FB ( 09 为命令字, 04 为块号, 11 开始的 16 个字节为要写的数据 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00

10) 块值操作 ( 读出 )

   <-  02 08 04 ( 08 为命令字, 04 为块号 )
   ->  11 00 11 11 11 11 EE EE EE EE 11 11 11 11 04 FB 04 FB ( 11 后面的 16 个自己是读出来的数据 )
   <-  02 0B 0F
   ->  01 00

11) 块值操作 ( 加值 )

   <-  08 0A C1 04 22 22 22 22 04 ( 0A 为命令字, C1 为 PICC_INCREMENT, 04 为块号, 4 个字节的 22 是要加值的数据, 04 为块号 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00
   

12) 块值操作 ( 减值 )

   <-  08 0A C0 04 11 11 11 11 04 ( 0A 为命令字, C1 为 PICC_DECREMENT 为块号, 4 个字节的 11 是要减值的数据, 04 为块号 )
   ->  01 00 
   <-  02 0B 0F
   ->  01 00

13) 修改密码

   <-  02 02 26 ( 02 为命令字, 26 为 RegMfOutSelect )
   ->  03 00 04 00 
   <-  01 03    ( 03 为命令字 )
   ->  05 00 52 00 75 7A (52 00 75 7A为卡号)
   <-  01 04    ( 04 为命令字 )
   ->  03 00 80 00 
   <-  04 05 60 01 04 ( 05 为命令字, 60 为 PICC_AUTHENT1A (61为PICC_AUTHENT1B), 01 为扇区号,04 为 RegFIFOLength )
   ->  01 00
   <-  12 09 07 33 33 33 33 33 33 ff 07 80 69 33 33 33 33 33 33 ( 09 为命令字, 07 为块号, 33 后面的 12 个字节为新密码 )
   ->  01 00
   <-  02 0B 0F
   ->  01 00

  

猜你喜欢

转载自blog.csdn.net/liwei16611/article/details/90265745