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)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...
随机推荐
- mongoDb +Java+springboot
前言 :mongoDb 是一种比较常用的非关系数据库,文档数据库, 格式为json ,redis 有五种格式. 1. 项目中要使用,这里简单做个示例.首先是连接mongoDB,用的最多的robomon ...
- jquery.scrollTo-min.js
jquery.scrollTo-min.js 用户返回顶部及动画到目的地,支持目标值.锚点. 用法: 1.引入jQuery 2.$.scrollTo( this.hash || targetValue ...
- Meth | phpstorm invalid descendent file name
Failed to collect files: Invalid descendent file name "codelog_ddz.\"(]))\",\').txt& ...
- [转] linux系统文件流、文件描述符与进程间关系详解
http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括: ...
- getopt 分析命令行参数 -n -t 1
在Linux中,我们常常用到 ls -l 等等之类带有选项项的命令,下面,让我们用C++来实现该类似的命令. 在实现之前,首先,我们来介绍一下一个重要函数:getopt() 表头文件 #include ...
- iOS异步图片加载优化与常用开源库分析
网络图片显示大体步骤: 1.下载图片: 2.图片处理(裁剪,边框等): 3.写入磁盘: 4.从磁盘读取数据到内核缓冲区: 5.从内核缓冲区复制到用户空间(内存级别拷贝): 6.解压缩为位图(耗cpu较 ...
- Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twice
Eclipse项目中的混淆配置文件 复制到AS中 在混淆的过程中提示如下错误 Error:Execution failed for task ':app:proguardDemoRelease ...
- python之路,Day24 常用设计模式学习
python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...
- J2EE初探
J2EE概述 3层结构 4层模型 13项核心技术 J2EE容器 J2EE的优势与缺陷 J2EE概述 Java 2平台有3个版本,分别是适用于小型设备和智能卡的Java 2平台Micro版(Java ...
- iOS开发之四张图说明GCD(Grand Central Dispatch)附Test源码
首先,先介绍几个概念:GCD,队列,串行,并行,同步,异步. ...