


//============= 常量定义 ==========================================================================
#define TYPEA_EXPECT_TIMEOUT        0x01
#define TYPEA_EXPECT_ACK            0x02
#define TYPEA_EXPECT_DATA           0x04

#define TYPEA_ACK_MASK              0x0A        // ACK
//=================================================================================================
#define REQUEST_BITS                0x07        // 请求命令的位数
#define ATQA_LENGTH                 0x02        // ATQ长度

#define REQALL                      0x52        // 唤醒命令
#define REQIDLE                     0x26        // 请求命令
//============= 防碰撞/选择命令参数定义 ===========================================================
#define BITS_PER_BYTE               0x08
#define UPPER_NIBBLE_SHIFT          0x04
#define COMPLETE_UID_BITS           0x28
#define NVB_MIN_PARAMETER           0x20
#define NVB_MAX_PARAMETER           0x70

#define SELECT_CASCADE_LEVEL_1      0x93        // 防碰撞/选择等级1
#define SELECT_CASCADE_LEVEL_2      0x95        // 防碰撞/选择等级2
#define SELECT_CASCADE_LEVEL_3      0x97        // 防碰撞/选择等级3
#define MAX_CASCADE_LEVELS          0x03        // 最大防碰撞等级
#define SINGLE_UID_LENGTH           0x20
#define CASCADE_BIT                 0x04
//============= 选择命令回应的字节数 ==============================================================
#define SAK_LENGTH                  0x01
//============= 挂起命令参数定义 ==================================================================
#define HALTA_CMD                   0x50
#define HALTA_PARAM                 0x00
#define HALTA_CMD_LENGTH            0x02
//============= RATS命令参数 ======================================================================
#define RATS_CMD                    0xE0        // RATS命令
#define RATS_CMD_LENGTH             0x02        // RATS命令长度

#define FSD16                       0x00
#define FSD24                       0x10
#define FSD32                       0x20
#define FSD40                       0x30
#define FSD48                       0x40
#define FSD64                       0x50
#define FSD96                       0x60
#define FSD128                      0x70
#define FSD256                      0x80
//============= PPS命令参数 =======================================================================
#define PPSS                        0xD0        // PPS的第一个字符
#define PPS_CMD_LENGTH              0x03        // PPS命令长度
//============= 分组传输命令 ======================================================================
#define PCB_TYPE_MASK			    0xC0        // 分组类型屏蔽码
#define PCB_IBLOCK                  0x00        // 信息分组(I_block)
#define PCB_RBLOCK                  0x80        // 接收准备分组(R_block)
#define PCB_SBLOCK                  0xC0        // 管理分组(S_block)

#define PCB_IBRFU_MASK			    0xE2        // I_block特征屏蔽码(I_block)
#define PCB_CHAINING		        0x10        // 还有数据位       (I_block)
#define PCB_CID			            0x08        // 后面有CID        (I_block,R_block,S_block) 
#define PCB_NAD			            0x04        // 后面有NAD        (I_block)
#define PCB_IBRFU			        0x02        // 保留位           (I_block)
#define PCB_BLOCKNUM		        0x01        // 分组号           (I_block,R_block)      

#define PCB_RBRFU_MASK			    0xE6        // R_block特征屏蔽码(R_block)
#define PCB_RBRFU			        0x22        // 保留位           (R_block)
#define PCB_NAK			            0x10        // NAK              (R_block)              

#define PCB_SBRFU_MASK			    0xC7        // S_block特征屏蔽码(S_block)
#define PCB_SBTYPE_MASK		        0x30        // S_block类型屏蔽码(S_block)
#define PCB_WTX			            0x30        // FWT 扩展等待时间 (S_block)
#define PCB_DESELECT		        0x00        // DESELECT(HALT)   (S_block) 
#define PCB_SBRFU			        0x02        // 保留位           (S_block)

#define PCB_CID_MASK			    0x0F        // CID屏蔽码
/**************************************************************************************************
** 函数原型:    char PiccRequest(unsigned char req_code, unsigned char *atq);
** 函数功能:    请求天线感应区内的卡
** 入口参数:    unsigned char req_code          ; 请求类型 REQALL、REQIDLE
** 出口参数:    unsigned char *atq              ; 请求回应
** 返 回 值:    -
** 描　  述:    请求回应的代码
**	     		MF0 IC U1	的类型号:0044H
**	     		MF1 IC S50	的类型号:0004H
**				MF1 IC S70	的类型号:0002H
**				MF3	IC D40	的类型号:0344H
**************************************************************************************************/
extern char PiccRequest(unsigned char req_code, unsigned char *atq);

/**************************************************************************************************
** 函数原型:    char PiccCascAnticoll(unsigned char sel_code,unsigned char bitcount,
**                                    unsigned char *snr);
** 函数功能:    防碰撞
** 入口参数:    unsigned char sel_code          ; 防碰撞的等级
**              unsigned char bitcount          ; 已知UID的位数
**              unsigned char *snr              ; 已知的UID
** 出口参数:    unsigned char *snr              ; UID
** 返 回 值:    执行结果
** 描　  述:    
**************************************************************************************************/
extern char PiccCascAnticoll( unsigned char sel_code,unsigned char bitcount,
                                  volatile unsigned char *snr);

/**************************************************************************************************
** 函数原型:    char PiccCascSelect(unsigned char sel_code,unsigned char *snr,
**                                  unsigned char *sak);
** 函数功能:    防碰撞
** 入口参数:    unsigned char sel_code          ; 防碰撞的等级
**              unsigned char *snr              ; UID
** 出口参数:    unsigned char *sak              ; SAK
** 返 回 值:    执行结果
** 描　  述:    
**************************************************************************************************/
extern char PiccCascSelect( unsigned char sel_code, volatile unsigned char *snr, 
                                 unsigned char *sak);

/**************************************************************************************************
** 函数原型:    char PiccHalt(void)
** 函数功能:    将选择的卡挂起(ISO/IEC14443A-3)
** 入口参数:    -
** 出口参数:    -
** 返 回 值:    执行结果
** 描　  述:    该函数是ISO/IEC14443A-3层协议
**************************************************************************************************/
extern char PiccHalt(void);

/**************************************************************************************************
** 函数原型:    char PiccActivate(  unsigned char req_code,unsigned char *atq, 
**                                  unsigned char *sak, unsigned char *uid,
**                                  unsigned char *uid_len)
** 函数功能:    卡片激活
** 入口参数:    unsigned char req_code          ; 请求模式
** 出口参数:    unsigned char *atq        ; ATQ 2字节
                unsigned char *sak        ; SAK 
                unsigned char *uid        ; UID 
                unsigned char *uid_len    ; UID_Len
** 返 回 值:    执行结果
** 描　  述:    组合函数
**************************************************************************************************/
/*extern char PiccActivate(unsigned char req_code,
                             unsigned char *atq, unsigned char *sak, 
                             unsigned char *uid, unsigned char *uid_len);
*/
/**************************************************************************************************
** 函数原型:    char PiccRequest_ATS(unsigned char  CID, unsigned char *ATS)
** 函数功能:    请求选择应答
** 入口参数:    unsigned char CID               ; PICC的逻辑号(低4位有效，取值范围0-14)
**		        Mode[3:0]  CID:PICC的逻辑号，取值范围：0--14
**  		    Mode[7:4] FSDI:PCD能接收的最大字节,RC522最大帧为64字节
**			    FSDI:	0	1	2	3	4	5	6	7	8	9-F
**			     FSD:	16	24	32	40	48	64	96	128	256	RFU
** 出口参数:    unsigned char *ATS              ; ATS的最大长度为14字节
** 返 回 值:    执行结果
**************************************************************************************************/
extern char PiccRequest_ATS(unsigned char  CID, unsigned char *ATS);

/**************************************************************************************************
** 函数原型:    char PiccPPS(unsigned char CID,unsigned char DI)
** 函数功能:    协议和参数选择
** 入口参数:    unsigned char CID               ; PICC的逻辑号(低4位有效，取值范围0-14)
**              unsigned char DI                ; 传输位率
**              DI[3:2] -> DSI                  ; DRI,DSI   00  01  10  11
**              DI[1:0] -> DRI                  ;       D   1   2   4   8
** 出口参数:    -
** 返 回 值:    执行结果
**************************************************************************************************/
extern char PiccPPS(unsigned char CID,unsigned char DI);
/**************************************************************************************************
** 函数原型:    char PiccDeSelect(unsigned char PCB,unsigned char CID)             
** 函数功能:    将制定的卡(CID) 挂起
** 入口参数:    unsigned char PCB               ; PCB
**              unsigned char CID               ; CID
** 出口参数:    -
** 返 回 值:    执行结果
** 说    明:    CID是执行RATS命令时由PCD指定的，PCB相应的位指明是否发送CID
**************************************************************************************************/
extern char PiccDeSelect(unsigned char PCB,unsigned char CID);

/**************************************************************************************************
** 函数原型:    char PiccBlockTrans(unsigned char *infin,unsigned char lenin,
**                                  unsigned char *infout,unsigned char *lenout)
** 函数功能:    ISO14443A-4半双工块传输协议(T=CL)
** 入口参数:    unsigned char *infin            ; 输出数据
**              unsigned char lenin             ; 输出数据的长度
** 出口参数:    unsigned char *infout           ; 输入数据
**              unsigned char *lenout           ; 输入数据的长度
** 返 回 值:    执行结果
** 说    明:    可以发送I块支持分链发送、接收和扩展帧等待时间，能同时激活和处理同一种类型的多张卡
**              若返回值不为MI_OK，则这个激活必须取消，相应的CID必须取消
**************************************************************************************************/
extern char PiccBlockTrans(unsigned char *infin,unsigned char lenin,
                              unsigned char *infout,unsigned char *lenout);
															
															
unsigned char atsCard(unsigned char * outBuff);
unsigned char reqa_select(unsigned char * outBuff);
unsigned char apduCard(unsigned char * outBuff);
//=================================================================================================

char PiccActiveCard(unsigned char *atq, unsigned char *snr, unsigned char *sak);
