RC531的FIFO有64字节缓冲区,如果需要从CPU卡读的数据大于64字节,那么就需要采用链接方式。比如选择CPU卡的某个目录后,CPU卡会发送该目录的公共信息,共84个字节。这84个字节我们分成2块传输。设置读卡器能收到的1帧的最大长度是48字节。
下面是RATS命令介绍:
选择应答请求(RATS)
使用RATS命令和PICC协商通讯的最大帧长度(FSD和FSC)、帧等待时间(FWT)和启动帧保护时间(SFGT)。
RATS命令使用带有CRC_A的标准帧进行传输
格式 开始字节+参数(FSDI和CID)(1个字节) +CRCA16
(1)开始字节 E0
参数高4位 FSDI,它用于编码FSD。FSD定义了PCD能收到的帧的最大长度。 一般为5,64字节
低4位 CID ,它定义编址了的PICC的逻辑号在0到14范围内。值15为RFU。
CID由PCD规定,并且对同一时刻处在ACTIVE状态中的所有PICC,它应是唯一的。
CID在PICC被激活期间是固定的,并且PICC应使用CID作为其逻辑标识符,它包含在接收到的第一个无差错的RATS。
PCD设置CID为0表示每次仅支持对一张PICC进行定位。一般为1,
所这参数这个字节普通设置为51。
因为我们要设置成一帧48字节,所以E0命令后的参数应该设置为41.
以下是读卡器和CPU卡通讯协议的介绍:
半双工块传输协议
半双工块传输协议符合无触点卡环境的特殊需要
块格式,由一个头域(必备)、一个信息域(可选)和一个尾域(必备)组成
PCD发送的块的总长度应小于或等于FSC(FSC在协议安装时由PICC指定)
(1) 头域
最多由三个字节构成:协议控制字节PCB(必备); 卡标识符CID(可选); 结点地址NAD(可选)。
(2)协议控制字节域PCB
PCB用于传送控制数据传输所需要的信息。
协议定义了块的三种基本类型:
——用于为应用层的使用传送信息的信息块(I-块);
——用于传送确认或不确认的接收准备块(R-块)。R-块不包含INF域。确认涉及最后接收到的块;
——用于在PCD和PICC间交换控制信息的管理块(S-块)。两种不同类型的S-块定义如下:
● 包含1字节长INF域的等待时间延迟,和
● 不包含INF域的DESELECT
(3)卡标识符CID
CID域用于识别特定的PICC,它由三部分组成:
——最高有效位b8,b7用于从PICC到PCD的功率水平指示。对于PCD到PICC的通信,这两位应被置为0。、
——位b6和b5用于传送附加信息,它没有被定义并应置为(00)b,所有其他值为RFU;
——位b4到b1编码CID。
(4)结点地址域NAD
在头域里的NAD被保存用于建立和编址不同的逻辑连接。当位b8和b4被置为0时
下列定义应适用NAD的用途:
——NAD域应仅用于I-块;
——当PCD使用NAD时,PICC也应使用NAD;
——在链接期间,NAD仅在链的第一个块内传输;
——PCD应不使用NAD编址不同的PICC(CID应被用于编址不同的PICC);
——当PCD不支持NAD时,应忽略任何包含NAD的块。
(5)信息域
信息域是可选的。当出现在I块中时,信息域传送的是应用数据,当出现在S块中时,它传送的是非应用数据和状态信息。信息域的长度可以通过计算整个块的长度减去头域和尾域的长度来得到。
(6)尾域
该域包含传输块的EDC。EDC为第7章中定义的CRC。
每个设置链接位的I块必须用R(ACK)块确认
当PCD发送一组链接的I块,每个指示了链接的块的大小应等于FSC
(7)帧等待时间(FWT)
FWT给PICC定义了在PCD帧结束后开始其响应帧的最大时间
注:在任何方向上两个帧之间的最小时间在第7章中定义。 FWT通过下面的公式计算: FWT=(256×16/fc)×2FWI
其中FWI的值在0到14之间,15为RFU。对于Type A,若TB(1)被省略,则FWI的缺省值为4,
给出的FWT值约为4.8ms。
对于FWI=0,FWT= FWTMIN (~302μs)
对于FWI=14,FWT= FWTMAX (~4949μs)
FWT应用于检测传输差错或无响应的PICC。如果来自PICC的响应的开始没有在FWT内被接收到,则PCD收回发送的权利。
(8)帧等待时间扩展
当PICC需要比定义的FWT更多的时间用于处理接收到的块时,应使用S(WTX)请求等待时间扩展。S(WTX)请求包含1字节长INF域,它由两部分组成(见图57):
——最高有效位b8,b7编码功率水平指示(见8.3.4);
——最低有效位b6到b1编码WTXM。WTXM在1到59范围内编码。值0和60到63为RFU。
PCD应通过发送包含1字节长INF域的S(WTX)来确认,该INF域由两部分组成,并包含了与在请求中接收到的相同的WTXM:
——最高有效位b8,b7为(00)b,所有其他值为RFU;
——最低有效位b6到b1编码了用于定义临时FWT的确认的WTXM值。
FWT的响应的临时值通过下面的公式计算: FWTTEMP= FWT×WTXM PICC需要的时间FWTTEMP在PCD发送了S(WTX)响应之后开始。 当公式得出的结果大于FWTMAX时,应该使用FWTMAX。 临时FWT仅在下一个块被PCD接收到时才应用
(9)功率水平指示
功率水平指示通过使用插入在CID(当存在时)中的两位来编码,并在S-块中被PICC发送
(00)b PICC不支持功率水平指示
(01)b 对于完整功能性,功率不充分
(10)b 对于完整功能性,功率充分
(11)b 对于完整功能性,功率超出
读卡器发送命令给CPU卡时,前面两个字节一般为0A 01或0B 01,参照图52可知,0A/0B开头的数据是信息块,后面没有链接块,01是CID,0A开头的数据块号是0,0B开头的数据块号是1.
我们先发送选择目录命令,选择CPU卡目录DF03
0A 01 00 A4 00 00 02 DF 03
目录的公共信息数据大于48字节,CPU卡首先会发送48字节数据给读卡器
1A 01
6F 52 84 0F D1 56 00 00 01 BD F0 CA CB B4 EF D6 A7 B8 B6 A5 3F 9F 08 01 02 9F 0C 38 00 00 00 00 00 00 00 00 27 88 30 30 30 30 30 30
上面的数据总共是46字节,还有2字节的校验数据应该是被RC531芯片校验后丢弃,没放进FIFO中。所以CPU卡总共发送了46+2=48字节数据,和前面在RATS命令里设置的参数一致。
其中1A表示这是一个信息块,参照图52可知,表示这个信息块后面有链接块,CID是01.块号是0.
读卡器要继续从CPU卡读取数据,需要发送一个R(ACK)块给CPU卡。读卡器发送数据如下:
AB 01
AB表示这是一个R(ACK)块,后面跟随CID-01,块号切换为1.这是协议规定的,PCD每发送一个块,块号都需要切换,如果发送AA 01,CPU卡不会继续发送数据。
CPU卡收到ACK后,发送数据
0B 01
33 35 00 00 00 20 15 12 23 00 00 02 00 00 00 00 00 00 20 00 00 00 00 00 20 16 05 31 00 00 00 00 00 00 01 00 00 00 00 00 90 00
总共44字节,加上2字节校验位,总共收到了CPU卡发送的46字节数据。
0B表示CPU卡的数据已经发完,后续没有链接块,信息块的块号是1,和读卡器发送的块号对应。
因为我们定义一个帧最大是48字节,所以可以设置RC531的fifo接收48字节后溢出报警。
链接块示意图如下:










