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)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...
随机推荐
- adb logcat命令查看并过滤android输出log
cmd命令行中使用adb logcat命令查看android系统和应用的log,dos窗口按ctrl+c中断输出log记录. logcat日志中的优先级/tag标记: android输出的每一条日志都 ...
- python获取网络时间和本地时间
今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- MongoDB与传统数据库的使用区别——批量插入与批量查询
我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型. 我的回答是:不行,因为MongoDB不是 ...
- 定制属于自己的Chrome起始页
个人感觉没什么技术含量,可是很有用.我定制的起始页面例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ19saWNodW4=/font/5 ...
- 实现自己的cp命令
1 综述 在Unix和Linux系统里,cp是经常使用的一个命令,用于复制文件,用法如下: $cp src_file dest_file 以下就使用若干系统调用来实现自己的cp. 2 原理 open: ...
- SPOJ 3048 - DNA Sequences LCS
给出两个字符串(不长于1000),求最长公共子序列,要求:从每个串中取必须取连续k (1<=k<=100)个数 [LCS]一开始自己想用DP加一维[len]用来表示当前已经取了连续len个 ...
- Html5 Canvas Text
html5 canvas中支持对text文本进行渲染;直接的理解就是把text绘制在画布上,并像图形一样处理它(可以加shadow.gradient.pattern.color fill等等):既然它 ...
- 关于异常的疑难解答:System.Runtime.InteropServices.COMException
COMException exception is thrown when an unrecognized HRESULT is returned from a COM method call.&qu ...
- (Error) The type AESKeyGenerator is not accessible due to restriction on required library.
error for 'Access restriction: The type AESKeyGenerator is not accessible due to restriction on requ ...
- expdp 备份数据库-附带报错信息
操作系统层面创建目录 [root@Oracle11g ~]# mkdir -p /home/oracle/db_back/ 修改目录的所属用户.所属组 [root@Oracle11g ~]# chow ...