ISO14443-4块传输协议的实现
ISO1444-3块传输协议主要用于应用数据的传输,其实现如下:
unsigned char Apdu(unsigned char *comm,unsigned short len,unsigned char *resp,unsigned short *rlen)
{
unsigned char IPCB;
unsigned ;
unsigned char OPCB;
unsigned ];
unsigned ];
unsigned short outlen;
unsigned short inlen;
unsigned char temp;
unsigned ,OutOffSet=;
unsigned ;
unsigned short stemplen=len;
unsigned char RfMlen;
unsigned ;
unsigned ;
*rlen =;
RfMlen= Frame_Data_Len_Rf--(unsigned char)RCid_En;
)
{
)
{
OPCB = RCid_En?0X0A:0x02;
OPCB =(stemplen>RfMlen)?(OPCB|0X10):OPCB;
OPCB = OPCB|rblock_num;
otempbuf[] = OPCB;
otempbuf[] = RCID;
xtemplen = (stemplen>=RfMlen)?RfMlen:stemplen;
memcpy(&otempbuf[(unsigned ],&comm[OutOffSet],xtemplen);
outlen = xtemplen + + (unsigned char)RCid_En;
}
// PutDatUart(otempbuf,outlen);
temp = I_Block(otempbuf,(unsigned char)outlen,itempbuf,&inlen);
// PutDatUart(itempbuf,inlen);
)
{
tcount++;
)
{
*rlen = ;
return temp;
}
otempbuf[] =RCid_En?(0XBA|rblock_num):(0XB2|rblock_num);
otempbuf[] = RCID;
outlen = +(unsigned char)RCid_En;
Flag = ;
}
else
{
tcount = ;
IPCB=itempbuf[];
if((IPCB&0XC2)==0X02) //i-block
{
if((IPCB&0x01)==rblock_num)
{
rblock_num=!rblock_num;
)
{
templen = inlen--(unsigned char)RCid_En;
memcpy(&resp[InOffSet],&itempbuf[(unsigned ],templen);
InOffSet = InOffSet + templen;
*rlen = InOffSet;
return RF_OK;
}
else
{
templen = inlen--(unsigned char)RCid_En;
memcpy(&resp[InOffSet], &itempbuf[(unsigned ],templen);
InOffSet = InOffSet + templen;
//ACK
otempbuf[] =0XA2|rblock_num;
otempbuf[] =RCid_En?(otempbuf[]|];
otempbuf[] =RCID;
outlen = + (unsigned char)RCid_En;
Flag = ;
}
}
}
else if((IPCB&0XF2)==0XF2) //WTX
{
outlen = inlen;
memcpy(otempbuf,itempbuf,inlen);
Flag = ;
}
else if((IPCB&0XB2)==0XA2)// ack
{
if((IPCB&0x01)==rblock_num) //next frame
{
rblock_num = !rblock_num;
OutOffSet = OutOffSet+xtemplen;
stemplen = stemplen -xtemplen;
}
Flag = ;
}
else
{
tcount++;
) return FM_OVERTIME;
if((IPCB&0X10)==0X00)
{
otempbuf[] =0XB2|rblock_num;
}
else
{
otempbuf[] =0XA2|rblock_num;
}
otempbuf[] = RCid_En?(otempbuf[]|];
otempbuf[] = RCID;
outlen = + (unsigned char)RCid_En;
Flag = ;
}
}
}
}
unsigned char I_Block(unsigned char *comm,unsigned char len,unsigned char *resp,unsigned short *rlen)
{
unsigned char temp, old_TimerReload;
unsigned int xtemp1;
old_TimerReload=TimerReload;
]&0xf7)==0xf2)
{
temp=(comm[]&]:comm[];
&& temp<)
{
xtemp1=TimerReload*temp;
)
{
TimerReload=;
}else
{
while(TimerReload!=(unsigned char)xtemp1)
TimerReload=(unsigned char)xtemp1;
}
while(TimerReload!=(unsigned char)xtemp1);
}
}
temp = CmdSend(len, comm, Transceive);
TimerReload=old_TimerReload;
if (temp == FALSE)
{
return OVERTIME;
}
temp = ErrorFlag;
if ((temp & 0x02) == 0x02)
return PARITYERR;
if((temp & 0x04) == 0x04)
return FRAMINGERR;
if ((temp & 0x08) == 0x08)
return CRCERR;
*rlen=Read_FIFO(resp);
return OK;
}
unsigned char CmdSend(unsigned char count,unsigned char * buff,unsigned char Comm_Set)
{
unsigned char temp;
unsigned char ctemp1;
unsigned long cj;
unsigned short near atime1,atime2;
Command = Idle_Command;
Clear_FIFO();
Int_Req=0x7f;
)
{
Write_FIFO(count, buff);
}
; cj< RF_Time2; cj++) //延时500ms
{
) break;
}
))
return HARDWARE_ERR;
Command = Comm_Set; //命令执行
; cj< TIMEDELAY; cj++) //至少延时5s
{
temp = Command;
ctemp1 = Int_Req;
if(temp == 0x00 || (ctemp1 & 0x0C)) return TRUE;
else if((ctemp1&0x20)==0x20) return FALSE;
}
return FALSE;
}
实现本功能需要注意到是rblock_num属于全局变量,在RATS中被初始化为0
Frame_Data_Len_Rf在RATS中被初始化为最大帧长度
RCid_En根据RATS中的参数确定为支持CID或者不支持CID
ISO14443-4块传输协议的实现的更多相关文章
- ISO7816协议的块传输协议
1.块传输协议中的前三个字节是强制必须有的 NAD节点地址: 当终端支持多个卡槽,终端和这些卡槽以总线的方式通讯时,该字节有用,其他情况下,默认为0 bit1-3:定义了源地址 bit5-7:定义了目 ...
- IC卡的传输协议(2)-块传输协议T=1【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172024.HTM 2.4 块传输协议T=1 T=1协议中,在TAL和IC卡之间传送的命令.R-APDU和传输控制信息 ...
- IC卡的传输协议(2)-块传输协议T=1续【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172025.HTM (3)容错操作 先来看一下容错的规则定义. * 复位应答后,第一个数据块是由终端发往IC卡的,而且 ...
- PBOC第八部分和第十一部分关于TYPEA总结(二)——传输协议(ISO14443-4)
二.传输协议(ISO14443-4)(8,P50 11,P30) 1.选择应答请求(RATS) 使用RATS命令和PICC协商通讯的最大帧长度(FSD和FSC).帧等待时间(FWT)和启动帧保护时间( ...
- ISO7816 传输协议 T0 T1
T=0协议不能用一条命令来实现,必须分为两步实现:第一条命令为卡片提供数据,然后用另外一条相关的命令来取回数据.这样给卡片的编程带来很大麻烦,同时卡片内存中必须保留上一次操作需要返回的数据.这时如果不 ...
- 智能IC卡与终端(读卡器)之间的传输协议
1.有两种协议 T=0,异步半双工字符传输协议 T=1,异步半双工块传输协议 终端一般都支持这两种协议,IC卡可以选择支持其中的一种.(因为终端可能需要面对各种类型的卡片,所以必须两种协议都支持,而卡 ...
- IC卡的传输协议(1)-字符传输协议T=0【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172022.HTM 在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程. 在 ...
- Bulk-Only传输协议 UFI命令块规范
USB设备分为5大类,即显示器.通信设备.音频设备.人机输入和海量存储.通常所用的U盘.移动硬盘均属于海量存储类.海量存储类的规范中包括4个独立的子规范,即CBI传输.Bulk-Only传输.ATA命 ...
- HTTP超文本传输协议-HTTP/1.1中文版
摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...
随机推荐
- Excel导入数据库(三)——SqlBulkCopy
上篇博客中介绍了批量导入数据库的方法:下面介绍一下批量导入过程的核心——SqlBulkCopy类. 下面先介绍一些原理性的东西:SQLBulkCopy类,通常用于数据库之间大批量的数据传递.即使表结构 ...
- Java 判断一段网络资源是否存在
package cn.ycmedia.common.utils; import java.io.InputStream; import java.net.URL; import java.net.UR ...
- media screen 响应式布局(知识点)
一.什么是响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端--而不是为每个终端做一个特定的版本.这个概念是为解决移动互联网 ...
- 【sql进阶】SQL Server 将某一列的值拼接成字符串
今天在统计报表的时候有这么一个需求,将一列字符串拼接成一行,然后展示到新的列中. 每一项的服务列表如下: 最终想要的结果是 sql如下: select AuxTypeName + ',' from ( ...
- 强迫症和拖延症患者如何应对马桶4(遨游Maxthon)“上次未关闭页面”丢失的问题
强迫症和拖延症患者如何应对马桶4(遨游Maxthon)“上次未关闭页面”丢失的问题 用了马桶好多年,虽然一直bug不断,经常假死丢数据坑爹什么的,但是总得来说还是略有感情,不忍舍弃. 马桶一直有一个好 ...
- HDU - 4815 Little Tiger vs. Deep Monkey (长春赛区C题)
题意:有A,B两个人.n道题目.每题有相应的分数.B答对题目的概率是0.5.求A不输给B的概率不小于P要拿的最低分数 思路:DP,dp[i][j]来表示B答了前i题后分数为j的概率,,然后通过B的概率 ...
- Android中View和ViewGroup介绍
1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGro ...
- android圆角View实现及不同版本这间的兼容
在做我们自己的APP的时候,为了让APP看起来更加的好看,我们就需要将我们的自己的View做成圆角的,毕竟主流也是将很多东西做成圆角,和苹果的外观看起来差不多,看起来也还不错. 要将一个View做成圆 ...
- Eclipse debug经常使用基本技巧
1.F5单步调试,步入,进入函数体内部 2.F6单步调试.步过.不进入函数体 3.F7返回 4.F8运行到最后 5.退出时.右键点击右上角Debug选择退出就可以 $(function () { $( ...
- [转] 条件变量(Condition Variable)详解
http://www.wuzesheng.com/?p=1668 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A ...