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卡可以选择支持其中的一种.(因为终端可能需要面对各种类型的卡片,所以必须两种协议都支持,而卡 ...
随机推荐
- ios-简单算法
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- Qt 学习之路 :Qt 模块简介
Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改.Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中.Qt 4 也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化.本节 ...
- SSL证书制作
1.创建根证书秘钥文件(自己做CA)root.key: openssl genrsa -out root.key -aes256 2048 2.创建根证书的申请文件root.csr openssl r ...
- Vijos P1325桐桐的糖果计划(有向图双连通分量)
/*重边不能删 不能删 不能删...*/ #include<iostream> #include<cstdio> #include<cstring> #define ...
- 对require.js 的使用进行总结
一.为什么要使用require.js 首先一个页面如果在加载多个js文件的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长:其次,由于js文件之间存在依赖关系,因此必须严格保证加载 ...
- PHP 关于文件操作的简单介绍
文件操作一直是Web程序员头疼的地方,而文件操作在CMS这样的系统中又是必须的.如今,PHP文件操作的函数内容已经非常强大,文件这部分也是学习PHP非常重要的一部分,希望大家不要忽略.这篇文章会简单介 ...
- ChesFrame框架介绍
一直以来想写一个框架,想达到的目的: 1.对曾经做过项目的总结 2.节约构建系统的成本,不用每次都从零开始做起 3.写框架并在使用中不断的完善框架,这也是个积攒过程. 经历了一个多月的时间,一个基本的 ...
- MVC +EF+linq 多表联查
关于linq的多表联查效果的实现: 后台多表查询 内连接: SELECT [Extent2].[partID] AS [partID], [Extent1].[userName] AS [userN ...
- MySQL UPDATE
MySQL UPDATE 查询 如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用SQL语 ...
- angular自定义指令详解
指令(directive)是angular里面最核心也是最难懂的东西,在慕课网看了下大漠穷秋老湿的视频,自己百度半天做了一些小test,总算把一切都搞明白了. 先列出学习来源: 指令中controll ...