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)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...
随机推荐
- Java model 对象处理
public class BaseFlowBo { /** * 流量 */ private String flow; /** * Pv */ private String pv; /** * CTR ...
- Android 图片选择器
图片选择器,遍历系统所有图片并显示,点击查看大图,长按选中,并将结果返回 字体颜色res/color建立text_selecor.xml <selector xmlns:android=&quo ...
- InnoDB主要数据结构及调用流程
InnoDB主要数据结构及调用流程 InnoDB是MySQL中常用的数据引擎.本文将从源码级别对InnoDB重点数据结构和调用流程进行分析. 主要数据结构(buf0buf.h) Buf_pool Bu ...
- Qt 学习之路 :自定义只读模型
model/view 模型将数据与视图分割开来,也就是说,我们可以为不同的视图,QListView.QTableView和QTreeView提供一个数据模型,这样我们可以从不同角度来展示数据的方方面面 ...
- vs2008试用期到期解决办法
vs2008试用期结束之后, 在“控制面板”中启动“添加删除程序”, 选中Vs2008,点击“更改.删除”, 在出现的维护模式对话框中, 选择下一步,输入下面的CD-Key ...
- [转] C语言多维数组与多级指针
http://c.biancheng.net/cpp/html/477.html 多维数组与多级指针也是初学者感觉迷糊的一个地方.超过二维的数组和超过二级的指针其实并不多用.如果能弄明白二维数组与二级 ...
- xeam Build Definition Extension uninstall 卸载
之前在VS上装了Build definition 的扩展,后来发现很不好用,想卸载掉,就增 工具下面找add-in manager, 结果找不到,external tools下面也找不到, googl ...
- haproxy主配置文件
1.haproxy 配置文件 ------------------------------------------------------------------------------------- ...
- RxJava RxAndroid【简介】
资源 RxJava:https://github.com/ReactiveX/RxJava RxAndroid :https://github.com/ReactiveX/RxAndroid 官网:h ...
- java.lang.UnsupportedClassVersionError: Bad version number in .class file
java.lang.UnsupportedClassVersionError: Bad version number in .class file造成这种过错是ni的支撑Tomcat运行的JDK版本与 ...