ISO14443-4块传输的实现(卡)
贴上自己的代码,目前测试通过,但我感觉结构不是很好,希望和大家交流共同提高。
.H文件
#define ACKN -1 #define ACKY -2 #define RESEND -3 #define ONSENDNEXT -4 #define SENDDEL -5 #define SENDWTX -6 #define DONOTHING -12 #define BLOCK_MASK 0XC0 #define IBLOCK 0X00 #define RBLOCK 0X80 #define SBLOCK 0XC0 #define NACK_MASK 0X10 #define CID_MASK 0X08 #define BNUM_MASK 0X01 #define WTX_DEL_MASK 0X30 #define LINK_MASK 0X10 #define WTX 0X30 #define DELSECT 0X00
.c文件
unsigned char near CCID;
unsigned char near Frame_Data_Len_Card;
unsigned char near currentflag;
unsigned ];
unsigned char near lastframelen;
unsigned ],CardBuffer[];
unsigned short near PBufferLength,PBufferPoint,CardBufPoint,CardBufferLength;
bit cblock_num,CCid_En;
unsigned char AckN(void)
{
unsigned ];
buf[] = 0XA2|cblock_num;
buf[] = CCid_En?buf[]|];
buf[] = CCID;
WriteCardFifo(buf,);
SetRecvOrSend(START_SEND_AND_RECV);
// PutDatUart(buf, 2);
return OK;
}
unsigned char AckY(void)
{
unsigned ];
cblock_num=!cblock_num;
buf[] = 0XA2|cblock_num;
buf[] = CCid_En?buf[]|];
buf[] = CCID;
WriteCardFifo(buf,(unsigned ));
// PutDatUart(buf, 2);
return SetRecvOrSend(START_SEND_AND_RECV);
}
char CardRecvFrameProcess(unsigned char *tempbuf,unsigned char inlen)
{
unsigned short near len;
unsigned char near PCB;
unsigned char near Cid;
unsigned char near lastflag = currentflag;
len = inlen;
)
{
return DONOTHING;
}
PCB = tempbuf[];
Cid = PCB&CID_MASK;
)&&(CCID!=)&&(Cid==)) || ((CCid_En==)&&(Cid==))) return DONOTHING;
if((PCB&BLOCK_MASK) ==IBLOCK)//i-block
{
if(PCB&CID_MASK)//带CID时,长度应该不少于2字节
{
) return DONOTHING;
}
else //不带CID时长度不应少于1个字节
{
) return DONOTHING;
}
if((PCB&0X02)!=0X02) return DONOTHING;
currentflag = PCB & LINK_MASK;
if(currentflag)
{
if(lastflag)
{
- (unsigned char)CCid_En)>BUFFERLENGTH)
{
PBufferLength=;
PBufferPoint =;
return DONOTHING;
}
memcpy(&PBuffer[PBufferPoint],&tempbuf[+(unsigned -(unsigned char)CCid_En);
PBufferPoint = PBufferPoint + len - - (unsigned char)CCid_En;
PBufferLength = PBufferLength + len - - (unsigned char)CCid_En;
}
else
{
PBufferPoint = ;
PBufferLength = ;
memcpy(&PBuffer[PBufferPoint],&tempbuf[+(unsigned -(unsigned char)CCid_En);
PBufferPoint = PBufferPoint + len - - (unsigned char)CCid_En;
PBufferLength = PBufferLength + len - - (unsigned char)CCid_En;
}
return ACKY;
}
else
{
if(lastflag)
{
- (unsigned char)CCid_En)>BUFFERLENGTH)
{
PBufferLength=;
PBufferPoint =;
return DONOTHING;
}
memcpy(&PBuffer[PBufferPoint],&tempbuf[+(unsigned -(unsigned char)CCid_En);
PBufferPoint = PBufferPoint + len - - (unsigned char)CCid_En;
PBufferLength = PBufferLength + len - - (unsigned char)CCid_En;
}
else
{
PBufferPoint = ;
PBufferLength = ;
memcpy(&PBuffer[PBufferPoint],&tempbuf[+(unsigned -(unsigned char)CCid_En);
PBufferPoint = PBufferPoint + len - - (unsigned char)CCid_En;
PBufferLength = PBufferLength + len - - (unsigned char)CCid_En;
}
return FM_OK;
}
}
else if((PCB&BLOCK_MASK) ==RBLOCK) //rblock
{
if(PCB&CID_MASK)//带CID时,长度应该不少于2字节
{
) return DONOTHING;
}
else //不带CID时长度不应少于1个字节
{
) return DONOTHING;
}
if((PCB&0X40)==0X00) return DONOTHING;
if(PCB&NACK_MASK)
{
if((PCB&BNUM_MASK)!=cblock_num)
{
return ACKN;//表示重发NAK,因帧号不对
}
else
{
return RESEND; //表示重发上一帧
}
}
else //ack
{
if((PCB&BNUM_MASK)!=cblock_num)
{
return SENDNEXT; //表示继续发下一帧
}
else
{
return RESEND; //表示重发上一帧
}
}
}
else if((PCB&BLOCK_MASK) ==SBLOCK) //sblock
{
if((PCB&0X04)!=0X00) return DONOTHING;
if((PCB&WTX_DEL_MASK)==DESELECT)
{
if(PCB&CID_MASK)
{
if(len!=0x02) return DONOTHING;
else return SENDDEL;
}
else
{
if(len!=0x01) return DONOTHING;
else return SENDDEL;
}
}
else if((PCB&WTX_DEL_MASK)==WTX)
{
if(PCB&CID_MASK)
{
if(len!=0x03) return DONOTHING;
else return SENDWTX;
}
else
{
if(len!=0x02) return DONOTHING;
else return SENDWTX;
}
}
else
{
return DONOTHING;
}
}
else
{
return DONOTHING;
}
}
char CardCosInsProcess()
{
Timer0Delay(FIFTY_MINISECOND); //这个时间根据卡返回的ATS中的参数确定,默认为4.8ms,在定时器中断中发WTX,并禁止再次中断,停止定时器
EnableTimer0Int();
StopTimer0();
return OK;
}
char CardSendFrameProcess(char STA)
{
unsigned ];
unsigned char near len;
char near Sta=STA;
unsigned -(unsigned ;
//WTimeS = 0;
switch(Sta)
{
case ACKY:
AckY();
break;
case ACKN:
AckN();
break;
case RESEND:
memcpy(tempbuf,lastframe,lastframelen);
WriteCardFifo(tempbuf,lastframelen);
SetRecvOrSend(START_SEND_AND_RECV);
// PutDatUart(tempbuf,lastframelen);
break;
case ONSENDNEXT:
cblock_num = !cblock_num;
wtempfc[] = CCid_En?0X0A:0X02;
wtempfc[]= CardBufferLength>CardMLen?((tempbuf[] | ] | cblock_num);
wtempfc[] = CCID;
len = (CardBufferLength>(CardMLen))?CardMLen:CardBufferLength;
memcpy(&tempbuf[(unsigned ],&CardBuffer[CardBufPoint],len);
WriteCardFifo(tempbuf,(unsigned ));
SetRecvOrSend(START_SEND_AND_RECV);
// PutDatUart(tempbuf,(unsigned char)(len+((unsigned char)CCid_En)+1));
CardBufPoint = CardBufPoint + len;
CardBufferLength = CardBufferLength - len;
break;
case SENDDEL:
SDeselect();
SetCardIdle();
break;
case SENDWTX:
Timer0Delay(FIFTY_MINISECOND);
//这个时间根据卡返回的ATS中的参数确定,默认为4.8ms,在定时器中断中发WTX,并禁止再次中断,停止定时器
EnableTimer0Int();
break;
case GETDATA:
cblock_num= !cblock_num;
tempbuf[] = CCid_En?0X0A:0X02;
tempbuf[] = CardBufferLength>CardMLen?((tempbuf[] | ] | cblock_num)
tempbuf[] = CCID;
CardBufPoint = ;
len = (CardBufferLength>CardMLen)?CardMLen:CardBufferLength;
memcpy(&tempbuf[(unsigned ],&CardBuffer[CardBufPoint],len+(unsigned );
WriteCardFifo(tempbuf,(unsigned ));
SetRecvOrSend(START_SEND_AND_RECV);
// PutDatUart(tempbuf,(unsigned char)(len+((unsigned char)CCid_En)+1));
CardBufPoint = CardBufPoint + len;
CardBufferLength = CardBufferLength - len;
break;
case DONOTHING:
default:break;
} return OK;
}
最后,关于WTX的处理,需要一个定时器,其初值由ATS的内容确定,这里不再叙述
ISO14443-4块传输的实现(卡)的更多相关文章
- 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卡的,而且 ...
- ISO7816协议的块传输协议
1.块传输协议中的前三个字节是强制必须有的 NAD节点地址: 当终端支持多个卡槽,终端和这些卡槽以总线的方式通讯时,该字节有用,其他情况下,默认为0 bit1-3:定义了源地址 bit5-7:定义了目 ...
- ISO14443-4块传输协议的实现
ISO1444-3块传输协议主要用于应用数据的传输,其实现如下: unsigned char Apdu(unsigned char *comm,unsigned short len,unsigned ...
- 第14章 位图和位块传输_14.4 GDI位图对象(3)
14.4.10 非矩形的位图图像 (1)“掩码”位图——单色位图,要显示的像素对应的掩码置1,不显示置0(2)光栅操作(点这里,见此文分析) (3)MaskBlt函数 ①MaskBlt(hdcDest ...
- 第14章 位图和位块传输_14.4 GDI位图对象(2)
14.4.7 在位图上绘图 (1)在内存设备环境中绘图(与真实DC不同的是,内存DC的显示表面是个位图) (2)GetTextExtentPoint32函数:用于确定文本字符串的像素大小.(此大小就是 ...
- 第14章 位图和位块传输_14.4 GDI位图对象(1)
14.4.1 创建DDB (1)创建 HBITMAP= CreateBitmap(cx,cy,cPlanes,cBitsPixel,lpBits); 参数 说明 cx,cy 指定位图宽度和高度,单位为 ...
- PBOC第八部分和第十一部分关于TYPEA总结(二)——传输协议(ISO14443-4)
二.传输协议(ISO14443-4)(8,P50 11,P30) 1.选择应答请求(RATS) 使用RATS命令和PICC协商通讯的最大帧长度(FSD和FSC).帧等待时间(FWT)和启动帧保护时间( ...
- 智能IC卡与终端(读卡器)之间的传输协议
1.有两种协议 T=0,异步半双工字符传输协议 T=1,异步半双工块传输协议 终端一般都支持这两种协议,IC卡可以选择支持其中的一种.(因为终端可能需要面对各种类型的卡片,所以必须两种协议都支持,而卡 ...
随机推荐
- mvc与mvvm
mvc:被动型式的,也就是说,只有view有要求的时候,控制器才有反应 View Controller Model 可以把一个页面看作是由多个view组成 Controller控制 ...
- 在SQL中使用PL/SQL函数存在的问题
-----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...
- 【PHP缩略图类】手机照片不能生成缩略图问题以及解决方式
[本文原创,谢绝转载] 一.出现的问题 这几天做了手机上传照片并裁出缩略图的接口的測试,发现无论怎么.生成的缩略图都是一片漆黑.:-( 然后就把这个缩略图类单拿出来进行測试,发现仅仅要是手机拍出来的照 ...
- Linux下有线无线网络配置------命令模式
1. 列出启用网络设备的所有信息: ifconfig 2. 将网络设备设置为启用或者不启用 不启用设备eth0 ifconfig eth0 down 启用设备eth0: Will bring eth0 ...
- 解除网页右键限制和开启网页编辑状态的js代码
当访问页面右键被限制了怎么办?很好办!将以下代码添加进收藏夹,点击执行即可: javascript:alert(document.onselectstart = document.onbeforeco ...
- 正则表达式中/i,/g,/ig,/gi,/m的区别和含义
正则表达式中/i,/g,/ig,/gi,/m的区别和含义 /i (忽略大小写)/g (全文查找出现的所有匹配字符)/m (多行查找)/gi(全文查找.忽略大小写)/ig(全文查找.忽略大小写)
- POJ 3162 Walking Race(树的直径+单调队列)
题目大意:对一棵树,求出从每个结点出发能到走的最长距离(每个结点最多只能经过一次),将这些距离按排成一个数组得到dis[1],dis[2],dis[3]……dis[n] ,在数列的dis中求一个最长的 ...
- ZOJ1463
题意:给一个括号字符串,求解最少添加的字符能使整个字符串匹配. 输入: s(未匹配的字符串) 输出: S(匹配后的字符串) 思路:绝壁超级坑的一道题,格式我不想说什么了,特坑,然后就是对给定的字符串, ...
- ASPNET5的依赖注入
ASP.NET5设计的时候就是以DI为基础的,它可以利用内建的框架在Startup类的方法中,把依赖注入进去.应用服务也可以被配置的注入.默认的服务容器提供一些基本的功能,它并不打算代替现代主流的DI ...
- C#接口的使用
.接口: 接口与抽象类一样,也是表示某种规则,一旦使用了该规则,就必须实现相关的方法.对于C#语言而言,由于只能继承自一个父类,因此若有多个规则需要实现,则使用接口是个比较好的做法. .接口的定义 i ...