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)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...
随机推荐
- PHP学习之[第11讲]新浪微博开放平台 PHP 与 OAuth 接口(1)
我是下载的微博最新的API练习了一下认证过程.
- vue实现一个移动端屏蔽滑动的遮罩层
在扯废话浪费大家的时间之前,先上个代码好了,使用vue实现起来很简单-- <div class="overlayer" @touchmove.stop > </d ...
- Oracle MERGE INTO的使用方法
非常多时候我们会出现例如以下情境,假设一条数据在表中已经存在,对其做update,假设不存在,将新的数据插入.假设不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否 ...
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.on ...
- OpenStack Cinder源代码流程简析
版权声明:本博客欢迎转载,转载时请以超链接形式标明文章原始出处!谢谢! 博客地址:http://blog.csdn.net/i_chips 一.概况 OpenStack的各个模块都有对应的client ...
- 基于库zkclient 的leader选举代码实现
利用了zookeeper临时节点,在当连接或session断掉时被删除这一特性来做选举.(简单简单互斥锁) 查了下网上的做法. 大致流程: <1>判定是否存在/wzgtest路径 < ...
- Android(java)学习笔记217:开发一个多界面的应用程序之清单文件
清单文件的重要参数: <intent-filter> 代表的应用程序的入口界面 <action android:name=&quo ...
- JNI之本地线程进入c层
在JNI开发中有时候会遇到在c层创建小线程的情况.从本质来讲,java线程和c线程都是请求kerner获取的,只是一段执行序列.从这个角度看,线程并没有什么不同,java线程和c线程可以通用. 然而在 ...
- H.264视频在android手机端的解码与播放(转)
随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其 ...
- HDU5339
题意:给你数a和数组b,然后用a模b中的数,求至少模多少个才能使a==0 思路:直接模拟吧,首先排序,因为模最大的符合(比如2,3,6)然后遍历b,去模其他的所有数,直到为0,标记退出,否则继续遍历b ...