Index: yc_7816/yc_7816.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_7816/yc_7816.h	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_7816/yc_7816.h	(working copy)
@@ -12,8 +12,8 @@
 #include "yc3121.h"
 #include "yc_gpio.h"
 
-#define DEBUG_7816_EMV
-#define DEBUG_7816
+//#define DEBUG_7816_EMV
+//#define DEBUG_7816
 
 
 typedef struct 
@@ -145,9 +145,9 @@
 /*7816发送接收*/
 #define RECV                                  1
 #define SEND                                  0
-#define I_BLOCK                                 0
-#define R_BLOCK                                 1
-#define S_BLOCK                                 2
+#define I_BLOCK_C                             0
+#define R_BLOCK_C                             1
+#define S_BLOCK_C                             2
 #define T_S_IFS                                 2          /*调整信息域的S-BLK*/
 #define T_S_ABORT                               3          /*打断CHAIN的S-BLK*/
 #define T_S_WTS                                 4          /*请求延长等待时的S-BLK*/
@@ -214,20 +214,11 @@
 uint16_t ISO7816_TPDU_T1Send(uint8_t *pCommand, uint16_t CommandLength, uint8_t Type);
 uint16_t ISO7816_Dispose_CMD(uint8_t *pCmd, uint16_t CmdLen, uint8_t *pResp,  uint16_t *pRespLen);
 //state 0-vcard off  1-3.3 vcard   2-1.8 vcard
-void ISO7816_cold_reset(uint8_t state);
+uint8_t ISO7816_cold_reset(uint8_t state);
 void ISO7816_warm_reset(void);
 //卡检测
 uint8_t detect_io_state(void);
 uint16_t ISO7816_LoopBack(void);
 
-/**
- * @brief  get iso7816 lib version
- * @param  none
- * @return lib version:
- *         bit0~bit15:low version number
- *         bit0~bit15:high version number
- */
-uint32_t ISO7816_GetVersion(void);
-
 #endif	/* __YC_ISO7816_H__ */
 
Index: yc_7816/yc_7816.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_7816/yc_7816.c	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_7816/yc_7816.c	(working copy)
@@ -71,9 +71,9 @@
 	return GPIO_ReadInputDataBit((GPIO_TypeDef)sci_pin.detect.gpio_group, sci_pin.detect.gpio_pin);
 }
 
-unsigned char crad_in_io_filter(void)
+uint8_t crad_in_io_filter(void)
 {
-	unsigned char ret[2];
+	uint8_t ret[2];
 
 	ret[0] = detect_io_state();
 	delay_ms(2);
@@ -210,11 +210,10 @@
 	return OK;
 }
 
-void ISO7816_cold_reset(uint8_t state)
+uint8_t ISO7816_cold_reset(uint8_t state)
 {
 	PWM_InitTypeDef PWM_struct;
 	uint32_t period;
-	unsigned char ret = 0;
 
 	uint16_t fi_table_1[16] = {372, 372, 558, 744, 1116, 1488, 1860, 0,
                             0, 512, 768, 1024, 1536, 2048, 0, 0};
@@ -245,12 +244,12 @@
 	contact_atr_rab_overtime_falg = 0;
 
 	atr_cwt_valid_flag = 0;
-
+	
+	vcard_control(ISO7816_VCC_0V);
 	GPIO_CONFIG(get_io_num(sci_pin.clk.gpio_group, sci_pin.clk.gpio_pin)) = GPCFG_OUTPUT_LOW;//clk
 	GPIO_CONFIG(get_io_num(sci_pin.reset.gpio_group, sci_pin.reset.gpio_pin)) = GPCFG_OUTPUT_LOW;//RST
 	GPIO_CONFIG(get_io_num(sci_pin.io.gpio_group, sci_pin.io.gpio_pin)) = GPCFG_OUTPUT_LOW;	//io
-	vcard_control(ISO7816_VCC_0V);
-
+	
 	//enable power
 	vcard_control(state);
 
@@ -274,6 +273,11 @@
 			MyPrintf("%02x",TempChar);	
 			MyPrintf("\n");
         #endif
+
+        if(detect_io_state() == sci_pin.detect_state)
+        {
+            return ISO7816_CARD_ABSENT;
+        }
 	}
 
 	//clk
@@ -306,6 +310,7 @@
 	time0_cnt_last = TIM0_CNT;
 	contact_atr_rfb_overtime_falg = 0;
 	contact_atr_rab_overtime_falg = 1;
+    return  OK;
 }
 
 void ISO7816_warm_reset(void)
@@ -350,8 +355,6 @@
 
 void ISO7816_config_mode_fun(void)
 {
-	uint8_t TmpCmd[5];
-	uint8_t Ret=0;
 	if(g_7816Para.bProlType == PROTOCOL_T0)
 	{
 		SCI7816_MODE |= (1 << SCICFG_RETRY_EN) | (4 << SCICFG_RETRY);
@@ -360,21 +363,6 @@
 	else
 	{
 		SCI7816_MODE |= 1 << SCICFG_TMODE;
-		if(g_7816Para.bProlType == 1)
-		{
-			
-			//设置IFSD
-			g_T1.bIFSD = 254;
-			TmpCmd[0] = 254;
-
-			Ret = ISO7816_TPDU_T1Send(TmpCmd, 1, T_S_IFS);
-			if(Ret != OK)
-			{
-				ISO7816_OperateSelect( ISO7816_DEACTIVE_CARD,1);
-				delay_ms(10);
-				   
-			}
-		}
 	}
 }
 
@@ -521,6 +509,11 @@
 		{
 			ret = 1;
             ISO7816_RecAtrBytes(&pAtr[Len], 1);
+
+            if(detect_io_state() == sci_pin.detect_state)
+            {
+                return ISO7816_CARD_ABSENT;
+            }
         } 
 		if (ret == 1)
 		{
@@ -537,7 +530,6 @@
     uint8_t tmpLen;
     uint8_t tmpTDx;
     uint8_t offset;
-    uint16_t Ret;
     uint32_t tmpTimer;
     uint8_t TC1_N = 0;
     uint8_t TD1_N = 0 ,TD1_Flag = 0;
@@ -567,27 +559,6 @@
 		  	//不发PPS
 		  	//return ISO7816_ATR_TA1_ERROR;
 		}
-		/*tmpTimer = 10086;   //默认9600 + 480
-		if((g_7816Para.bTA1&0xF) > 1)
-		{
-		    tmpTimer *= di_table[g_7816Para.bTA1&0xF];    // * DI
-
-		    if((g_7816Para.bTA1&0x0f) == 3)
-		    {
-		        tmpTimer += 20;
-		    }
-		}
-
-        //多加2个ETU
-        tmpTimer += 20;
-        //如果没有超限，设置WT时间
-		terminal_rec_cwt = tmpTimer;
-
-		#ifdef DEBUG_7816
-		MyPrintf("rec cwt:\n");
-		MyPrintf("%08x",terminal_rec_cwt);	
-		MyPrintf("\n");
-		#endif*/
     }
     //TB1
     if((tmpTDx & BIT5) != 0)
@@ -633,7 +604,6 @@
     }
 	else
 	{
-		//terminal_send_cwt=20;
 		if(g_7816Para.bProlType == 1)
 		{
 			terminal_send_cwt=11;
@@ -712,12 +682,6 @@
         {   
             if(g_7816Para.bProlType == PROTOCOL_T0)
             {
-                //如果TC2存在的话，TC2专用于T=0协议。
-                //if(g_7816Para.bTA2Flag && ((g_7816Para.bTA2&0x0F)!=0))
-                {
-                //    return ISO7816_ATR_TC2_ERROR;   
-                }
-                    
                 //TC2只支持10
                 if(10 != pATR[offset])
                 {
@@ -885,26 +849,29 @@
                 return ISO7816_CARD_STUTES_ERROR;
             }
 			
-            ISO7816_cold_reset(vcard_set);
+            ret = ISO7816_cold_reset(vcard_set);
+            if(ret != OK)
+            {
+                return ISO7816_CARD_STUTES_ERROR;
+            }
 			
-
             //表示冷复位
             g_7816Para.bFlag &= (~BIT1);
             break;
-        case ISO7816_WARM_RESET:
-			
+        case ISO7816_WARM_RESET:	
             ISO7816_warm_reset();
 
             //表示热复位
             g_7816Para.bFlag |= BIT1;
             break;
         case ISO7816_DEACTIVE_CARD:
-            ret = crad_in_io_filter();
+			ret = crad_in_io_filter();
             if(ret == sci_pin.detect_state)
             {
                 return ISO7816_CARD_STUTES_ERROR;
             }
-			
+
+            //IC卡下电
             iso7816_deactive();
             break;
         default:
@@ -916,10 +883,8 @@
 
 uint16_t ISO7816_DisposePPS(uint8_t TA1)
 {
-    uint16_t Ret ,f;
+    uint16_t f;
     uint8_t rateL, rateH;
-    uint8_t ppsBuf[4];
-    uint8_t ppsBuf2[4];
     uint8_t   fi, di;
 
     fi = GET_4_BITS_H(TA1);
@@ -1074,7 +1039,6 @@
 
 uint16_t ISO7816_LoopBack(void)
 {
-    uint8_t  Reg_Int1;
     uint8_t ATRLen;
     uint16_t Ret;
     uint16_t RecLen;
@@ -1083,7 +1047,6 @@
 	
 	uint8_t SELECT_PSE[]	= {0x00,0xA4,0x04,0x00,0x0E,
 						   0x31,0x50,0x41,0x59,0x2E,0x53,0x59,0x53,0x2E,0x44,0x44,0x46,0x30,0x31,0x00};  /* SELECT_PPSE */
-	uint8_t i=0;
     
 	atr_time_start();
 	
@@ -1091,13 +1054,13 @@
 #if 1
 		/*if(KEY1_IO_STATE)
 		{
-			delay_ms(30000);				 //30秒测试流程
+			delay_ms(30000);
 		}
 		else
 		{
-			delay_ms(5000); 			 //5秒
+			delay_ms(5000); 
 		}*/
-	delay_ms(3000); 			 //5秒
+	delay_ms(3000); 
 #endif
 
     //激活卡片
@@ -1119,10 +1082,6 @@
             if((g_7816Para.bFlag & BIT1) == 0)
             {
                 delay_ms(10);
-				/*while (SCI7816_STAT & 1)
-				{
-		            ISO7816_RecAtrBytes(&g_7816Para.aAtr[1], 1);
-		        } */
                 ISO7816_OperateSelect(ISO7816_WARM_RESET, 1);
                 goto TOWarmResetCard;
             }
@@ -1271,10 +1230,3 @@
     SendLen= 20;
     goto TOSendCMD ;    
 }
-
-#define ISO7816_LIB_VERSION 0x00010001
-
-uint32_t ISO7816_GetVersion(void)
-{
-    return ISO7816_LIB_VERSION;
-}
Index: yc_7816/yc_7816.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: yc_7816/yc_7816_T0.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_7816/yc_7816_T0.c	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_7816/yc_7816_T0.c	(working copy)
@@ -24,7 +24,7 @@
         {
             return ISO7816_REC_TIMEOUT;
         }
-        if (SCI7816_STAT & 0x04)    			//出错次数到上限
+        if (SCI7816_STAT & 0x04)
         {
             return ISO7816_ERR_NUM_OVER;
         }
@@ -60,7 +60,13 @@
 	delay_ms(2);
 
 	SCI7816_CWT = 0;						//quick startup send
-	while(SCI7816_STAT & 8);				//dummy
+	while(SCI7816_STAT & 8)				//dummy
+    {
+        if(detect_io_state() == sci_pin.detect_state)
+        {
+        	return ISO7816_CARD_ABSENT;
+        }
+    }
 		
 	for (i = 0; i < Len; i++)
 	{
@@ -88,7 +94,13 @@
 		#endif
 	}
 
-	while((SCI7816_INT & 0x02) == 0);
+	while((SCI7816_INT & 0x02) == 0)
+    {
+        if(detect_io_state() == sci_pin.detect_state)
+        {
+        	return ISO7816_CARD_ABSENT;
+        }
+    }
 	SCI7816_CWT = (terminal_rec_cwt|(1<<24));
 	
 	#ifdef DEBUG_7816
Index: yc_7816/yc_7816_T1.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_7816/yc_7816_T1.c	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_7816/yc_7816_T1.c	(working copy)
@@ -50,16 +50,34 @@
 	
 	if (state == 0)
 	{
-		while (!(SCI7816_STAT & 0x40));			//bgt
+		while (!(SCI7816_STAT & 0x40))			//bgt
+        {
+            if(detect_io_state() == sci_pin.detect_state)
+            {
+                return ISO7816_CARD_ABSENT;
+            }
+        }
 		SCI7816_CWT = 0;						//quick startup send
-		while(SCI7816_STAT & 8);				//dummy
+		while(SCI7816_STAT & 8)				//dummy
+        {
+            if(detect_io_state() == sci_pin.detect_state)
+            {
+                return ISO7816_CARD_ABSENT;
+            }
+        }
 	}
 
 	SCI7816_CWT = terminal_send_cwt-10;
 		
 	for (i = 0; i < Len; i++)
 	{
-		while (SCI7816_STAT & 0x10);		//sendbuf full
+		while (SCI7816_STAT & 0x10)		//sendbuf full
+        {
+            if(detect_io_state() == sci_pin.detect_state)
+            {
+                return ISO7816_CARD_ABSENT;
+            }
+        }
 
 		SCI7816_INT = 0;
 
@@ -85,7 +103,13 @@
 		
 		SCI7816_CWT = terminal_rec_bwt;
 
-		while((SCI7816_INT & 0x02) == 0);
+		while((SCI7816_INT & 0x02) == 0)
+        {
+            if(detect_io_state() == sci_pin.detect_state)
+            {
+                return ISO7816_CARD_ABSENT;
+            }
+        }
 
 		SCI7816_CWT = terminal_rec_cwt;
 	}
@@ -146,7 +170,6 @@
 uint16_t ISO7816_SendBlock_Soft(uint8_t *pBuff, uint16_t I_Len, uint8_t *pHead)
 {
     uint16_t  ret;
-    uint8_t RegVal;
     uint8_t Lrc1,Lrc2;
     uint8_t *pAddr;
     uint16_t sendLen;
@@ -179,7 +202,13 @@
         pHead[3] = Lrc1;
         pAddr = pHead;
         sendLen = 4;   
-		while (!(SCI7816_STAT & 0x40));			//bgt
+		while (!(SCI7816_STAT & 0x40))			//bgt
+        {
+            if(detect_io_state() == sci_pin.detect_state)
+            {
+                return ISO7816_CARD_ABSENT;
+            }
+        }
     }
     
     //发送数据
@@ -195,10 +224,12 @@
 
 void ISO7816_read_recfifo(void)
 {
+    uint16_t num = 0;
 	uint8_t data;
-	while (SCI7816_STAT & 1)
+	while ((SCI7816_STAT & 1) && (num < 256))
 	{
 		data = SCI7816_DATA;
+        num++;
 	}
 }
 
@@ -396,7 +427,6 @@
     uint8_t ifs_cnt = 0;
     uint8_t s_blk[5];
     uint16_t tmpRecLen;
-    uint8_t BWTBack[3];
     uint8_t SWTXFlag = 0;
 
     if(g_T1.bFlgIRec == 1)
@@ -693,7 +723,6 @@
     uint8_t  prolHead[3];
     uint8_t  s_blk[5];
     uint8_t  resendflag = 0;
-    uint8_t BWTBack[3];
     uint8_t SWTXFlag = 0;
 
     uint8_t IFS_issued = 1;
@@ -708,7 +737,7 @@
     }
     
     //初始化化
-    if(Type == I_BLOCK)
+    if(Type == I_BLOCK_C)
     {
         prolHead[0] = 0;  //nad
         prolHead[1] = 0;  //pcd
@@ -741,7 +770,7 @@
     //发送数据
     while(1)
     {
-        if(Type < S_BLOCK)
+        if(Type < S_BLOCK_C)
         {
             Ret = ISO7816_SendBlock_Soft(pSend, SendLen, prolHead);
             COMPARE_RETURN(Ret);
@@ -827,7 +856,7 @@
                 {
                     g_T1.bErrCnt++;
                 }
-                if(Type < S_BLOCK)
+                if(Type < S_BLOCK_C)
                 {                 
                     if(((g_T1.bErrCnt <= 1) && ((!g_T1.bErrNotify)))
                     ||((g_T1.bErrCnt == 0) && ((g_T1.bErrNotify))))
@@ -960,7 +989,7 @@
         }
         else if(S_BLK == (g_7816Para.aRecBuff[1] & 0xC0))
         {
-            if(Type < S_BLOCK)
+            if(Type < S_BLOCK_C)
             {
                 g_T1.bFlgSRec = 1;
             }
@@ -1034,7 +1063,7 @@
         return ISO7816_PARA_ERROR;
     }
 
-    Ret = ISO7816_TPDU_T1Send(pCommand, CommandLength, I_BLOCK);
+    Ret = ISO7816_TPDU_T1Send(pCommand, CommandLength, I_BLOCK_C);
     COMPARE_RETURN(Ret);
 
     *pResponseLength = 0;
Index: yc_nfc/yc_emv_contactless_l1.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.h	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.h	(working copy)
@@ -5,7 +5,7 @@
   * @version V2.6
   * @date    10-May-2019
   * @brief   This file contains all the functions prototypes for EMV 2.6
-  *			 contactless level 1 interface
+  *                      contactless level 1 interface
   ******************************************************************************
   */
 
@@ -19,276 +19,189 @@
 #include "yc3121.h"
 #include "yc_nfc_common.h"
 
-/************************************ Portability relevant ***********************************/	
+/* Modulation index */
+#define MOD_INDEX       0x10
+/* TX POWER*/
+#define PA_GAIN_VAL     0x1F
+/*RX MINLEVEL*/
+#define RX_MINLEVEL     0X18A
+/*while timeout*/
+#define W_TIME_OUT      0XFFFFFFFF
+
 /* Interface to configure the registers of YC5018 */
 extern void WRITEREG(unsigned char addr, unsigned char data);
 extern uint8_t READREG(unsigned char addr);
-/************************************ Portability relevant ***********************************/	
 
 /****************************** yc5018 reg table ***************************/
 #ifndef __YC5018_REG_TABLE_H_
 #define __YC5018_REG_TABLE_H_
-#define REG_PAGE_SELECT             	0
-#define REG_TOP_CTRL                	1
-#define REG_COMMAND                 	2
-#define REG_FIFO_CTRL               	3
-#define REG_FIFO_LENGTH             	4
-#define REG_WATER_LEVEL             	5
-#define REG_FIFO_DATA               	6
-#define REG_IRQ0_STATE              	7
-#define REG_IRQ1_STATE              	8
-#define REG_IRQ0_CLEAR              	9
-#define REG_IRQ1_CLEAR              	10
-#define REG_IRQ0_EN                 	11
-#define REG_IRQ1_EN                 	12
-#define REG_ERROR_FLAG              	13
-#define REG_PROTOCOL_ERROR          	14
-#define REG_T_CTRL                  	15
-#define REG_T_PRESCAL_HI            	16
-#define REG_T_PRESCAL_LO            	17
-#define REG_T_RELOAD_HI             	18
-#define REG_T_RELOAD_LO             	19
-#define REG_T_VALUE_HI              	20
-#define REG_T_VALUE_LO              	21
-#define REG_TX_WAIT_CTRL            	22
-#define REG_TX_WAIT_FREQ            	23
-#define REG_TX_WAIT                 	24
-#define REG_TX_CODER_CTRL           	25
-#define REG_TX_CRC_CTRL             	26
-#define REG_MOD_WIDTH               	27
-#define REG_TX_TYPE_B_FRAMING       	28
-#define REG_FRAM_CON                	29
-#define REG_RX_WAIT                 	30
-#define REG_RX_WAIT_FREQ            	31
-#define REG_RX_CODER_CTRL           	32
-#define REG_RX_CRC_CTRL             	33
-#define REG_RX_BIT_CTRL             	34
-#define REG_RX_COLL                 	35
-#define REG_RX_TYPE_B_FRAMING       	36
-#define REG_RX_TOLERANCE            	37
-#define REG_RX_LAST_BITS            	38
-#define REG_EMD_CONDITION_MASK0     	39
-#define REG_EMD_CONDITION_MASK1     	40
-#define REG_EMD_STATUS0             	41
-#define REG_EMD_STATUS1             	42
-#define REG_EMD_FRAME_LENGTH        	43
-#define REG_TX_FALL_GAIN0           	44
-#define REG_TX_FALL_GAIN1           	45
-#define REG_TX_FALL_GAIN2           	46
-#define REG_TX_FALL_GAIN3           	47
-#define REG_TX_FALL_GAIN4           	48
-#define REG_TX_FALL_GAIN5           	49
-#define REG_TX_FALL_GAIN6           	50
-#define REG_TX_FALL_GAIN7           	51
-#define REG_TX_RISE_GAIN0           	52
-#define REG_TX_RISE_GAIN1           	53
-#define REG_TX_RISE_GAIN2           	54
-#define REG_TX_RISE_GAIN3           	55
-#define REG_TX_RISE_GAIN4           	56
-#define REG_TX_RISE_GAIN5           	57
-#define REG_TX_RISE_GAIN6           	58
-#define REG_TX_RISE_GAIN7           	59
-#define REG_DEMOD_CTRL              	60
-#define REG_DEMOD_TYPEA_CTRL        	61
-#define REG_MIN_LEVEL_LOW           	62
-#define REG_MIN_LEVEL_HIGH          	63
-#define REG_COLL_LEVEL              	64
-#define REG_RSSI_CALC_CONFIG        	65
-#define REG_RSSI_CALC_CTRL          	66
-#define REG_AVG_POW                 	67
-#define REG_AVG_I                   	68
-#define REG_AVG_Q                   	69
-#define REG_DC_I                    	70
-#define REG_DC_Q                    	71
-#define REG_PMU_STATE               	72
-#define REG_CTRL_STATE              	73
-#define REG_DEMOD_STATE             	74
-#define REG_TOP_CTRL2               	80
-#define REG_WUC_PERIOD              	81
-#define REG_CLK_CTRL                	82
-#define REG_ADC_CTRL                	83
-#define REG_ADC_VALUE_I             	84
-#define REG_ADC_VALUE_Q             	85
-#define REG_CAP_CTRL1               	86
-#define REG_CAP_CTRL2               	87
-#define REG_DEBUG_CTRL              	88
-#define REG_PIN_MUX_CTRL            	89
-#define REG_PIN_PE_CTRL             	90
-#define REG_METAL_FIX_CTRL          	91
-#define REG_METAL_FIX_REG_13P56     	92
-#define REG_METAL_FIX_REG_32K       	93
-#define REG_RESERVED_REG            	94
-#define REG_GPIO_DS_CTRL            	95
-#define REG_TX_PA_GAIN              	97
-#define REG_TX_PA_MOD_GAIN          	98
-#define REG_TX_PA_GAIN_CTRL         	99
-#define REG_XTAL_STABLE_TIME        	104
-#define REG_MODEM_STATE_FORCE_MODE  	105
-#define REG_LPCD0_CNT_TIME          	106
-#define REG_LPCD0_CNT_THRESHOLD_HIGH	107
-#define REG_LPCD0_CNT_THRESHOLD_LOW 	108
-#define REG_LPCD1_PA_SETTLE_TIME    	109
-#define REG_LPCD1_DC_CALC_TIME      	110
-#define REG_LPCD1_DC_THRESHOLD      	111
-#define REG_LDO_CORE_LPO_CLK_CTRL   	129
-#define REG_LDO_ADC_CLKGEN_LPO_CTRL 	130
-#define REG_LDO_RX_LPCD_LPO_CTRL    	131
-#define REG_LPO_XTAL_CTRL           	132
-#define REG_XTAL_CTRL0              	133
-#define REG_XTAL_CTRL1              	134
-#define REG_XTAL_CTRL2              	135
-#define REG_XTAL_CTRL3              	136
-#define REG_XTAL_CTRL4              	137
-#define REG_ADC_CTRL0               	138
-#define REG_ADC_CTRL1               	139
-#define REG_ADC_CTRL2               	140
-#define REG_ADC_CTRL3               	141
-#define REG_ADC_CRTL4               	142
-#define REG_BBPLL_CTRL0             	143
-#define REG_BBPLL_CTRL1             	144
-#define REG_BBPLL_CTRL2             	145
-#define REG_BBPLL_CTRL3             	146
-#define REG_CLKGEN_CTRL             	147
-#define REG_RX_CTRL0                	148
-#define REG_RX_CTRL1                	149
-#define REG_RX_CTRL2                	150
-#define REG_RX_CTRL3                	151
-#define REG_RX_CTRL4                	152
-#define REG_RX_CTRL5                	153
-#define REG_RX_TEST_CTRL            	154
-#define REG_TEST_PA_CTRL            	155
-#define REG_DA_ADC_EN               	156
-#define REG_DA_BBPLL_EN             	157
-#define REG_DA_BBPLL_LOCK_DET_RSTN  	158
-#define REG_DA_BG_TRX_EN            	159
-#define REG_DA_CLKGEN_BUF2DIGADC_EN 	160
-#define REG_DA_CLKGEN_BUF2RX_EN     	161
-#define REG_DA_CLKGEN_BUF2TX_EN     	162
-#define REG_DA_LDO_ADC_EN           	163
-#define REG_DA_LDO_CLKGEN_EN        	164
-#define REG_DA_LDO_CORE_EN          	165
-#define REG_DA_LDO_RX_EN            	166
-#define REG_DA_LPCD_DET_EN          	167
-#define REG_DA_RX_FLT_BIQ_EN        	168
-#define REG_DA_RX_FLT_BP_EN         	169
-#define REG_DA_RX_FLT_DCOC_EN       	170
-#define REG_DA_RX_FLT_GRCK_EN       	171
-#define REG_DA_RX_FLT_IB_EN         	172
-#define REG_DA_RX_MIX_EN            	173
-#define REG_DA_TX_PA_EN             	174
-#define REG_DA_XTAL_EN              	175
-#define REG_DA_XTAL_RSTN            	176
-#define REG_MODEM_STATE_TABLE0      	177
-#define REG_MODEM_STATE_TABLE1      	178
-#define REG_MODEM_STATE_TABLE2      	179
-#define REG_MODEM_STATE_TABLE3      	180
-#define REG_MODEM_STATE_TABLE4      	181
-#define REG_MODEM_STATE_TABLE5      	182
-#define REG_MODEM_STATE_TABLE6      	183
-#define REG_MODEM_STATE_TABLE7      	184
-#define REG_MODEM_STATE_TABLE8      	185
-#define REG_MODEM_STATE_TABLE9      	186
-
+#define REG_PAGE_SELECT                 0
+#define REG_TOP_CTRL                    1
+#define REG_COMMAND                     2
+#define REG_FIFO_CTRL                   3
+#define REG_FIFO_LENGTH                 4
+#define REG_WATER_LEVEL                 5
+#define REG_FIFO_DATA                   6
+#define REG_IRQ0_STATE                  7
+#define REG_IRQ1_STATE                  8
+#define REG_IRQ0_CLEAR                  9
+#define REG_IRQ1_CLEAR                  10
+#define REG_IRQ0_EN                     11
+#define REG_IRQ1_EN                     12
+#define REG_ERROR_FLAG                  13
+#define REG_PROTOCOL_ERROR              14
+#define REG_T_CTRL                      15
+#define REG_T_PRESCAL_HI                16
+#define REG_T_PRESCAL_LO                17
+#define REG_T_RELOAD_HI                 18
+#define REG_T_RELOAD_LO                 19
+#define REG_T_VALUE_HI                  20
+#define REG_T_VALUE_LO                  21
+#define REG_TX_WAIT_CTRL                22
+#define REG_TX_WAIT_FREQ                23
+#define REG_TX_WAIT                     24
+#define REG_TX_CODER_CTRL               25
+#define REG_TX_CRC_CTRL                 26
+#define REG_MOD_WIDTH                   27
+#define REG_TX_TYPE_B_FRAMING           28
+#define REG_FRAM_CON                    29
+#define REG_RX_WAIT                     30
+#define REG_RX_WAIT_FREQ                31
+#define REG_RX_CODER_CTRL               32
+#define REG_RX_CRC_CTRL                 33
+#define REG_RX_BIT_CTRL                 34
+#define REG_RX_COLL                     35
+#define REG_RX_TYPE_B_FRAMING           36
+#define REG_RX_TOLERANCE                37
+#define REG_RX_LAST_BITS                38
+#define REG_EMD_CONDITION_MASK0         39
+#define REG_EMD_CONDITION_MASK1         40
+#define REG_EMD_STATUS0                 41
+#define REG_EMD_STATUS1                 42
+#define REG_EMD_FRAME_LENGTH            43
+#define REG_TX_FALL_GAIN0               44
+#define REG_TX_FALL_GAIN1               45
+#define REG_TX_FALL_GAIN2               46
+#define REG_TX_FALL_GAIN3               47
+#define REG_TX_FALL_GAIN4               48
+#define REG_TX_FALL_GAIN5               49
+#define REG_TX_FALL_GAIN6               50
+#define REG_TX_FALL_GAIN7               51
+#define REG_TX_RISE_GAIN0               52
+#define REG_TX_RISE_GAIN1               53
+#define REG_TX_RISE_GAIN2               54
+#define REG_TX_RISE_GAIN3               55
+#define REG_TX_RISE_GAIN4               56
+#define REG_TX_RISE_GAIN5               57
+#define REG_TX_RISE_GAIN6               58
+#define REG_TX_RISE_GAIN7               59
+#define REG_DEMOD_CTRL                  60
+#define REG_DEMOD_TYPEA_CTRL            61
+#define REG_MIN_LEVEL_LOW               62
+#define REG_MIN_LEVEL_HIGH              63
+#define REG_COLL_LEVEL                  64
+#define REG_RSSI_CALC_CONFIG            65
+#define REG_RSSI_CALC_CTRL              66
+#define REG_AVG_POW                     67
+#define REG_AVG_I                       68
+#define REG_AVG_Q                       69
+#define REG_DC_I                        70
+#define REG_DC_Q                        71
+#define REG_PMU_STATE                   72
+#define REG_CTRL_STATE                  73
+#define REG_DEMOD_STATE                 74
+#define REG_TOP_CTRL2                   80
+#define REG_WUC_PERIOD                  81
+#define REG_CLK_CTRL                    82
+#define REG_ADC_CTRL                    83
+#define REG_ADC_VALUE_I                 84
+#define REG_ADC_VALUE_Q                 85
+#define REG_CAP_CTRL1                   86
+#define REG_CAP_CTRL2                   87
+#define REG_DEBUG_CTRL                  88
+#define REG_PIN_MUX_CTRL                89
+#define REG_PIN_PE_CTRL                 90
+#define REG_METAL_FIX_CTRL              91
+#define REG_METAL_FIX_REG_13P56         92
+#define REG_METAL_FIX_REG_32K           93
+#define REG_RESERVED_REG                94
+#define REG_GPIO_DS_CTRL                95
+#define REG_TX_PA_GAIN                  97
+#define REG_TX_PA_MOD_GAIN              98
+#define REG_TX_PA_GAIN_CTRL             99
+#define REG_XTAL_STABLE_TIME            104
+#define REG_MODEM_STATE_FORCE_MODE      105
+#define REG_LPCD0_CNT_TIME              106
+#define REG_LPCD0_CNT_THRESHOLD_HIGH    107
+#define REG_LPCD0_CNT_THRESHOLD_LOW     108
+#define REG_LPCD1_PA_SETTLE_TIME        109
+#define REG_LPCD1_DC_CALC_TIME          110
+#define REG_LPCD1_DC_THRESHOLD          111
+#define REG_LDO_CORE_LPO_CLK_CTRL       129
+#define REG_LDO_ADC_CLKGEN_LPO_CTRL     130
+#define REG_LDO_RX_LPCD_LPO_CTRL        131
+#define REG_LPO_XTAL_CTRL               132
+#define REG_XTAL_CTRL0                  133
+#define REG_XTAL_CTRL1                  134
+#define REG_XTAL_CTRL2                  135
+#define REG_XTAL_CTRL3                  136
+#define REG_XTAL_CTRL4                  137
+#define REG_ADC_CTRL0                   138
+#define REG_ADC_CTRL1                   139
+#define REG_ADC_CTRL2                   140
+#define REG_ADC_CTRL3                   141
+#define REG_ADC_CRTL4                   142
+#define REG_BBPLL_CTRL0                 143
+#define REG_BBPLL_CTRL1                 144
+#define REG_BBPLL_CTRL2                 145
+#define REG_BBPLL_CTRL3                 146
+#define REG_CLKGEN_CTRL                 147
+#define REG_RX_CTRL0                    148
+#define REG_RX_CTRL1                    149
+#define REG_RX_CTRL2                    150
+#define REG_RX_CTRL3                    151
+#define REG_RX_CTRL4                    152
+#define REG_RX_CTRL5                    153
+#define REG_RX_TEST_CTRL                154
+#define REG_TEST_PA_CTRL                155
+#define REG_DA_RX_FLT_GRCK_EN           171
+#define REG_DA_TX_PA_EN                 174
 
 #endif /*__YC5018_REG_TABLE_H_*/
 
-#define TX_BAUD_RATE_106	0
-#define TX_BAUD_RATE_212	1
-#define TX_BAUD_RATE_424	2
-#define TX_BAUD_RATE_848	3
-
-#define RX_BAUD_RATE_106	0
-#define RX_BAUD_RATE_212	1
-#define RX_BAUD_RATE_424	2
-#define RX_BAUD_RATE_848	3
-
+#define TX_BAUD_RATE_106        0
+#define TX_BAUD_RATE_212        1
+#define TX_BAUD_RATE_424        2
+#define TX_BAUD_RATE_848        3
+
+#define RX_BAUD_RATE_106        0
+#define RX_BAUD_RATE_212        1
+#define RX_BAUD_RATE_424        2
+#define RX_BAUD_RATE_848        3
 
 /* Error code reported to terminal */
-#define EMV_ERR_NONE         0
-#define EMV_ERR_PARA         1
-#define EMV_ERR_NO_CARD	     2
-#define EMV_ERR_COLLISION    3
-#define EMV_ERR_TIME_OUT     4
-#define EMV_ERR_TRANSMISSION 5
-#define EMV_ERR_PROTOCOL     6
-#define EMV_ERR_OVERFLOW     7
-#define EOT_IND_REMOVE       8
-#define EOT_IND_POWER_OFF    9
-#define EOT_SHOUT            10
-/* Power consumption relevant */
-#define LDO                  0
-
-//#define EMV_MAIN_LOOP
-
-/*一：（1）采用固定接收增益*/
-#define RX_GAINtemp  	RX_GAIN_18DB
-
-/*一：（2）采用agc自动调增接收增益开启宏定义*/
-//#define  RXGAIN_CORRECTION
-
-#define SIGNAL_RSSI_MAX  0X50
-#define SIGNAL_RSSI_MIN  0X20  /*修改接收RSSI值上下限*/
-
-/*二：(1)：修改固定调制深度*/
-/* Modulation index */
-#define MOD_INDEX	0x10
-
-/*二：(2)开启自动校正调制深度*/
-//#define   MODINDEX_CALI
-
-#define ratio_0     75 //微调0CM调制深度比率
-#define ratio_1_4   80 //微调1到4cm调制深度比率
-
-/*�����������ε���*/
-//#define REG_TX_FALL_RISE
-#define TYPEA_RISE_GAIN0 0x10
-#define TYPEA_RISE_GAIN1 0x18
-#define TYPEA_RISE_GAIN2 0x18
-#define TYPEA_RISE_GAIN3 0x20
-#define TYPEA_RISE_GAIN4 0x24
-#define TYPEA_RISE_GAIN5 0x28
-#define TYPEA_RISE_GAIN6 0x30
-#define TYPEA_RISE_GAIN7 0x32
-
-/*四:修改接收通路上并联电阻值ֵ*/
-#define RF_ATT  0x01  /*[0x00  250欧]  [0x01  500欧]   [0x02  1k ]  [0x03  2k ]  [0x04  无电阻]*/
-
-/*五：修改门限值高低位值ֵ*/
-#define min_level_l   0x8a /*门限值低位*/
-#define min_level_h   0x01 /*门限值高位*/
-
-
-/*六：打印参数(RSSI/AVG_I/AVG_Q/RX_GAIN/底层报错打印)*/
-
-#define EMV_DEBUG   /*开启宏定义*/
-
-
-/*七：WUPA 和WUPB命令发送后的超时时间*/
-
-#define wupa_anti_select_prescal 0
-#define wupa_anti_select_reload  1400
-
-#define wupb_prescal  3
-#define wupb_reload   57516
-
-
-/*计算方法  t_reload *(t_prescal+1)*(1/13.56M)us*/
-
-/*八：滤波器带宽*/
-#define RX_CTRL3 0xBD
-#define RX_CTRL5 0x7C
-
-/*九 无调制时PA增益*/
-#define PA_Gain	 0x7f
-
-
-/*十 差分输入开启宏定义*/
-
-#define DIFF_ON
-
-/*开关场*/
-//#define CERTIFICTAION
-
+#define EMV_ERR_NONE                    0
+#define EMV_ERR_PARA                    1
+#define EMV_ERR_NO_CARD                 2
+#define EMV_ERR_COLLISION               3
+#define EMV_ERR_TIME_OUT                4
+#define EMV_ERR_TRANSMISSION            5
+#define EMV_ERR_PROTOCOL                6
+#define EMV_ERR_OVERFLOW                7
+#define EOT_IND_REMOVE                  8
+#define EOT_IND_POWER_OFF               9
+#define EOT_SHOUT                       10
+
+/*RX WAIT TIME*/
+#define	WAIT_ATQA_PRESCALER    0
+#define	WAIT_ATQA_RELOAD       2400   //176us  
+
+#define	WAIT_ATQB_PRESCALER    0
+#define	WAIT_ATQB_RELOAD       21240
+
+#define RX_CTRL3        0xBD
+#define RX_CTRL4        0x0B
+#define RX_CTRL5        0x7C
 
 #define RX_GAIN_6DB         ((0<<3) | (0<<5))
 #define RX_GAIN_12DB        ((1<<3) | (0<<5))
@@ -300,99 +213,83 @@
 #define RX_GAIN_48DB        ((3<<3) | (4<<5))
 #define RX_GAIN_54DB        ((3<<3) | (5<<5))
 
-#define RX_I_R_250    0
-#define RX_I_R_500    1
-#define RX_I_R_1K     2
-#define RX_I_R_2K     3
-#define RX_I_R_OPEN   4
-
-#define Tp()              Nfc_SysTick_Delay_Ms(6)
-#define Tretransmission() Nfc_SysTick_Delay_Ms(8)
-#define Tresetdelay()     Nfc_SysTick_Delay_Ms(10)
-#define Tpoweroff()       Nfc_SysTick_Delay_Ms(20)
-
-#define CALI_OK          0
-#define CALI_FAIL        1
-#define DC_ACCEPT_RANGE  0x03
-
-#define WIN_SIZE_32         0
-#define WIN_SIZE_64         1
-#define WIN_SIZE_128        2
-#define WIN_SIZE_256        3
-
-#define get_dc_i()       READREG(REG_AVG_I)
-#define get_dc_q()       READREG(REG_AVG_Q)
-#define get_cali_i()     READREG(REG_RX_CTRL1)
-#define get_cali_q()     READREG(REG_RX_CTRL2)
-#define set_cali_i(rval) WRITEREG(REG_RX_CTRL1, rval)
-#define set_cali_q(rval) WRITEREG(REG_RX_CTRL2, rval)
-
-#define FSD        256
-
-#define IDLE       0x00
-#define RECEIVE    0x01
-#define TRANSMIT   0x02
-#define TRANSCEIVE 0x03
-
-#define I_BLOCK 0
-#define R_BLOCK 2
-#define S_BLOCK 3
-
-#define BIT0  0x01
-#define BIT1  0x02
-#define BIT2  0x04
-#define BIT3  0x08
-#define BIT4  0x10
-#define BIT5  0x20
-#define BIT6  0x40
-#define BIT7  0x80
-
-#define FSC_CHAINING 256
-
-#define FIFO_LENGTH  64
-#define WATER_LEVEL  32
+#define RX_I_R_250                      0
+#define RX_I_R_500                      1
+#define RX_I_R_1K                       2
+#define RX_I_R_2K                       3
+#define RX_I_R_OPEN                     4
+
+#define Tp()                            Nfc_SysTick_Delay_Ms(6)
+#define Tretransmission()               Nfc_SysTick_Delay_Ms(8)
+#define Tresetdelay()                   Nfc_SysTick_Delay_Ms(10)
+#define Tpoweroff()                     Nfc_SysTick_Delay_Ms(20)
+
+#define FSD             256
+#define FSC_CHAINING    256
+
+#define IDLE            0x00
+#define RECEIVE         0x01
+#define TRANSMIT        0x02
+#define TRANSCEIVE      0x03
+
+#define I_BLOCK         0
+#define R_BLOCK         2
+#define S_BLOCK         3
+
+#define BIT0            0x01
+#define BIT1            0x02
+#define BIT2            0x04
+#define BIT3            0x08
+#define BIT4            0x10
+#define BIT5            0x20
+#define BIT6            0x40
+#define BIT7            0x80
+
+#define FIFO_LENGTH     64
+#define WATER_LEVEL     32
+
+#define CALI_OK         0
+#define CALI_FAIL       1
+#define DC_ACCEPT_RANGE 3
+
+#define WIN_SIZE_32     0
+#define WIN_SIZE_64     1
+#define WIN_SIZE_128    2
+#define WIN_SIZE_256    3
+
+#define get_dc_i()              READREG(REG_AVG_I)
+#define get_dc_q()              READREG(REG_AVG_Q)
+#define get_cali_i()            READREG(REG_RX_CTRL1)
+#define get_cali_q()            READREG(REG_RX_CTRL2)
+#define set_cali_i(rval)        WRITEREG(REG_RX_CTRL1, rval)
+#define set_cali_q(rval)        WRITEREG(REG_RX_CTRL2, rval)
 
 #if 1
 #define PRINT(format,...) MyPrintf(format,##__VA_ARGS__)
 #else
-#define PRINT(format,...)	((void)0)
+#define PRINT(format,...)       ((void)0)
 #endif
 
-#define TYPE_A 0
-#define	TYPE_B 1
+#define TYPE_A   0
+#define TYPE_B   1
 
-#define ON  1
-#define OFF 0
+#define ON      1
+#define OFF     0
 
-#define CL1 0x93
-#define CL2 0x95
-#define CL3 0x97
-
-typedef struct{
-  unsigned char addr;
-  unsigned char value;
-}YC_EMV_Contactless_L1_Reg_t;
-
-typedef struct{
-  unsigned char reg_table_index;
-  YC_EMV_Contactless_L1_Reg_t *reg_table;
-}YC_EMV_Contactless_L1_Reg_Config_t;
-
-typedef struct{
-	uint8_t Type_A;
-	uint8_t Type_B;
-}EMV_Poll_Type_t;
+#define CL1     0x93
+#define CL2     0x95
+#define CL3     0x97
 
 /**
   * @brief  Common initialization
   * @param  reg_config: used for external register configuration
-  *		@note if not use this value, can input NULL
+  *             @note if not use this value, can input NULL
   * @retval None
   */
 void YC_EMV_Contactless_L1_Init(void);
 
 /**
-  * @brief 	Individual initialization
+  * @brief      Individual initialization
   * @param  picc_type: specifies which kind of PICC to communicate
   *   This parameter can be one of the values:
   *     @arg TYPE_A: initialize PCD to communicate with type A PICC
@@ -401,8 +298,6 @@
   */
 void YC_EMV_Contactless_L1_Switch_Card_Type(unsigned char picc_type);
 
-/* Power on/off Operating Field */
-
 /**
   * @brief  RF switch on or off
   * @param  on: specifies which switch on or switch off Operating Field
@@ -419,6 +314,7 @@
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_WUPA(void);
+unsigned char AF_EMV_Contactless_L1_WUPA(void);
 
 /**
   * @brief  REQA
@@ -427,6 +323,7 @@
   */
 unsigned char YC_EMV_Contactless_L1_REQA(void);
 
+
 /**
   * @brief  Type A Collision Detection
   *
@@ -434,6 +331,7 @@
   * @retval Error code
   */
 unsigned char EMV_A_Collision_Detect(void);
+unsigned char AF_A_Collision_Detect(void);
 
 /**
   * @brief  ANTICOLLISION
@@ -455,18 +353,18 @@
   *     @arg CL2: cascase level 2
   *     @arg CL2: cascase level 3
   * @param  UID_complete:
-  *			  1: UID not complete
-  *			  0: UID complete
-  * 	@note if not use this value, can input NULL
+  *                       1: UID not complete
+  *                       0: UID complete
+  *     @note if not use this value, can input NULL
   * @param  ISOIEC14443_4_compliant:
   *           1: PICC compliant with ISO/IEC 14443-4
   *           0: PICC not compliant with ISO/IEC 14443-4
-  * 	@note if not use this value, can input NULL
+  *     @note if not use this value, can input NULL
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_SELECT(unsigned char cl,
-										unsigned char *UID_complete,
-										unsigned char *ISOIEC14443_4_compliant);
+                unsigned char *UID_complete,
+                unsigned char *ISOIEC14443_4_compliant);
 
 /**
   * @brief  RATS
@@ -474,6 +372,7 @@
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_RATS(void);
+unsigned char AF_EMV_Contactless_L1_RATS(unsigned char  *output, unsigned char  *outlen);
 
 /**
   * @brief  HLTA
@@ -487,18 +386,18 @@
   * @param  ISOIEC14443_4_compliant:
   *           1: PICC compliant with ISO/IEC 14443-4
   *           0: PICC not compliant with ISO/IEC 14443-4
-  * 	@note if not use this value, can input NULL
+  *     @note if not use this value, can input NULL
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_WUPB(unsigned char *ISOIEC14443_4_compliant);
-
+unsigned char AF_EMV_Contactless_L1_WUPB(unsigned char *ISOIEC14443_4_compliant);
 
 /**
   * @brief  REQB
   * @param  ISOIEC14443_4_compliant:
   *           1: PICC compliant with ISO/IEC 14443-4
   *           0: PICC not compliant with ISO/IEC 14443-4
-  * 	@note if not use this value, can input NULL
+  *     @note if not use this value, can input NULL
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_REQB(unsigned char *ISOIEC14443_4_compliant);
@@ -518,7 +417,6 @@
   */
 unsigned char YC_EMV_Contactless_L1_ATTRIB(void);
 
-
 /**
   * @brief  HLTB
   * @param  None
@@ -535,9 +433,9 @@
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_APDU_Transceive(const unsigned char *inf,
-												unsigned short inflen,
-												unsigned char *res,
-												unsigned short *reslen);
+                unsigned short inflen,
+                unsigned char *res,
+                unsigned short *reslen);
 
 /**
   * @brief  Enter low power mode
@@ -562,21 +460,21 @@
 
 /**
   * @brief  Set receive gain
-  * @param  RxGain : 	#define RX_GAIN_6DB
-						#define RX_GAIN_12DB
-						#define RX_GAIN_18DB
-						#define RX_GAIN_24DB
-						#define RX_GAIN_30DB
-						#define RX_GAIN_36DB
-						#define RX_GAIN_42DB
-						#define RX_GAIN_48DB
-						#define RX_GAIN_54DB
+  * @param  RxGain :    #define RX_GAIN_6DB
+                                                #define RX_GAIN_12DB
+                                                #define RX_GAIN_18DB
+                                                #define RX_GAIN_24DB
+                                                #define RX_GAIN_30DB
+                                                #define RX_GAIN_36DB
+                                                #define RX_GAIN_42DB
+                                                #define RX_GAIN_48DB
+                                                #define RX_GAIN_54DB
 
   * @param  RfAtt :    #define RX_I_R_250
-					   #define RX_I_R_500
-					   #define RX_I_R_1K
-					   #define RX_I_R_2K
-					   #define RX_I_R_OPEN
+                                           #define RX_I_R_500
+                                           #define RX_I_R_1K
+                                           #define RX_I_R_2K
+                                           #define RX_I_R_OPEN
   * @retval None
   */
 void Set_Receive_Parameters(unsigned char RxGain,unsigned char RfAtt);
@@ -588,20 +486,21 @@
   */
 void Set_Min_Level(unsigned short MinLevel);
 
-/*****************************************Intrinsic Function**************************************************/
-void set_dc_win(uint8_t win);
+/** @brief  calibration dc*/
 void set_rssi_calc_en(uint8_t en);
 void set_rx_gain(uint8_t gn);
 uint8_t dc_cali_i(void);
 uint8_t dc_cali_q(void);
 void force_dc_calc(void);
 void dc_cali_alg(uint8_t win_size);
-void printf_debug_info(uint8_t status, uint8_t *data, uint16_t num);
-void EMV_Main_Loop(void);
-uint8_t read_power_index(void);
-uint8_t  auto_calibration_modindex (void);
-void YC_EMV_Contactless_L1_dyn_adj (void);
-void SETBITMASK(unsigned char addr, unsigned char mask);
+
+typedef struct
+{
+        uint8_t Type_A;
+        uint8_t Type_B;
+} EMV_Poll_Type_t;
+
+extern EMV_Poll_Type_t Poll_Type;
 
 #ifdef __cplusplus
 }
Index: yc_nfc/yc_emv_contactless_l1.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.c	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.c	(working copy)
@@ -1,31 +1,48 @@
 #include "yc_emv_contactless_l1.h"
 
-/* Used as switch */
-typedef enum{
-	CMD_WUPA,
-	CMD_REQA,
-	CMD_ANTICOLLISION,
-	CMD_SELECT,
-	CMD_RATS,
-	CMD_HLTA,
-	CMD_WUPB,
-	CMD_REQB,
-	CMD_ATTRIB,
-	CMD_HLTB,
-	CMD_IBLOCK,
-	CMD_SBLOCK,
-	CMD_RBLOCK
-}Cmd_t;
-
-typedef struct{
-	unsigned char UID_CLn[3][5];
-}YC_EMV_Contactless_L1_PICC_A_pcb_t;
+/*
+//注意1：EMV_Transceive函数内各while超时退出时间是否满足要求。要实际测试，避免还没接收完成就退出。
+//注意2：typeB的调制深度寄存器REG_TX_PA_MOD_GAIN的值设置必须大于等于8
+//注意3：复位引脚由低到高后可以判断REG_PMU_STATE寄存器大于等于3时进行后续寄存器配置
+//注意4：增加上电DC矫正功能，用于量产时对每个芯片矫正。
+*/
+
+typedef enum
+{
+    CMD_WUPA,
+    CMD_REQA,
+    CMD_ANTICOLLISION,
+    CMD_SELECT,
+    CMD_RATS,
+    CMD_HLTA,
+    CMD_WUPB,
+    CMD_REQB,
+    CMD_ATTRIB,
+    CMD_HLTB,
+    CMD_IBLOCK,
+    CMD_SBLOCK,
+    CMD_RBLOCK
+} Cmd_t;
+
+//typedef struct
+//{
+//    uint8_t Type_A;
+//    uint8_t Type_B;
+//} EMV_Poll_Type_t;
+
+EMV_Poll_Type_t Poll_Type;
+
+typedef struct
+{
+    unsigned char UID_CLn[3][5];
+} YC_EMV_Contactless_L1_PICC_A_pcb_t;
 
 static YC_EMV_Contactless_L1_PICC_A_pcb_t picc_a;
 
-typedef struct{
-	unsigned char PUPI[4];
-}YC_EMV_Contactless_L1_PICC_B_pcb_t;
+typedef struct
+{
+    unsigned char PUPI[4];
+} YC_EMV_Contactless_L1_PICC_B_pcb_t;
 
 static YC_EMV_Contactless_L1_PICC_B_pcb_t picc_b;
 
@@ -34,76 +51,90 @@
 static unsigned char FWI;
 static unsigned char FSCI;
 static unsigned char Block_Num;
-static uint8_t printf_flag = 0;	//log打印标志位
 
 const static unsigned short FSC_Table[] = {16, 24, 32, 40, 48, 64, 96,
-										128, 256, 512, 1024, 2048, 4096};
-EMV_Poll_Type_t Poll_Type;
+                                           128, 256, 512, 1024, 2048, 4096
+                                          };
 
-uint8_t gain_i_q_table[9][3] = {
-	{RX_GAIN_6DB, 0,0},
-	{RX_GAIN_12DB,0,0},
-	{RX_GAIN_18DB,0,0},
-	{RX_GAIN_24DB,0,0},
-	{RX_GAIN_30DB,0,0},
-	{RX_GAIN_36DB,0,0},
-	{RX_GAIN_42DB,0,0},
-	{RX_GAIN_48DB,0,0},
-	{RX_GAIN_54DB,0,0},
+uint8_t gain_i_q_table[9][3] =
+{
+    {RX_GAIN_6DB, 0,0},
+    {RX_GAIN_12DB,0,0},
+    {RX_GAIN_18DB,0,0},
+    {RX_GAIN_24DB,0,0},
+    {RX_GAIN_30DB,0,0},
+    {RX_GAIN_36DB,0,0},
+    {RX_GAIN_42DB,0,0},
+    {RX_GAIN_48DB,0,0},
+    {RX_GAIN_54DB,0,0},
 }; /* gain,i,q */
 
-uint8_t bit_rate = 0;
-static uint8_t mod_index = 0x3f;
-static uint16_t RSSI_Num = 0;
-uint8_t RSSI_max = 0;
+static unsigned char bit_rate = 0;
 
+/**
+  * @brief      Set REG bit
+  * @param      addr: REG addr
+  * @param      mask: val
+  * @retval None
+  */
 void SETBITMASK(unsigned char addr, unsigned char mask)
 {
-	unsigned char reg;
-	reg = READREG(addr);
-	WRITEREG(addr, (reg | mask));
+    unsigned char reg;
+    reg = READREG(addr);
+    WRITEREG(addr, (reg | mask));
 }
 
+/**
+  * @brief      Clear REG bit
+  * @param      addr: REG addr
+  * @param      mask: val
+  * @retval None
+  */
 static void CLEARBITMASK(unsigned char addr, unsigned char mask)
 {
-	unsigned char reg;
-	reg = READREG(addr);
-	WRITEREG(addr, (reg & (~mask)));
+    unsigned char reg;
+    reg = READREG(addr);
+    WRITEREG(addr, (reg & (~mask)));
 }
 
 /**
-  * @brief 	Set time out timer.
-  * @param 	prescal: prescaler of time out timer.
-  * @param 	reload: reload of time out timer.
+  * @brief      Set time out timer.
+  * @param      prescal: prescaler of time out timer.
+  * @param      reload: reload of time out timer.
   * @retval None
   */
 static void EMV_Set_Timer(unsigned short prescal, unsigned short reload)
 {
-	WRITEREG(REG_T_PRESCAL_HI, (prescal >> 8) & 0x1f);
-	WRITEREG(REG_T_PRESCAL_LO, prescal & 0xff);
-	WRITEREG(REG_T_RELOAD_HI, (reload >> 8) & 0xff);
-	WRITEREG(REG_T_RELOAD_LO, reload & 0xff);
-	WRITEREG(REG_T_CTRL, 0x38);
+    WRITEREG(REG_T_PRESCAL_HI, (prescal >> 8) & 0x1f);
+    WRITEREG(REG_T_PRESCAL_LO, prescal & 0xff);
+    WRITEREG(REG_T_RELOAD_HI, (reload >> 8) & 0xff);
+    WRITEREG(REG_T_RELOAD_LO, reload & 0xff);
+    WRITEREG(REG_T_CTRL, 0x38);
 }
 
 /**
-  * @brief  N-th power of 2
-  * @param  n: number of power
-  * @retval the result of N-th power of 2
+  * @brief      N-th power of 2
+  * @param      n: number of power
+  * @retval     the result of N-th power of 2
   */
 static unsigned int EMV_Power(unsigned char n)
 {
-	return (1 << n);
+    return (1 << n);
 }
 
+/**
+  * @brief      Set FWT
+  * @param      t: time
+  * @retval None
+  */
 static void EMV_Set_FWT(unsigned int t)
 {
-	unsigned short prescal, reload;
+    unsigned short prescal, reload;
 
-	reload = 65535;
-	prescal = t / 65535 - 1;
+    reload = 65535;
+    prescal = t / 65535 - 1;
 
-	EMV_Set_Timer(prescal, reload);
+    EMV_Set_Timer(prescal, reload);
 }
 
 
@@ -152,147 +183,79 @@
 									}while(0)
 
 /**
-  * @brief 	Individual initialization
-  * @param  picc_type: specifies which kind of PICC to communicate
-  *   This parameter can be one of the values:
-  *     @arg TYPE_A: initialize PCD to communicate with type A PICC
-  *     @arg TYPE_B: initialize PCD to communicate with type B PICC
-  * @retval None
-  */
-
-/*********************************************************** Link Layer and Transport Layer ***************************************************************/
-/**
   * @brief  Common initialization
   * @param  reg_config: used for external register configuration
-  *		@note if not use this value, can input NULL
+  * @note if not use this value, can input NULL
   * @retval None
   */
-void YC_EMV_Contactless_L1_Init( void)
+void YC_EMV_Contactless_L1_Init(void)
 {
+    SETBITMASK(REG_TOP_CTRL, 0x10);
 
-	SETBITMASK(REG_TOP_CTRL, 0x10);
-
-	WRITEREG(REG_IRQ0_EN,0x00);
-	WRITEREG(REG_IRQ1_EN,0x00);
-
-	WRITEREG(REG_COLL_LEVEL, 0x06);
-	WRITEREG(REG_DEMOD_CTRL, 0x88);
-
-	Set_Min_Level(0x18a);
+    WRITEREG(REG_IRQ0_EN,0x00);
+    WRITEREG(REG_IRQ1_EN,0x00);
 
-	WRITEREG(REG_ADC_CTRL, 0x00);
+    WRITEREG(REG_COLL_LEVEL, 0x06);
+    WRITEREG(REG_DEMOD_CTRL, 0x88);
 
-	WRITEREG(REG_TX_WAIT_CTRL, (((6780 >> 8) & 0x1f) << 2) | 0x02);
-	WRITEREG(REG_TX_WAIT_FREQ, 0);
-	WRITEREG(REG_TX_WAIT, 6780 & 0xff);
+    WRITEREG(REG_ADC_CTRL, 0x00);
 
-	WRITEREG(REG_RX_WAIT, 0x3b);
-	WRITEREG(REG_RX_WAIT_FREQ, 0x04);
+    WRITEREG(REG_TX_WAIT_CTRL, (((6780 >> 8) & 0x1f) << 2) | 0x02);
+    WRITEREG(REG_TX_WAIT_FREQ, 0);
+    WRITEREG(REG_TX_WAIT, 6780 & 0xff);
 
-	WRITEREG(REG_WATER_LEVEL, WATER_LEVEL);
+    WRITEREG(REG_RX_WAIT, 0x3b);
+    WRITEREG(REG_RX_WAIT_FREQ, 0x04);
 
-	WRITEREG(REG_MOD_WIDTH, 0x20);
+    WRITEREG(REG_WATER_LEVEL, WATER_LEVEL);
+    WRITEREG(REG_MOD_WIDTH, 0x20);
 
-	CLEARBITMASK(REG_RX_CTRL0, 0xf8);
-	SETBITMASK(REG_RX_CTRL0, 0x28);
+    WRITEREG(REG_TEST_PA_CTRL, 0x14);
 
-	Set_Receive_Parameters(RX_GAIN_18DB,RX_I_R_500);
+    SETBITMASK(REG_RSSI_CALC_CTRL, 0x02);
+    SETBITMASK(REG_RSSI_CALC_CONFIG, 0x04);
 
-	Set_Carrier_Strength(PA_Gain);
-
-	WRITEREG(REG_TEST_PA_CTRL, 0x14);
-
-	#ifdef  DIFF_ON
-	WRITEREG(REG_RX_CTRL4, 0x0B);
-	#endif
-
-	SETBITMASK(REG_RSSI_CALC_CTRL, 0x02);
-	SETBITMASK(REG_RSSI_CALC_CONFIG, 0x04);
-
-	WRITEREG(REG_RX_CTRL3, RX_CTRL3);
-	WRITEREG(REG_RX_CTRL5, RX_CTRL5);
+    WRITEREG(REG_RX_CTRL3, RX_CTRL3);
+    WRITEREG(REG_RX_CTRL4, RX_CTRL4);
+    WRITEREG(REG_RX_CTRL5, RX_CTRL5);
 
+    Set_Min_Level(RX_MINLEVEL);     //设置接收门限
+    Set_Receive_Parameters(RX_GAIN_18DB,RX_I_R_500);        //设置接收增益及内部电阻
+    Set_Carrier_Strength(PA_GAIN_VAL);  //设置发射功率
 }
 
+/**
+  * @brief  Set PCD read card type
+  * @param  picc_type: type
+  * @note   initialization Block_Num
+  * @retval None
+  */
 void YC_EMV_Contactless_L1_Switch_Card_Type(unsigned char picc_type)
 {
-
-	#ifdef CERTIFICTAION
-		YC_EMV_Contactless_L1_Rf_Switch(OFF);
-		Nfc_SysTick_Delay_Ms(7);
-	#endif
+	Block_Num = 0;
+	
 	if(picc_type == TYPE_A)
 	{
-		Block_Num = 0;
 		WRITEREG(REG_TX_PA_MOD_GAIN, 0x00);
 		SETBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
-	#ifdef REG_TX_FALL_RISE
-		CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x01);
-		WRITEREG(REG_TX_RISE_GAIN0, TYPEA_RISE_GAIN0);//0x10
-		WRITEREG(REG_TX_RISE_GAIN1, TYPEA_RISE_GAIN1);//0x18
-		WRITEREG(REG_TX_RISE_GAIN2, TYPEA_RISE_GAIN2);//0x18
-		WRITEREG(REG_TX_RISE_GAIN3, TYPEA_RISE_GAIN3);//0x20
-		WRITEREG(REG_TX_RISE_GAIN4, TYPEA_RISE_GAIN4);//0x24
-		WRITEREG(REG_TX_RISE_GAIN5, TYPEA_RISE_GAIN5);//0x28
-		WRITEREG(REG_TX_RISE_GAIN6, TYPEA_RISE_GAIN6);//0x30
-		WRITEREG(REG_TX_RISE_GAIN7, TYPEA_RISE_GAIN7);//0x32
-
-		WRITEREG(REG_TX_FALL_GAIN0, 0);
-		WRITEREG(REG_TX_FALL_GAIN1, 0);
-		WRITEREG(REG_TX_FALL_GAIN2, 0);
-		WRITEREG(REG_TX_FALL_GAIN3, 0);
-		WRITEREG(REG_TX_FALL_GAIN4, 0);
-		WRITEREG(REG_TX_FALL_GAIN5, 0);
-		WRITEREG(REG_TX_FALL_GAIN6, 0);
-		WRITEREG(REG_TX_FALL_GAIN7, 0);
-	#endif
+
 		WRITEREG(REG_TX_CODER_CTRL, 0x00);
 		WRITEREG(REG_RX_CODER_CTRL, 0x00);
 
-		WRITEREG(REG_TX_CRC_CTRL, 0x04);
-		WRITEREG(REG_RX_CRC_CTRL, 0x04);
-	}
-	else if(picc_type == TYPE_B)
-	{
-		Block_Num = 0;
-		#ifdef MODINDEX_CALI
-			WRITEREG(REG_TX_PA_MOD_GAIN, mod_index);
-		#else
-			WRITEREG(REG_TX_PA_MOD_GAIN, MOD_INDEX);
-		#endif
-
-	 #ifdef REG_TX_FALL_RISE
-		CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x01);
-		WRITEREG(REG_TX_FALL_GAIN0, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN1, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN2, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN3, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN4, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN5, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN6, mod_index+4);
-		WRITEREG(REG_TX_FALL_GAIN7, mod_index+4);
-
-		WRITEREG(REG_TX_RISE_GAIN0, mod_index);
-		WRITEREG(REG_TX_RISE_GAIN1, mod_index+4);
-		WRITEREG(REG_TX_RISE_GAIN2, mod_index+0x08);
-		WRITEREG(REG_TX_RISE_GAIN3, mod_index+0x0c);
-		WRITEREG(REG_TX_RISE_GAIN4, mod_index+0x10);
-		WRITEREG(REG_TX_RISE_GAIN5, mod_index+0x14);
-		WRITEREG(REG_TX_RISE_GAIN6, mod_index+0x18);
-		WRITEREG(REG_TX_RISE_GAIN7, mod_index+0x20);
-	#endif
-		CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+        WRITEREG(REG_TX_CRC_CTRL, 0x04);
+        WRITEREG(REG_RX_CRC_CTRL, 0x04);
+    }
+    else if(picc_type == TYPE_B)
+    {
+        WRITEREG(REG_TX_PA_MOD_GAIN, MOD_INDEX);
+        CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+
 		WRITEREG(REG_TX_CODER_CTRL, 0x04);
 		WRITEREG(REG_RX_CODER_CTRL, 0x0c);
 
-		WRITEREG(REG_TX_CRC_CTRL, 0x12);
-		WRITEREG(REG_RX_CRC_CTRL, 0x12);
-	}
-
-	#ifdef	CERTIFICTAION
-		YC_EMV_Contactless_L1_Rf_Switch(ON);
-		Nfc_SysTick_Delay_Ms(2);
-	#endif
+        WRITEREG(REG_TX_CRC_CTRL, 0x12);
+        WRITEREG(REG_RX_CRC_CTRL, 0x12);
+    }
 }
 
 /**
@@ -305,18 +268,21 @@
   */
 void YC_EMV_Contactless_L1_Rf_Switch(unsigned char on)
 {
-	if(on)
-	{
-		SETBITMASK(REG_TOP_CTRL, 0x01);
-	}
-	else
-	{
-		CLEARBITMASK(REG_TOP_CTRL, 0x01);
-	}
+    if(on)
+    {
+        SETBITMASK(REG_TOP_CTRL,0x01);
+        SETBITMASK(REG_TX_PA_GAIN_CTRL,0x10);
+        SETBITMASK(REG_TX_PA_GAIN_CTRL,0x20);
+    }
+    else
+    {         
+        CLEARBITMASK(REG_TX_PA_GAIN_CTRL,0x20);
+        CLEARBITMASK(REG_TX_PA_GAIN_CTRL,0x10);
+        SysTick_Delay_Ms(2);
+        CLEARBITMASK(REG_TOP_CTRL,0x01);
+    }
 }
 
-
-
 /**
   * @brief Interface of transceiving.
   * @param cmd: command
@@ -335,13 +301,17 @@
 	unsigned short i=0;
 	unsigned char j=0;
 	unsigned char len=0;
-	unsigned int t=0,t2=0,reg_t=0;
+	unsigned int t=0,t2=0;
 	unsigned char err_flag=0;
 
 	if((cmd != CMD_HLTA) && (!response || !responselen))
-		return EMV_ERR_PARA;
+	{
+			return EMV_ERR_PARA;
+	}
 	if(!request && (requestlen != 0))
-		return EMV_ERR_PARA;
+	{
+			return EMV_ERR_PARA;
+	}
 
 	WRITEREG(REG_COMMAND, IDLE);
 
@@ -353,247 +323,267 @@
 	WRITEREG(REG_IRQ1_CLEAR,0x07);
 	WRITEREG(REG_IRQ1_CLEAR,0x00);
 
-	if (bit_rate == TX_BAUD_RATE_106) {
-		WRITEREG(REG_MOD_WIDTH, 0x26);
-		CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
-	} else if (bit_rate == TX_BAUD_RATE_212) {
-		WRITEREG(REG_MOD_WIDTH, 0x12); // 16.5~20
-	} else if (bit_rate == TX_BAUD_RATE_424) {
-		WRITEREG(REG_MOD_WIDTH, 0x08); // 8~10
-	} else {
-		WRITEREG(REG_MOD_WIDTH, 0x04); // 4~5
-	}
 
-	if(txalign >= 8 || rxalign >= 8)
-	{
-		return EMV_ERR_PARA;
-	}
-	if(txalign != 0 || rxalign != 0)
-	{
-		CLEARBITMASK(REG_TX_CODER_CTRL, (BIT0 | BIT1 | BIT2) << 3);
-		CLEARBITMASK(REG_RX_BIT_CTRL, BIT0 | BIT1 | BIT2);
+    if(bit_rate == TX_BAUD_RATE_106)
+    {
+        WRITEREG(REG_MOD_WIDTH, 0x26);
+        CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+    }
+    else if(bit_rate == TX_BAUD_RATE_212)
+    {
+        WRITEREG(REG_MOD_WIDTH, 0x12); // 16.5~20
+        SETBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+    }
+    else if(bit_rate == TX_BAUD_RATE_424)
+    {
+        WRITEREG(REG_MOD_WIDTH, 0x08); // 8~10
+        SETBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+    }
+    else
+    {
+        WRITEREG(REG_MOD_WIDTH, 0x04); // 4~5
+        SETBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+    }
 
-		SETBITMASK(REG_TX_CODER_CTRL, txalign << 3);
-		SETBITMASK(REG_RX_BIT_CTRL, rxalign & 0x07);
-	}
-	else
-	{
-		CLEARBITMASK(REG_TX_CODER_CTRL, (BIT0 | BIT1 | BIT2) << 3);
-		CLEARBITMASK(REG_RX_BIT_CTRL, BIT0 | BIT1 | BIT2);
-	}
+    if(txalign >= 8 || rxalign >= 8)
+    {
+        return EMV_ERR_PARA;
+    }
+    if(txalign != 0 || rxalign != 0)
+    {
+        CLEARBITMASK(REG_TX_CODER_CTRL, (BIT0 | BIT1 | BIT2) << 3);
+        CLEARBITMASK(REG_RX_BIT_CTRL, BIT0 | BIT1 | BIT2);
 
-	if(cmd == CMD_ANTICOLLISION || cmd == CMD_SELECT || cmd == CMD_RATS \
-		|| cmd == CMD_HLTA || cmd == CMD_IBLOCK || cmd == CMD_RBLOCK  ||cmd == CMD_SBLOCK)
-	{
-		SETBITMASK(REG_FRAM_CON, BIT0);
-		SETBITMASK(REG_FRAM_CON, BIT1);
-	}
-	else
-	{
-		CLEARBITMASK(REG_FRAM_CON, BIT0);
-		SETBITMASK(REG_FRAM_CON, BIT1);
-	}
+        SETBITMASK(REG_TX_CODER_CTRL, txalign << 3);
+        SETBITMASK(REG_RX_BIT_CTRL, rxalign & 0x07);
+    }
+    else
+    {
+        CLEARBITMASK(REG_TX_CODER_CTRL, (BIT0 | BIT1 | BIT2) << 3);
+        CLEARBITMASK(REG_RX_BIT_CTRL, BIT0 | BIT1 | BIT2);
+    }
 
-	if(cmd == CMD_WUPA || cmd == CMD_REQA || cmd == CMD_ANTICOLLISION)
-	{
-	    CLEARBITMASK(REG_TX_CRC_CTRL, BIT0);
-		CLEARBITMASK(REG_RX_CRC_CTRL, BIT0);
-	}
-	else
-	{
-	    SETBITMASK(REG_TX_CRC_CTRL, BIT0);
-		SETBITMASK(REG_RX_CRC_CTRL, BIT0);
-	}
+    if(cmd == CMD_ANTICOLLISION || cmd == CMD_SELECT || cmd == CMD_RATS \
+        || cmd == CMD_HLTA || cmd == CMD_IBLOCK || cmd == CMD_RBLOCK  ||cmd == CMD_SBLOCK)
+    {
+        SETBITMASK(REG_FRAM_CON, BIT0);
+        SETBITMASK(REG_FRAM_CON, BIT1);
+    }
+    else
+    {
+        CLEARBITMASK(REG_FRAM_CON, BIT0);
+        SETBITMASK(REG_FRAM_CON, BIT1);
+    }
 
-	if(cmd == CMD_REQA || cmd == CMD_ANTICOLLISION || cmd == CMD_SELECT)
-		EMV_Set_Timer(0, 1400);	//9 * 128 + 84/20
+    if(cmd == CMD_WUPA || cmd == CMD_REQA || cmd == CMD_ANTICOLLISION)
+    {
+        CLEARBITMASK(REG_TX_CRC_CTRL, BIT0);
+        CLEARBITMASK(REG_RX_CRC_CTRL, BIT0);
+    }
+    else
+    {
+        SETBITMASK(REG_TX_CRC_CTRL, BIT0);
+        SETBITMASK(REG_RX_CRC_CTRL, BIT0);
+    }
 
-	else if(cmd == CMD_WUPA)
-		//EMV_Set_Timer(0, 1400);	//9 * 128 + 84/20
-		EMV_Set_Timer(wupa_anti_select_prescal, wupa_anti_select_reload);	//9 * 128 + 84/20
+    if(cmd == CMD_ANTICOLLISION || cmd == CMD_SELECT)
+    {
+        EMV_Set_Timer(0, 1400);        //9 * 128 + 84/20
+    }
 
-	else if(cmd == CMD_RATS)
-		EMV_Set_Timer(4, 58812);							//FWT,ACTIVATION + Delta,Tpcd(16.4ms)
+    else if(cmd == CMD_WUPA || cmd == CMD_REQA)
+    {
+        EMV_Set_Timer(WAIT_ATQA_PRESCALER, WAIT_ATQA_RELOAD);        //9 * 128 + 84/20
+    }
 
-	else if(cmd == CMD_WUPB || cmd == CMD_REQB)
+    else if(cmd == CMD_RATS)
+    {
+        EMV_Set_Timer(4, 58812);        //FWT,ACTIVATION + Delta,Tpcd(16.4ms)
+    }
 
-		//EMV_Set_Timer(3, 57516);  							//FWT,ATQB + Delta,Tpcd(16.4ms)
-		EMV_Set_Timer(wupb_prescal, wupb_reload);  							//FWT,ATQB + Delta,Tpcd(16.4ms)
+    else if(cmd == CMD_WUPB || cmd == CMD_REQB)
+    {
+        EMV_Set_Timer(WAIT_ATQB_PRESCALER, WAIT_ATQB_RELOAD);        //FWT,ATQB + Delta,Tpcd(16.4ms)
+    }
 
-	else if(cmd == CMD_IBLOCK || cmd == CMD_RBLOCK || cmd == CMD_ATTRIB || cmd == CMD_HLTB)
-	{
-		t = 256 * 16 * EMV_Power(FWI) + 49152 + 222384;				//FWT + Delta,FWT + Delta,Tpcd
-		EMV_Set_FWT(t);
-	}
-	else if(cmd == CMD_SBLOCK)
-	{
+    else if(cmd == CMD_IBLOCK || cmd == CMD_RBLOCK || cmd == CMD_ATTRIB || cmd == CMD_HLTB)
+    {
+        t = 256 * 16 * EMV_Power(FWI) + 49152 + 222384;                         //FWT + Delta,FWT + Delta,Tpcd
+        EMV_Set_FWT(t);
+    }
+    else if(cmd == CMD_SBLOCK)
+    {
 
-		if(WTXM * EMV_Power(FWI) > EMV_Power(14))
-		{
-			t = 256 * 16 * EMV_Power(14) + 49152 + 222384;			//FWT + Delta,FWT + Delta,Tpcd
-			EMV_Set_FWT(t);
-		}
-		else
-		{
-			t = WTXM * 256 * 16 * EMV_Power(FWI) + 49152 + 222384;	//WTXM * FWT + Delta,FWT + Delta,Tpcd
-			EMV_Set_FWT(t);
-		}
-	}
+        if(WTXM * EMV_Power(FWI) > EMV_Power(14))
+        {
+                t = 256 * 16 * EMV_Power(14) + 49152 + 222384;                  //FWT + Delta,FWT + Delta,Tpcd
+                EMV_Set_FWT(t);
+        }
+        else
+        {
+                t = WTXM * 256 * 16 * EMV_Power(FWI) + 49152 + 222384;  //WTXM * FWT + Delta,FWT + Delta,Tpcd
+                EMV_Set_FWT(t);
+        }
+    }
 
-	if(cmd == CMD_IBLOCK)
-		WRITEREG(REG_FIFO_DATA, PCB);
-	for(i = 0; i < requestlen && i < FIFO_LENGTH - 3; i++)
-		WRITEREG(REG_FIFO_DATA, request[i]);
 
-	SETBITMASK(REG_IRQ0_CLEAR, 0x20);
-	CLEARBITMASK(REG_IRQ0_CLEAR, 0x20);
+    if(cmd == CMD_IBLOCK)
+    {
+        WRITEREG(REG_FIFO_DATA, PCB);
+    }
+    for(i = 0; i < requestlen && i < FIFO_LENGTH - 3; i++)
+    {
+        WRITEREG(REG_FIFO_DATA, request[i]);
+    }
 
-	if(cmd == CMD_HLTA)
-	{
-		WRITEREG(REG_COMMAND, TRANSMIT);
-	}
-	else
-	{
-		WRITEREG(REG_COMMAND, TRANSCEIVE);
-	}
-	while(i < requestlen)
-	{
 
-		if((READREG(REG_IRQ0_STATE) & 0x20) != 0)
-		{
-			if(requestlen - i > FIFO_LENGTH - WATER_LEVEL - 2)
-			{
-				for(j = 0; j < FIFO_LENGTH - WATER_LEVEL - 2; j++)
-				{
-					WRITEREG(REG_FIFO_DATA, request[i++]);
-				}
-			}
-			else
-			{
-				for(; i< requestlen; i++)
-				{
-					WRITEREG(REG_FIFO_DATA, request[i]);
-				}
-			}
-
-			SETBITMASK(REG_IRQ0_CLEAR, 0x20);
-			CLEARBITMASK(REG_IRQ0_CLEAR, 0x20);
-		}
-	}
+    SETBITMASK(REG_IRQ0_CLEAR, 0x20);
+    CLEARBITMASK(REG_IRQ0_CLEAR, 0x20);
 
-#ifdef MODINDEX_CALI
-	if(cmd == CMD_WUPB || cmd == CMD_REQB)
-	{
-		WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-		WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
-		Nfc_SysTick_Delay_Us(25);
-		RSSI_Num = READREG(REG_AVG_POW);
-		WRITEREG(REG_ADC_CTRL, 0x00);
-		WRITEREG(REG_XTAL_CTRL4, 0x06);
-		WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-		Set_Receive_Parameters(RX_GAIN_30DB,RX_I_R_1K);
-	}
-#endif
-	while((READREG(REG_IRQ0_STATE) & 0x08) == 0)
-	{
-		t2++;
 
-		if(t2 > 0xffff)
-		{
-			return EOT_SHOUT;
-		}
-	}
-	t2=0;
-	SETBITMASK(REG_IRQ0_CLEAR, 0x40);
-	CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
+    if(cmd == CMD_HLTA)
+    {
+        WRITEREG(REG_COMMAND, TRANSMIT);
+    }
+    else
+    {
+        WRITEREG(REG_COMMAND, TRANSCEIVE);
+    }
+    while(i < requestlen)
+    {
+
+        if((READREG(REG_IRQ0_STATE) & 0x20) != 0)
+        {
+            if(requestlen - i > FIFO_LENGTH - WATER_LEVEL - 2)
+            {
+                for(j = 0; j < FIFO_LENGTH - WATER_LEVEL - 2; j++)
+                {
+                        WRITEREG(REG_FIFO_DATA, request[i++]);
+                }
+            }
+            else
+            {
+                for(; i< requestlen; i++)
+                {
+                        WRITEREG(REG_FIFO_DATA, request[i]);
+                }
+            }
 
-	if(cmd == CMD_HLTA)
-		return EMV_ERR_NONE;
 
-	while(1)
-	{
-		t2++;
-		if((READREG(REG_IRQ0_STATE) & 0x01) != 0)  // ��ʱ
-		{
-			#ifdef EMV_DEBUG
-				if(printf_flag)
-				{
-					printf_debug_info(EMV_ERR_TIME_OUT, response, *responselen);
-				}
-			#endif
-			return EMV_ERR_TIME_OUT;
-		}
-
-		if((READREG(REG_IRQ0_STATE) & 0x04) != 0)   //
-		{
-			break;
-		}
-
-
-		if((READREG(REG_IRQ0_STATE) & 0x40) != 0)
-		{
-			break;
-		}
+            SETBITMASK(REG_IRQ0_CLEAR, 0x20);
+            CLEARBITMASK(REG_IRQ0_CLEAR, 0x20);
+        }
+    }
 
-		if(t2 > 0xffff)
-		{
+    t2 = 0;
+    while((READREG(REG_IRQ0_STATE) & 0x08) == 0)
+    {
+        t2++;
+        if(t2 > W_TIME_OUT)
+        {
+            return EOT_SHOUT;
+        }
+    }
+    
+    SETBITMASK(REG_IRQ0_CLEAR, 0x40);
+    CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
 
-			return EOT_SHOUT;
-		}
-	}
-	t2 = 0;
+    if(cmd == CMD_HLTA)
+    {
+        return EMV_ERR_NONE;
+    }
 
-	*responselen = 0;
+    t2=0;
+    while(1)
+    {
+        t2++;
+        if((READREG(REG_IRQ0_STATE) & 0x01) != 0) 
+        {
+            return EMV_ERR_TIME_OUT;
+        }
 
-	while((READREG(REG_IRQ0_STATE) & 0x04) == 0)
-	{
-		t2 ++;
-		if((READREG(REG_IRQ0_STATE) & 0x40) != 0)
-		{
-			for(i = 0; i < FIFO_LENGTH - WATER_LEVEL; i++)
-			{
-				response[*responselen] = READREG(REG_FIFO_DATA);
-				if(*responselen >= FSD)
-					return EMV_ERR_OVERFLOW;
-				else
-					*responselen += 1;
-			}
-
-			SETBITMASK(REG_IRQ0_CLEAR, 0x40);
-			CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
-		}
-
-		if(t2 > 0xffff)
-		{
-			return EOT_SHOUT;
-		}
-	}
-	t2 = 0;
 
-	len = READREG(REG_FIFO_LENGTH);
-	for(i = 0; i < len; i++)
-	{
-		response[*responselen] = READREG(REG_FIFO_DATA);
-		if(*responselen >= FSD)
-				return EMV_ERR_OVERFLOW;
-			else
-				*responselen += 1;
-	}
+        if((READREG(REG_IRQ0_STATE) & 0x04) != 0)
+        {
+            break;
+        }
 
-	err_flag = READREG(REG_ERROR_FLAG);
 
-	if((err_flag & 0x80) || (err_flag & 0x04) || (err_flag & 0x02) || (err_flag & 0x01))
-	{
-		#ifdef EMV_DEBUG
-			if(printf_flag)
-			{
-				printf_debug_info(EMV_ERR_TRANSMISSION, response, *responselen);
-			}
-		#endif
+        if((READREG(REG_IRQ0_STATE) & 0x40) != 0)
+        {
+            break;
+        }
 
-		return EMV_ERR_TRANSMISSION;
-	}
-	return EMV_ERR_NONE;
+        if(t2 > W_TIME_OUT)
+        {
+
+            return EOT_SHOUT;
+        }
+    }
+    
+    t2 = 0;
+    *responselen = 0;
+    while((READREG(REG_IRQ0_STATE) & 0x04) == 0)
+    {
+        t2 ++;
+        if((READREG(REG_IRQ0_STATE) & 0x40) != 0)
+        {
+            for(i = 0; i < FIFO_LENGTH - WATER_LEVEL; i++)
+            {
+                    
+                if(*responselen > FSD)
+                {
+                    return EMV_ERR_OVERFLOW;
+                }
+                if(*responselen < FSD)
+                {
+                    response[*responselen] = READREG(REG_FIFO_DATA);
+                }
+                else
+                {
+                    READREG(REG_FIFO_DATA);
+                }
+                
+                *responselen += 1;
+            }
+
+
+            SETBITMASK(REG_IRQ0_CLEAR, 0x40);
+            CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
+        }
+
+        if(t2 > W_TIME_OUT)
+        {
+                return EOT_SHOUT;
+        }
+    }
+
+    len = READREG(REG_FIFO_LENGTH);
+    for(i = 0; i < len; i++)
+    {
+        if(*responselen > FSD)
+        {
+                return EMV_ERR_OVERFLOW;
+        }
+        if(*responselen < FSD)
+        {
+                response[*responselen] = READREG(REG_FIFO_DATA);
+        }
+        else
+        {
+                READREG(REG_FIFO_DATA);
+        }
+        
+        *responselen += 1;
+    }
+
+    err_flag = READREG(REG_ERROR_FLAG);
+
+    if((err_flag & 0x80) || (err_flag & 0x04) || (err_flag & 0x02) || (err_flag & 0x01))
+    {
+        return EMV_ERR_TRANSMISSION;
+    }
+    return EMV_ERR_NONE;
 }
 
 /**
@@ -605,302 +595,343 @@
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_APDU_Transceive(const unsigned char *inf,
-												unsigned short inflen,
-												unsigned char *res, 
-												unsigned short *reslen)
+                unsigned short inflen,
+                unsigned char *res,
+                unsigned short *reslen)
 {
-	unsigned short i;
+    unsigned short i;
 
-	unsigned char Recv[FSD] = {0};
-	unsigned char S_Block[2] = {0};
-	unsigned char R_Block[1] = {0};
+    unsigned char Recv[FSD] = {0};
+    unsigned char S_Block[2] = {0};
+    unsigned char R_Block[1] = {0};
 
-	unsigned short FSC = 0;
-	unsigned char Send_Len = 0;
-	unsigned short Recv_Len = 0;
-	unsigned char Send_Offset = 0;
-	unsigned char Recv_Offset = 0;
+    unsigned short FSC = 0;
+    unsigned char Send_Len = 0;
+    unsigned short Recv_Len = 0;
+    unsigned char Send_Offset = 0;
+    unsigned char Recv_Offset = 0;
 
-	unsigned char Swtx;
+    unsigned char Swtx;
 
-	unsigned char Time_Out;
+    unsigned char Time_Out;
 
-	unsigned char Tran_Err;
+    unsigned char Tran_Err;
 
-	unsigned char Retran;
+    unsigned char Retran;
 
-	unsigned char Recieving;
-	unsigned char errno = EMV_ERR_NONE;
+    unsigned char Recieving;
+    unsigned char errno = EMV_ERR_NONE;
 
-	if(!inf || !res || !reslen)
-	{
-		return EMV_ERR_PARA;
-	}
+    if(!inf || !res || !reslen)
+    {
+            return EMV_ERR_PARA;
+    }
 
 #define ACK 0x0
 #define NAK 0x10
-#define SendFinish()	((PCB & 0x10) == 0)	
-#define SendRB(type)	do{																			\
-							if(Swtx > 2)															\
-							{																		\
-								return EMV_ERR_TIME_OUT;											\
-							}																		\
-							if(Time_Out > 2)														\
-							{																		\
-								return 	EMV_ERR_TIME_OUT;											\
-							}																		\
-							if(Tran_Err > 2)														\
-							{																		\
-								return EMV_ERR_TRANSMISSION;										\
-							}																		\
-							R_Block[0] = (R_BLOCK << 6) | type | 0x22 | Block_Num;					\
-							errno = EMV_Transceive(CMD_RBLOCK, R_Block, 1, 0, Recv, &Recv_Len, 0);	\
-						}while(0)
-
-	FSC = FSC_Table[FSCI];
-	if(FSC > FSC_CHAINING)
-	{
-		FSC = FSC_CHAINING;
-	}
+#define SendFinish()    ((PCB & 0x10) == 0)
+#define SendRB(type)    do{                                                                                                                                                     \
+                                                    if(Swtx > 2)                                                                                                                    \
+                                                    {                                                                                                                                               \
+                                                            return EMV_ERR_TIME_OUT;                                                                                        \
+                                                    }                                                                                                                                               \
+                                                    if(Time_Out > 2)                                                                                                                \
+                                                    {                                                                                                                                               \
+                                                            return  EMV_ERR_TIME_OUT;                                                                                       \
+                                                    }                                                                                                                                               \
+                                                    if(Tran_Err > 2)                                                                                                                \
+                                                    {                                                                                                                                               \
+                                                            return EMV_ERR_TRANSMISSION;                                                                            \
+                                                    }                                                                                                                                               \
+                                                    R_Block[0] = (R_BLOCK << 6) | type | 0x22 | Block_Num;                                  \
+                                                    errno = EMV_Transceive(CMD_RBLOCK, R_Block, 1, 0, Recv, &Recv_Len, 0);  \
+                                            }while(0)
 
-	*reslen = 0;
+    FSC = FSC_Table[FSCI];
+    if(FSC > FSC_CHAINING)
+    {
+            FSC = FSC_CHAINING;
+    }
 
-	while(1)
-	{
-		if((inflen - Send_Offset) > FSC - 3)
-		{
-			Send_Len = FSC - 3;
-			PCB = 0x12;
-		}
-		else
-		{
-			Send_Len = inflen - Send_Offset;
-			PCB = 0x02;
-		}
-		PCB |= Block_Num;
-		Retran = 0;
-
-send:
-		Swtx = 0;
-		Time_Out = 0;
-		Tran_Err = 0;
-		Recieving = 0;
-		errno = EMV_Transceive(CMD_IBLOCK, inf + Send_Offset, Send_Len, 0, Recv, &Recv_Len, 0);
-
-check:
-		if(errno == EOT_SHOUT)
-		{
-				return EOT_SHOUT;
-		}
-		if(errno == EMV_ERR_TIME_OUT)
-		{
-			Time_Out += 1;
-
-			if(Recieving)
-			{
-				SendRB(ACK);
-			}
-			else
-			{
-				SendRB(NAK);
-			}
-
-			goto check;
-		}
-
-		if(errno == EMV_ERR_TRANSMISSION)
-		{
-			Tran_Err += 1;
-
-			if(Recieving)
-			{
-				SendRB(ACK);
-			}
-			else
-			{
-				SendRB(NAK);
-			}
-
-			goto check;
-		}
-
-		switch((Recv[0] >> 6) & 0x03){
-			case I_BLOCK:
-				if(Recv_Len + 2 > FSD)						//I-Block of length > FSD
-					return EMV_ERR_PROTOCOL;
-				if((Recv[0] & 0x20) || !(Recv[0] & 0x02))	//b6 must be 0, b2 must be 1.
-					return EMV_ERR_PROTOCOL;
-				if((Recv[0] & 0x08) || (Recv[0] & 0x04))	//CID and NAD are not allowed.
-					return EMV_ERR_PROTOCOL;
-				if((Recv[0] & 0x01) != Block_Num)
-					return EMV_ERR_PROTOCOL;
-
-				if(!SendFinish())
-					return EMV_ERR_PROTOCOL;
-
-				Block_Num ^= 0x01;
-				*reslen += Recv_Len - 1;
-				for(i = 1; i < Recv_Len; i++)
-				{
-					(res + Recv_Offset)[i - 1] = Recv[i];
-				}
-				Recv_Offset += Recv_Len - 1;
-
-				if(Recv[0] & 0x10)
-				{
-					Swtx = 0;
-					Time_Out = 0;
-					Tran_Err = 0;
-					Recieving = 1;
-
-					SendRB(ACK);
-
-					goto check;
-				}
-				else
-				{
-					return EMV_ERR_NONE;
-				}
-
-			case R_BLOCK:
-				if(!(Recv[0] & 0x20) || !(Recv[0] & 0x02))
-					return EMV_ERR_PROTOCOL;
-				if((Recv[0] & 0x08) || (Recv[0] & 0x04))
-					return EMV_ERR_PROTOCOL;
-				if(Recv[0] & 0x10)
-					return EMV_ERR_PROTOCOL;
-				else
-				{
-					if(Recieving)
-						return EMV_ERR_PROTOCOL;
-
-					if((Recv[0] & 0x01) != Block_Num)
-					{
-						if(++Retran > 2)
-							return EMV_ERR_PROTOCOL;
-						goto send;
-					}
-
-					if(SendFinish())
-						return EMV_ERR_PROTOCOL;
-
-					Block_Num ^= 0x01;
-					Send_Offset += Send_Len;
-				}
-
-				break;
-
-			case S_BLOCK:
-				if(Recv[0] & 0x01)
-					return EMV_ERR_PROTOCOL;
-				if((Recv[0] & 0x04) || (Recv[0] & 0x08))
-					return EMV_ERR_PROTOCOL;
-				if(!(Recv[0] & 0x02) || ((Recv[0] & 0x30) != 0x30))
-					return EMV_ERR_PROTOCOL;
-
-				WTXM = Recv[1] & 0x3f;
-				if((WTXM < 1) || (WTXM > 59))
-					return EMV_ERR_PROTOCOL;
-
-				S_Block[0] = (S_BLOCK << 6) | 0x30 | 0x02;
-
-				S_Block[1] = WTXM;
-
-				errno = EMV_Transceive(CMD_SBLOCK, S_Block, 2, 0, Recv, &Recv_Len, 0);
-
-				Swtx += 1;
-
-				goto check;
-
-			default:
-				return EMV_ERR_PROTOCOL;
-		}
-	}
-}
+    *reslen = 0;
 
-/*********************************************************** Type A command ***************************************************************/
-/**
-  * @brief  WUPA
-  * @param  None
-  * @retval Error code
-  */
-unsigned char YC_EMV_Contactless_L1_WUPA(void)
-{
-	unsigned char i;
-	unsigned short len = 0;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char WUPA[1];
-	unsigned char ATQA[2];
+    while(1)
+    {
+        if((inflen - Send_Offset) > FSC - 3)
+        {
+            Send_Len = FSC - 3;
+            PCB = 0x12;
+        }
+        else
+        {
+            Send_Len = inflen - Send_Offset;
+            PCB = 0x02;
+        }
+        PCB |= Block_Num;
+        Retran = 0;
 
-	YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_A);
-	Tp();
-	WUPA[0] = 0x52;
+    send:
+        Swtx = 0;
+        Time_Out = 0;
+        Tran_Err = 0;
+        Recieving = 0;
+        errno = EMV_Transceive(CMD_IBLOCK, inf + Send_Offset, Send_Len, 0, Recv, &Recv_Len, 0);
 
-	#if defined (SDK_DEBUG)
-  	PRINT("WUPA ->: %02x\r\n", WUPA[0]);
-  	#endif
+    check:
+        if(errno == EOT_SHOUT)
+        {
+            return EOT_SHOUT;
+        }
+        if(errno == EMV_ERR_TIME_OUT)
+        {
+            Time_Out += 1;
 
-	Set_Receive_Parameters(RX_GAIN_18DB,RX_I_R_500);
+            if(Recieving)
+            {
+                    SendRB(ACK);
+            }
+            else
+            {
+                    SendRB(NAK);
+            }
 
-	errno = EMV_Transceive(CMD_WUPA, WUPA, 1, 7, ATQA, &len, 0);
+            goto check;
+        }
 
-	if(errno == EMV_ERR_NONE)
-	{
-		#if defined (SDK_DEBUG)
-		PRINT("ATQA <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", ATQA[i]);
-		}
-		PRINT("\r\n");
-		#endif
+        if(errno == EMV_ERR_TRANSMISSION)
+        {
+            Tran_Err += 1;
 
-		if(len != 2)
-			return EMV_ERR_PROTOCOL;
-	}
+            if(Recieving)
+            {
+                    SendRB(ACK);
+            }
+            else
+            {
+                    SendRB(NAK);
+            }
 
-	return errno;
-}
+            goto check;
+        }
 
-/**
-  * @brief  REQA
-  * @param  None
-  * @retval Error code
-  */
-unsigned char YC_EMV_Contactless_L1_REQA(void)
-{
-	unsigned char i;
-	unsigned short len = 0;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char REQA[1];
-	unsigned char ATQA[2];
+        switch((Recv[0] >> 6) & 0x03)
+        {
+            case I_BLOCK:
+                if(Recv_Len + 2 > FSD)                                          //I-Block of length > FSD
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if((Recv[0] & 0x20) || !(Recv[0] & 0x02))       //b6 must be 0, b2 must be 1.
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if((Recv[0] & 0x08) || (Recv[0] & 0x04))        //CID and NAD are not allowed.
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if((Recv[0] & 0x01) != Block_Num)
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
 
-	REQA[0] = 0x26;
+                if(!SendFinish())
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
 
+                Block_Num ^= 0x01;
+                *reslen += Recv_Len - 1;
+                for(i = 1; i < Recv_Len; i++)
+                {
+                        (res + Recv_Offset)[i - 1] = Recv[i];
+                }
+                Recv_Offset += Recv_Len - 1;
 
-	#if defined (SDK_DEBUG)
-  	PRINT("REQA ->: %02x\r\n", REQA[0]);
-  	#endif
+                if(Recv[0] & 0x10)
+                {
+                        Swtx = 0;
+                        Time_Out = 0;
+                        Tran_Err = 0;
+                        Recieving = 1;
 
-	errno = EMV_Transceive(CMD_REQA, REQA, 1, 7, ATQA, &len, 0);
+                        SendRB(ACK);
 
+                        goto check;
+                }
+                else
+                {
+                        return EMV_ERR_NONE;
+                }
 
-	if(errno == EMV_ERR_NONE)
-	{
-		#if defined (SDK_DEBUG)
-		PRINT("ATQA <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", ATQA[i]);
-		}
-		PRINT("\r\n");
-		#endif
+            case R_BLOCK:
+                if(!(Recv[0] & 0x20) || !(Recv[0] & 0x02))
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if((Recv[0] & 0x08) || (Recv[0] & 0x04))
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if(Recv[0] & 0x10)
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                else
+                {
+                        if(Recieving)
+                        {
+                                return EMV_ERR_PROTOCOL;
+                        }
 
-		if(len != 2)
-			return EMV_ERR_PROTOCOL;
-	}
 
-	return errno;
+                        if((Recv[0] & 0x01) != Block_Num)
+                        {
+                                if(++Retran > 2)
+                                {
+                                        return EMV_ERR_PROTOCOL;
+                                }
+
+                                goto send;
+                        }
+
+
+                        if(SendFinish())
+                        {
+                                return EMV_ERR_PROTOCOL;
+                        }
+
+
+                        Block_Num ^= 0x01;
+                        Send_Offset += Send_Len;
+                }
+
+            break;
+
+            case S_BLOCK:
+                if(Recv[0] & 0x01)
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if((Recv[0] & 0x04) || (Recv[0] & 0x08))
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+                if(!(Recv[0] & 0x02) || ((Recv[0] & 0x30) != 0x30))
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+
+
+                WTXM = Recv[1] & 0x3f;
+                if((WTXM < 1) || (WTXM > 59))
+                {
+                        return EMV_ERR_PROTOCOL;
+                }
+
+
+                S_Block[0] = (S_BLOCK << 6) | 0x30 | 0x02;
+
+                S_Block[1] = WTXM;
+
+                errno = EMV_Transceive(CMD_SBLOCK, S_Block, 2, 0, Recv, &Recv_Len, 0);
+
+                Swtx += 1;
+
+            goto check;
+
+            default:
+                return EMV_ERR_PROTOCOL;
+        }
+    }
+}
+
+/*********************************************************** Type A command ***************************************************************/
+/**
+  * @brief  WUPA
+  * @param  None
+  * @retval Error code
+  */
+unsigned char YC_EMV_Contactless_L1_WUPA(void)
+{
+    unsigned char i;
+    unsigned short len = 0;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char WUPA[1];
+    unsigned char ATQA[FSD];
+
+
+    YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_A);
+    Tp();
+    WUPA[0] = 0x52;
+
+
+#if defined (SDK_DEBUG)
+    PRINT("WUPA ->: %02x\r\n", WUPA[0]);
+#endif
+    Set_Receive_Parameters(RX_GAIN_18DB,RX_I_R_500);
+
+    errno = EMV_Transceive(CMD_WUPA, WUPA, 1, 7, ATQA, &len, 0);
+    if(errno == EMV_ERR_NONE)
+    {
+
+#if defined (SDK_DEBUG)
+        PRINT("ATQA <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", ATQA[i]);
+        }
+        PRINT("\r\n");
+#endif
+        if(len != 2)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+    }
+
+    return errno;
+}
+
+/**
+  * @brief  REQA
+  * @param  None
+  * @retval Error code
+  */
+unsigned char YC_EMV_Contactless_L1_REQA(void)
+{
+    unsigned char i;
+    unsigned short len = 0;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char REQA[1];
+    unsigned char ATQA[FSD];
+
+    REQA[0] = 0x26;
+
+
+#if defined (SDK_DEBUG)
+    PRINT("REQA ->: %02x\r\n", REQA[0]);
+#endif
+
+    errno = EMV_Transceive(CMD_REQA, REQA, 1, 7, ATQA, &len, 0);
+
+
+    if(errno == EMV_ERR_NONE)
+    {
+#if defined (SDK_DEBUG)
+        PRINT("ATQA <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", ATQA[i]);
+        }
+        PRINT("\r\n");
+#endif
+
+        if(len != 2)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+    }
+
+    return errno;
 }
 
 /**
@@ -914,83 +945,88 @@
   */
 unsigned char YC_EMV_Contactless_L1_ANTICOLLISION(unsigned char cl)
 {
-	unsigned char i;
-	unsigned short len =0;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char ANTICOLLISION[2];
-	unsigned char UID_CLn_Temp[5];
-
-	ANTICOLLISION[0] = cl;
-	ANTICOLLISION[1] = 0x20;
-
-
-	SETBITMASK(REG_RX_BIT_CTRL, 0x10);
-	CLEARBITMASK(REG_RX_BIT_CTRL, 0x08);
-
-	#if defined (SDK_DEBUG)
-	PRINT("ANTICOLLISION ->: ");
-	for(i = 0; i < 2; i++)
-	{
-		PRINT("%02x ", ANTICOLLISION[i]);
-	}
-	PRINT("\r\n");
-	#endif
+    unsigned char i;
+    unsigned short len =0;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char ANTICOLLISION[2];
+    unsigned char  UID_CLn_Temp[FSD];
+
+    ANTICOLLISION[0] = cl;
+    ANTICOLLISION[1] = 0x20;
+
+
+    SETBITMASK(REG_RX_BIT_CTRL, 0x10);
+    CLEARBITMASK(REG_RX_BIT_CTRL, 0x08);
+
+#if defined (SDK_DEBUG)
+    PRINT("ANTICOLLISION ->: ");
+    for(i = 0; i < 2; i++)
+    {
+            PRINT("%02x ", ANTICOLLISION[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-	errno = EMV_Transceive(CMD_ANTICOLLISION, ANTICOLLISION, 2, 0, UID_CLn_Temp, &len, 0);
+    errno = EMV_Transceive(CMD_ANTICOLLISION, ANTICOLLISION, 2, 0, UID_CLn_Temp, &len, 0);
 
-	#if defined (SDK_DEBUG)
-	PRINT("\r\n");
-	#endif
-	CLEARBITMASK(REG_RX_BIT_CTRL, 0x10);
-	SETBITMASK(REG_RX_BIT_CTRL, 0x08);
+#if defined (SDK_DEBUG)
+        PRINT("\r\n");
+#endif
+    CLEARBITMASK(REG_RX_BIT_CTRL, 0x10);
+    SETBITMASK(REG_RX_BIT_CTRL, 0x08);
 
 
-	if(errno == EMV_ERR_NONE)
-	{
+    if(errno == EMV_ERR_NONE)
+    {
 
-		#if defined (SDK_DEBUG)
-		PRINT("UID CLn <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", UID_CLn_Temp[i]);
-		}
-		PRINT("\r\n");
-		#endif
-		if(len != 5)
-			return EMV_ERR_PROTOCOL;
-
-		if(UID_CLn_Temp[4] != (((UID_CLn_Temp[0] ^ UID_CLn_Temp[1]) ^ UID_CLn_Temp[2]) ^ UID_CLn_Temp[3]))
-		{
-			return EMV_ERR_TRANSMISSION;
-		}
-		switch(cl){
-			case CL1:
-				for(i = 0; i < len; i++)
-				{
-					picc_a.UID_CLn[0][i] = UID_CLn_Temp[i];
-				}
-				break;
-
-			case CL2:
-				for(i = 0; i < len; i++)
-				{
-					picc_a.UID_CLn[1][i] = UID_CLn_Temp[i];
-				}
-				break;
-
-			case CL3:
-				for(i = 0; i < len; i++)
-				{
-					picc_a.UID_CLn[2][i] = UID_CLn_Temp[i];
-				}
-				break;
-
-			default:
-				return EMV_ERR_PARA;
-		}
-	}
+#if defined (SDK_DEBUG)
+        PRINT("UID CLn <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", UID_CLn_Temp[i]);
+        }
+        PRINT("\r\n");
+#endif
+            if(len != 5)
+            {
+                return EMV_ERR_PROTOCOL;
+            }
+
+
+            if(UID_CLn_Temp[4] != (((UID_CLn_Temp[0] ^ UID_CLn_Temp[1]) ^ UID_CLn_Temp[2]) ^ UID_CLn_Temp[3]))
+            {
+                    return EMV_ERR_TRANSMISSION;
+
+            }
+            switch(cl)
+            {
+                case CL1:
+                    for(i = 0; i < len; i++)
+                    {
+                            picc_a.UID_CLn[0][i] = UID_CLn_Temp[i];
+                    }
+                    break;
+
+                case CL2:
+                    for(i = 0; i < len; i++)
+                    {
+                            picc_a.UID_CLn[1][i] = UID_CLn_Temp[i];
+                    }
+                    break;
+
+                case CL3:
+                    for(i = 0; i < len; i++)
+                    {
+                            picc_a.UID_CLn[2][i] = UID_CLn_Temp[i];
+                    }
+                    break;
+
+                default:
+                    return EMV_ERR_PARA;
+            }
+    }
 
-	return errno;
+    return errno;
 }
 
 /**
@@ -1002,88 +1038,96 @@
   *     @arg CL2: cascase level 2
   *     @arg CL2: cascase level 3
   * @param  UID_complete:
-  *			  1: UID not complete
-  *			  0: UID complete
-  * 	@note if not use this value, can input NULL
+  *                       1: UID not complete
+  *                       0: UID complete
+  *     @note if not use this value, can input NULL
   * @param  ISOIEC14443_4_compliant:
   *           1: PICC compliant with ISO/IEC 14443-4
   *           0: PICC not compliant with ISO/IEC 14443-4
-  * 	@note if not use this value, can input NULL
+  *     @note if not use this value, can input NULL
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_SELECT(unsigned char cl,
-										unsigned char *UID_complete,
-										unsigned char *ISOIEC14443_4_compliant)
+                unsigned char *UID_complete,
+                unsigned char *ISOIEC14443_4_compliant)
 {
-	unsigned char i;
-	unsigned short len = 0;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char SELECT[7];
-	unsigned char SAK[1];
-
-	SELECT[0] = cl;
-	SELECT[1] = 0x70;
-
-	switch(cl){
-		case CL1:
-			for(i = 0; i < 5; i++)
-			{
-				SELECT[2 + i] = picc_a.UID_CLn[0][i];
-			}
-			break;
-
-		case CL2:
-			for(i = 0; i < 5; i++)
-			{
-				SELECT[2 + i] = picc_a.UID_CLn[1][i];
-			}
-			break;
-
-		case CL3:
-			for(i = 0; i < 5; i++)
-			{
-				SELECT[2 + i] = picc_a.UID_CLn[2][i];
-			}
-			break;
+    unsigned char i;
+    unsigned short len = 0;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char SELECT[7];
+    unsigned char SAK[FSD];
 
-		default:
-			return EMV_ERR_PARA;
-	}
+    SELECT[0] = cl;
+    SELECT[1] = 0x70;
 
+    switch(cl)
+    {
+        case CL1:
+            for(i = 0; i < 5; i++)
+            {
+                    SELECT[2 + i] = picc_a.UID_CLn[0][i];
+            }
+        break;
 
-	#if defined (SDK_DEBUG)
-	PRINT("SELECT ->: ");
-	for(i = 0; i < 7; i++)
-	{
-		PRINT("%02x ", SELECT[i]);
-	}
-	PRINT("\r\n");
-	#endif
+        case CL2:
+            for(i = 0; i < 5; i++)
+            {
+                    SELECT[2 + i] = picc_a.UID_CLn[1][i];
+            }
+        break;
 
-	errno = EMV_Transceive(CMD_SELECT, SELECT, 7, 0, SAK, &len, 0);
+        case CL3:
+            for(i = 0; i < 5; i++)
+            {
+                    SELECT[2 + i] = picc_a.UID_CLn[2][i];
+            }
+        break;
 
-	if(errno == EMV_ERR_NONE)
-	{
-		#if defined (SDK_DEBUG)
-		PRINT("SAK <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", SAK[i]);
-		}
-		PRINT("\r\n");
-		#endif
+        default:
+            return EMV_ERR_PARA;
+    }
 
-		if(len != 1)
-			return EMV_ERR_PROTOCOL;
 
-		if(UID_complete)
-			*UID_complete = (SAK[0] >> 2) & 0x01;
+#if defined (SDK_DEBUG)
+    PRINT("SELECT ->: ");
+    for(i = 0; i < 7; i++)
+    {
+            PRINT("%02x ", SELECT[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-		if(ISOIEC14443_4_compliant)
-			*ISOIEC14443_4_compliant = (SAK[0] >> 5) & 0x01;
-	}
 
-	return errno;
+    errno = EMV_Transceive(CMD_SELECT, SELECT, 7, 0, SAK, &len, 0);
+
+    if(errno == EMV_ERR_NONE)
+    {
+#if defined (SDK_DEBUG)
+        PRINT("SAK <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", SAK[i]);
+        }
+        PRINT("\r\n");
+#endif
+
+        if(len != 1)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+        if(UID_complete)
+        {
+                *UID_complete = (SAK[0] >> 2) & 0x01;
+        }
+
+        if(ISOIEC14443_4_compliant)
+        {
+                *ISOIEC14443_4_compliant = (SAK[0] >> 5) & 0x01;
+        }
+    }
+
+    return errno;
 }
 
 /**
@@ -1093,120 +1137,131 @@
   */
 unsigned char YC_EMV_Contactless_L1_RATS(void)
 {
-	unsigned char i;
-	unsigned short len= 0;
-	unsigned char SFGI;
-	unsigned char TA = 0, TB = 0, TC = 0;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char RATS[2];
+    unsigned char i;
+    unsigned short len= 0;
+    unsigned char SFGI;
+    unsigned char TA = 0, TB = 0, TC = 0;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char RATS[2];
 
-	unsigned char ATS[20];
+    unsigned char ATS[FSD];
 
-	RATS[0] = 0xE0;
+    RATS[0] = 0xE0;
 
-	RATS[1] = ((0x8 & 0xf) << 4);
+    RATS[1] = ((0x8 & 0xf) << 4);
 
-	SETBITMASK(REG_RX_CODER_CTRL, 0x20);
+    SETBITMASK(REG_RX_CODER_CTRL, 0x20);
 
-	#if defined (SDK_DEBUG)
-	PRINT("RATS ->: ");
-	for(i = 0; i < 2; i++)
-	{
-		PRINT("%02x ", RATS[i]);
-	}
-	PRINT("\r\n");
-	#endif
+#if defined (SDK_DEBUG)
+    PRINT("RATS ->: ");
+    for(i = 0; i < 2; i++)
+    {
+            PRINT("%02x ", RATS[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-	errno = EMV_Transceive(CMD_RATS, RATS, 2, 0, ATS, &len, 0);
+    errno = EMV_Transceive(CMD_RATS, RATS, 2, 0, ATS, &len, 0);
 
-	if(errno == EMV_ERR_NONE)
-	{
-		#if defined (SDK_DEBUG)
-		PRINT("ATS <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", ATS[i]);
-		}
-		PRINT("\r\n");
-		#endif
+    if(errno == EMV_ERR_NONE)
+    {
+#if defined (SDK_DEBUG)
+        PRINT("ATS <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", ATS[i]);
+        }
+        PRINT("\r\n");
+#endif
 
-		if(ATS[0] != len)
-			return EMV_ERR_PROTOCOL;
+        if(ATS[0] != len)
+        {
+            return EMV_ERR_PROTOCOL;
+        }
 
-		FWI = 4;
-		FSCI = 2;
+        FWI = 4;
+        FSCI = 2;
 
-		if(ATS[0] != 1)
-		{
-			if((ATS[1] & 0xf) > 0xc)
-			{
-				FSCI = 0xc;
-			}
-			else
-			{
-				FSCI = ATS[1] & 0xf;
-			}
+        if(ATS[0] != 1)
+        {
+            if((ATS[1] & 0xf) > 0xc)
+            {
+                FSCI = 0xc;
+            }
+            else
+            {
+                FSCI = ATS[1] & 0xf;
+            }
 
-			if(ATS[1] & 0x10)
-				TA = 1;
+            if(ATS[1] & 0x10)
+            {
+                TA = 1;
+            }
 
-			if(ATS[1] & 0x20)
-				TB = 1;
+            if(ATS[1] & 0x20)
+            {
+                TB = 1;
+            }
 
-			if(ATS[1] & 0x40)
-				TC = 1;
+            if(ATS[1] & 0x40)
+            {
+                TC = 1;
+            }
 
-			if(TA)
-			{
+            if(TA)
+            {
 
 
-			}
+            }
 
-			if(TB)
-			{
+            if(TB)
+            {
 
-				if(((ATS[2+TA] >> 4) & 0x0f) == 15)
-				{
-					FWI = 4;
-				}
-				else
-				{
-					FWI = (ATS[2+TA] >> 4) & 0x0f;
-				}
+                if(((ATS[2+TA] >> 4) & 0x0f) == 15)
+                {
+                    FWI = 4;
+                }
+                else
+                {
+                    FWI = (ATS[2+TA] >> 4) & 0x0f;
+                }
 
-				if((ATS[2+TA] & 0x0f) == 15)
-				{
 
-				}
-				else
-				{
+                if((ATS[2+TA] & 0x0f) == 15)
+                {
 
-					SFGI = ATS[2+TA] & 0x0f;
+                }
+                else
+                {
+                    SFGI = ATS[2+TA] & 0x0f;
 
-					WRITEREG(REG_T_PRESCAL_HI, (4480 >> 8) & 0x1f);
-					WRITEREG(REG_T_PRESCAL_LO, 4480 & 0xff);
-					WRITEREG(REG_T_RELOAD_HI, (EMV_Power(SFGI) >> 8) & 0xff);
-					WRITEREG(REG_T_RELOAD_LO, EMV_Power(SFGI) & 0xff);
+                    WRITEREG(REG_T_PRESCAL_HI, (4480 >> 8) & 0x1f);
+                    WRITEREG(REG_T_PRESCAL_LO, 4480 & 0xff);
+                    WRITEREG(REG_T_RELOAD_HI, (EMV_Power(SFGI) >> 8) & 0xff);
+                    WRITEREG(REG_T_RELOAD_LO, EMV_Power(SFGI) & 0xff);
 
-					SETBITMASK(REG_IRQ0_CLEAR, 0x01);
-					CLEARBITMASK(REG_IRQ0_CLEAR, 0x01);
 
-					WRITEREG(REG_T_CTRL, 0x01);
-					WRITEREG(REG_T_CTRL, 0x00);
+                    SETBITMASK(REG_IRQ0_CLEAR, 0x01);
+                    CLEARBITMASK(REG_IRQ0_CLEAR, 0x01);
 
-					while((READREG(REG_IRQ0_STATE) & 0x01) == 0);
-				}
-			}
 
-			if(TC)
-			{
+                    WRITEREG(REG_T_CTRL, 0x01);
+                    WRITEREG(REG_T_CTRL, 0x00);
 
-			}
+                    while((READREG(REG_IRQ0_STATE) & 0x01) == 0);
+                }
+            }
+
+            if(TC)
+            {
+
+            }
 
-		}
-	}
 
-	return errno;
+        }
+    }
+
+    return errno;
 }
 
 /**
@@ -1216,175 +1271,120 @@
   */
 void YC_EMV_Contactless_L1_HLTA(void)
 {
-	unsigned char i;
-	unsigned char HLTA[2];
+    unsigned char i;
+    unsigned char HLTA[2];
 
-	HLTA[0] = 0x50;
-	HLTA[1] = 0x00;
-
-	#if defined (SDK_DEBUG)
-	PRINT("HLTA ->: ");
-	for(i = 0; i < 2; i++)
-	{
-		PRINT("%02x ", HLTA[i]);
-	}
-	PRINT("\r\n");
-	#endif
+    HLTA[0] = 0x50;
+    HLTA[1] = 0x00;
 
+#if defined (SDK_DEBUG)
+    PRINT("HLTA ->: ");
+    for(i = 0; i < 2; i++)
+    {
+            PRINT("%02x ", HLTA[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-	EMV_Transceive(CMD_HLTA, HLTA, 2, 0, NULL, NULL, 0);
+    EMV_Transceive(CMD_HLTA, HLTA, 2, 0, NULL, NULL, 0);
 }
 
 /*********************************************************** Type B command ***************************************************************/
-unsigned char read_power_x(uint8_t gain)
-{
-    unsigned char i=0;
-	set_dc_win(WIN_SIZE_64);
-	WRITEREG(REG_TX_PA_GAIN, gain);
-	Set_Receive_Parameters(RX_GAIN_12DB,RX_I_R_1K);
-	WRITEREG(REG_ADC_CTRL, 0x08);
-	WRITEREG(REG_XTAL_CTRL4, 0x07);
-	i = read_power_index();
-	WRITEREG(REG_XTAL_CTRL4, 0x06);
-	WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-	return i;
-}
-
-void Auto_calibration_modindex_loop(void)
-{
-	RSSI_max = read_power_x(0x7f);
-	set_dc_win(WIN_SIZE_64);
-	WRITEREG(REG_TX_PA_GAIN, 0x7f);
-	WRITEREG(REG_ADC_CTRL, 0x08);
-	WRITEREG(REG_XTAL_CTRL4, 0x07);
-}
-
-void auto_digtal_modindex(void)
-{
-	uint16_t RSSI_variable =0;
-	uint16_t RSSI_index = 0;
-	if(RSSI_max > 0x60)
-	{
-		RSSI_variable = (RSSI_max * 100) / 1.26;//1.24
-		}
-		else if( RSSI_max>= 0x30 && RSSI_max<=0x60)//0x50
-		{
-			RSSI_variable = (RSSI_max * 100) / 1.30;//1.26
-		}
-		else if ( RSSI_max >0x20 && RSSI_max <0x30)
-		{
-			RSSI_variable = (RSSI_max * 100) / 1.25;// /**/1.32;
-		}
-		else
-		{
-			RSSI_variable = (RSSI_max * 100) / 1.3;//1.6
-		}
-		RSSI_index =  RSSI_variable /100;
-		RSSI_variable = RSSI_variable % 100;
-		if(RSSI_variable>=50) RSSI_index +=1;
-
-		if( RSSI_Num < RSSI_index)
-		{
-			mod_index += (RSSI_index - RSSI_Num);
-		}
-		else
-		{
-			mod_index -= (RSSI_Num - RSSI_index);
-		}
-
-		if(mod_index > 0x70) mod_index = 0x3e;
-		else if(mod_index < 0x05) mod_index = 0x10;
-}
 /**
   * @brief  WUPB
   * @param  ISOIEC14443_4_compliant:
   *           1: PICC compliant with ISO/IEC 14443-4
   *           0: PICC not compliant with ISO/IEC 14443-4
-  * 	@note if not use this value, can input NULL
+  *     @note if not use this value, can input NULL
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_WUPB(unsigned char *ISOIEC14443_4_compliant)
 {
-	unsigned char i;
-	unsigned short len = 0;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char ATQB[13];
-	unsigned char WUPB[3];
-#ifdef MODINDEX_CALI
-	Auto_calibration_modindex_loop();
-#endif
-	YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
-	Nfc_SysTick_Delay_Ms(3);
-
-	WUPB[0] = 0x05;
-
-	WUPB[1] = 0x00;
-
-	WUPB[2] = 0x08;
-
-	#if defined (SDK_DEBUG)
-	PRINT("WUPB ->: ");
-	for(i = 0; i < 3; i++)
-	{
-		PRINT("%02x ", WUPB[i]);
-	}
-	PRINT("\r\n");
-	#endif
+    unsigned char i;
+    unsigned short len = 0;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char ATQB[FSD];
+    unsigned char WUPB[3];
+
+    YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
+    Nfc_SysTick_Delay_Ms(3);
+
+    WUPB[0] = 0x05;
+    WUPB[1] = 0x00;
+    WUPB[2] = 0x08;
+
+#if defined (SDK_DEBUG)
+    PRINT("WUPB ->: ");
+    for(i = 0; i < 3; i++)
+    {
+            PRINT("%02x ", WUPB[i]);
+    }
+    PRINT("\r\n");
+#endif
 
 
-	errno = EMV_Transceive(CMD_WUPB, WUPB, 3, 0, ATQB, &len, 0);
+    errno = EMV_Transceive(CMD_WUPB, WUPB, 3, 0, ATQB, &len, 0);
 
-	if(errno == EMV_ERR_NONE)
-	{
+    if(errno == EMV_ERR_NONE)
+    {
 
-		#if defined (SDK_DEBUG)
-		PRINT("ATQB <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", ATQB[i]);
-		}
-		PRINT("\r\n");
-		#endif
-
-		if(ATQB[0] != 0x50)
-			return EMV_ERR_PROTOCOL;
-
-		if(len < 12)
-			return EMV_ERR_PROTOCOL;
-
-		for(i = 0; i < 4; i++)
-		{
-			picc_b.PUPI[i] = ATQB[1 + i];
-		}
-
-		if(((ATQB[10] >> 4) & 0xf) > 0xc)
-		{
-			FSCI = 0xc;
-		}
-		else
-		{
-			FSCI = (ATQB[10] >> 4) & 0xf;
-		}
-
-		if(ISOIEC14443_4_compliant)
-			*ISOIEC14443_4_compliant = ATQB[10] & 0x1;
-
-		if((ATQB[10] & 0x8) != 0)
-			return EMV_ERR_PROTOCOL;
-
-		if(((ATQB[11] >> 4) & 0xf) == 15)
-		{
-			FWI = 4;
-		}
-		else
-		{
-			FWI = (ATQB[11] >> 4) & 0xf;
-		}
-	}
-#ifdef MODINDEX_CALI
-	auto_digtal_modindex();
+#if defined (SDK_DEBUG)
+        PRINT("ATQB <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", ATQB[i]);
+        }
+        PRINT("\r\n");
 #endif
-	return errno;
+
+        if(ATQB[0] != 0x50)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+        if(len < 12)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+
+        for(i = 0; i < 4; i++)
+        {
+                picc_b.PUPI[i] = ATQB[1 + i];
+        }
+
+
+        if(((ATQB[10] >> 4) & 0xf) > 0xc)
+        {
+                FSCI = 0xc;
+        }
+        else
+        {
+                FSCI = (ATQB[10] >> 4) & 0xf;
+        }
+
+
+        if(ISOIEC14443_4_compliant)
+        {
+                *ISOIEC14443_4_compliant = ATQB[10] & 0x1;
+        }
+
+        if((ATQB[10] & 0x8) != 0)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+
+        if(((ATQB[11] >> 4) & 0xf) == 15)
+        {
+                FWI = 4;
+        }
+        else
+        {
+                FWI = (ATQB[11] >> 4) & 0xf;
+        }
+    }
+    return errno;
 }
 
 /**
@@ -1392,89 +1392,100 @@
   * @param  ISOIEC14443_4_compliant:
   *           1: PICC compliant with ISO/IEC 14443-4
   *           0: PICC not compliant with ISO/IEC 14443-4
-  * 	@note if not use this value, can input NULL
+  *     @note if not use this value, can input NULL
   * @retval Error code
   */
 unsigned char YC_EMV_Contactless_L1_REQB(unsigned char *ISOIEC14443_4_compliant)
 {
-	unsigned char i;
-	unsigned short len;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char ATQB[13];
-	unsigned char REQB[3];
+    unsigned char i;
+    unsigned short len;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char ATQB[FSD];
+    unsigned char REQB[3];
 
-	Auto_calibration_modindex_loop();
-	YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
-	Nfc_SysTick_Delay_Ms(3);
+    YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
+    Nfc_SysTick_Delay_Ms(3);
 
-	REQB[0] = 0x05;
+    REQB[0] = 0x05;
 
-	REQB[1] = 0x00;
+    REQB[1] = 0x00;
 
-	REQB[2] = 0x00;
+    REQB[2] = 0x00;
 
 
-	#if defined (SDK_DEBUG)
-	PRINT("REQB ->: ");
-	for(i = 0; i < 3; i++)
-	{
-		PRINT("%02x ", REQB[i]);
-	}
-	PRINT("\r\n");
-	#endif
+#if defined (SDK_DEBUG)
+    PRINT("REQB ->: ");
+    for(i = 0; i < 3; i++)
+    {
+            PRINT("%02x ", REQB[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-	errno = EMV_Transceive(CMD_REQB, REQB, 3, 0, ATQB, &len, 0);
+    errno = EMV_Transceive(CMD_REQB, REQB, 3, 0, ATQB, &len, 0);
 
-	if(errno == EMV_ERR_NONE)
-	{
-		#if defined (SDK_DEBUG)
-		PRINT("ATQB <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", ATQB[i]);
-		}
-		PRINT("\r\n");
-		#endif
-
-		if(ATQB[0] != 0x50)
-			return EMV_ERR_PROTOCOL;
-
-		if(len < 12)
-			return EMV_ERR_PROTOCOL;
-
-		for(i = 0; i < 4; i++)
-		{
-			picc_b.PUPI[i] = ATQB[1 + i];
-		}
-
-		if(((ATQB[10] >> 4) & 0xf) > 0xc)
-		{
-			FSCI = 0xc;
-		}
-		else
-		{
-			FSCI = (ATQB[10] >> 4) & 0xf;
-		}
-
-		if(ISOIEC14443_4_compliant)
-			*ISOIEC14443_4_compliant = ATQB[10] & 0x1;
-
-		if((ATQB[10] & 0x8) != 0)
-			return EMV_ERR_PROTOCOL;
-
-		if(((ATQB[11] >> 4) & 0xf) == 15)
-		{
-			FWI = 4;
-		}
-		else
-		{
-			FWI = (ATQB[11] >> 4) & 0xf;
-		}
+    if(errno == EMV_ERR_NONE)
+    {
 
-	}
-	auto_digtal_modindex();
 
-	return errno;
+    #if defined (SDK_DEBUG)
+        PRINT("ATQB <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", ATQB[i]);
+        }
+        PRINT("\r\n");
+    #endif
+
+        if(ATQB[0] != 0x50)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+        if(len < 12)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+
+        for(i = 0; i < 4; i++)
+        {
+                picc_b.PUPI[i] = ATQB[1 + i];
+        }
+
+
+        if(((ATQB[10] >> 4) & 0xf) > 0xc)
+        {
+                FSCI = 0xc;
+        }
+        else
+        {
+                FSCI = (ATQB[10] >> 4) & 0xf;
+        }
+
+
+        if(ISOIEC14443_4_compliant)
+        {
+                *ISOIEC14443_4_compliant = ATQB[10] & 0x1;
+        }
+
+        if((ATQB[10] & 0x8) != 0)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+
+        if(((ATQB[11] >> 4) & 0xf) == 15)
+        {
+                FWI = 4;
+        }
+        else
+        {
+                FWI = (ATQB[11] >> 4) & 0xf;
+        }
+
+    }
+    return errno;
 }
 
 /**
@@ -1484,59 +1495,69 @@
   */
 unsigned char YC_EMV_Contactless_L1_ATTRIB(void)
 {
-	unsigned char i;
-	unsigned short len;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char ATTRIB[9];
-	unsigned char ATTRIB_RES[1];
+    unsigned char i;
+    unsigned short len;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char ATTRIB[9];
+    unsigned char  ATTRIB_RES[FSD];
 
-	ATTRIB[0] = 0x1D;
+    ATTRIB[0] = 0x1D;
 
-	ATTRIB[1] = picc_b.PUPI[0];
-	ATTRIB[2] = picc_b.PUPI[1];
-	ATTRIB[3] = picc_b.PUPI[2];
-	ATTRIB[4] = picc_b.PUPI[3];
+    ATTRIB[1] = picc_b.PUPI[0];
+    ATTRIB[2] = picc_b.PUPI[1];
+    ATTRIB[3] = picc_b.PUPI[2];
+    ATTRIB[4] = picc_b.PUPI[3];
 
-	ATTRIB[5] = 0x00;
+    ATTRIB[5] = 0x00;
 
-	ATTRIB[6] = 0x8 & 0xf;
+    ATTRIB[6] = 0x8 & 0xf;
 
-	ATTRIB[7] = 0x01;
+    ATTRIB[7] = 0x01;
 
-	ATTRIB[8] = 0x00;
+    ATTRIB[8] = 0x00;
 
-	SETBITMASK(REG_RX_CODER_CTRL, 0x20);
 
-	#if defined (SDK_DEBUG)
-	PRINT("ATTRIB ->: ");
-	for(i = 0; i < 9; i++)
-	{
-		PRINT("%02x ", ATTRIB[i]);
-	}
-	PRINT("\r\n");
-	#endif
+    SETBITMASK(REG_RX_CODER_CTRL, 0x20);
 
-	errno = EMV_Transceive(CMD_ATTRIB, ATTRIB, 9, 0, ATTRIB_RES, &len, 0);
+#if defined (SDK_DEBUG)
+    PRINT("ATTRIB ->: ");
+    for(i = 0; i < 9; i++)
+    {
+            PRINT("%02x ", ATTRIB[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-	if(errno == EMV_ERR_NONE)
-	{
-		#if defined (SDK_DEBUG)
-		PRINT("ATTRIB_RES <-: ");
-		for(i = 0; i < len; i++)
-		{
-			PRINT("%02x ", ATTRIB_RES[i]);
-		}
-		PRINT("\r\n");
-		#endif
+    errno = EMV_Transceive(CMD_ATTRIB, ATTRIB, 9, 0, ATTRIB_RES, &len, 0);
+
+    if(errno == EMV_ERR_NONE)
+    {
 
-		if(len != 1)
-			return EMV_ERR_PROTOCOL;
 
-		if((ATTRIB_RES[0] & 0xf) != 0x00)
-			return EMV_ERR_PROTOCOL;
-	}
+#if defined (SDK_DEBUG)
+        PRINT("ATTRIB_RES <-: ");
+        for(i = 0; i < len; i++)
+        {
+                PRINT("%02x ", ATTRIB_RES[i]);
+        }
+        PRINT("\r\n");
+#endif
+
+        if(len != 1)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
+
+
+        if((ATTRIB_RES[0] & 0xf) != 0x00)
+        {
+                return EMV_ERR_PROTOCOL;
+        }
 
-	return errno;
+
+    }
+
+    return errno;
 }
 
 /**
@@ -1546,423 +1567,268 @@
   */
 unsigned char YC_EMV_Contactless_L1_HLTB(void)
 {
-	unsigned char i;
-	unsigned char len;
-	unsigned char errno = EMV_ERR_NONE;
-	unsigned char HLTB[5];
-	unsigned char HLTB_RES[1];
-
-	HLTB[0] = 0x50;
-	HLTB[1] = picc_b.PUPI[0];
-	HLTB[2] = picc_b.PUPI[1];
-	HLTB[3] = picc_b.PUPI[2];
-	HLTB[4] = picc_b.PUPI[3];
-
-	#if defined (SDK_DEBUG)
-	PRINT("HLTB ->: ");
-	for(i = 0; i < 5; i++)
-	{
-		PRINT("%02x ", HLTB[i]);
-	}
-	PRINT("\r\n");
-	#endif
+    unsigned char i;
+    unsigned short len;
+    unsigned char errno = EMV_ERR_NONE;
+    unsigned char HLTB[5];
+    unsigned char HLTB_RES[FSD];
+
+    HLTB[0] = 0x50;
+    HLTB[1] = picc_b.PUPI[0];
+    HLTB[2] = picc_b.PUPI[1];
+    HLTB[3] = picc_b.PUPI[2];
+    HLTB[4] = picc_b.PUPI[3];
 
-	errno = EMV_Transceive(CMD_HLTB, HLTB, 5, 0, HLTB_RES, (unsigned short *)&len, 0);
 
-	#if defined (SDK_DEBUG)
-	PRINT("HLTB_RES <-: ");
-	for(i = 0; i < len; i++)
-	{
-		PRINT("%02x ", HLTB_RES[i]);
-	}
-	PRINT("\r\n");
-	#endif
 
-	return errno;
-}
+#if defined (SDK_DEBUG)
+    PRINT("HLTB ->: ");
+    for(i = 0; i < 5; i++)
+    {
+            PRINT("%02x ", HLTB[i]);
+    }
+    PRINT("\r\n");
+#endif
 
-uint8_t read_power_index(void)
-{
-	unsigned char tmp;
-	WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-	WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
-	Nfc_SysTick_Delay_Us(200);
-	tmp = READREG(REG_AVG_POW);
-	WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
-	Nfc_SysTick_Delay_Us(200);
-	return tmp;
-}
-
-uint8_t  auto_calibration_modindex (void)
-{
-    unsigned char i, gain_index, pa_gain=0,pa_gainlater=0;
-    unsigned char pwr_cur,rssi_sta,rssi_sta1,rssi_sta2;
-
-    gain_index = 0; // 0: 6db
-	WRITEREG(REG_RX_CTRL0, gain_i_q_table[gain_index][0]);
-	WRITEREG(REG_RX_CTRL1, gain_i_q_table[gain_index][1]);
-	WRITEREG(REG_RX_CTRL2, gain_i_q_table[gain_index][2]);
-	WRITEREG(REG_ADC_CTRL, 0x08);
-	WRITEREG(REG_XTAL_CTRL4, 0x07);
-	pa_gain = READREG(REG_TX_PA_GAIN);
-	pa_gainlater = pa_gain;
-	rssi_sta = read_power_index();
-	rssi_sta1 = rssi_sta*ratio_0/100;
-	rssi_sta2 = rssi_sta*ratio_1_4/100;
+    errno = EMV_Transceive(CMD_HLTB, HLTB, 5, 0, HLTB_RES, (unsigned short *)&len, 0);
 
-    for (i=0; i<255; i++)
-	{
-        pwr_cur = read_power_index();
-		if(rssi_sta <= 0x30 )
-		{
-			if(pwr_cur > rssi_sta1)
-			{
-				if(pa_gain >= 0x7f)
-				{
-					pa_gain -= 6;
-				}
-				else if(pa_gain>=0x5a && pa_gain <0x7f)
-				{
-					pa_gain -= 4;
-				}
-				else if(pa_gain>=0x2a && pa_gain <0x5a)
-				{
-					pa_gain = pa_gain-2;
-
-				}
-				else
-				{
-					pa_gain--;
-				}
-				WRITEREG(REG_TX_PA_GAIN, pa_gain);
-			}
-
-			else
-				break;
-		}
-		else
-		{
-
-			if(pwr_cur > rssi_sta2)
-			{
-				if(pa_gain >= 0x7f)
-				{
-					pa_gain -= 6;
-				}
-				else if(pa_gain>=0x5a && pa_gain <0x7f)
-				{
-					pa_gain -= 4;
-				}
-				else if(pa_gain>=0x2a && pa_gain <0x5a)
-				{
-					pa_gain = pa_gain-2;
-				}
-				else
-				{
-					pa_gain--;
-				}
-				WRITEREG(REG_TX_PA_GAIN, pa_gain);
-			}
-			else
-				break;
-		}
-	}
-	WRITEREG(REG_ADC_CTRL, 0x00);
-	WRITEREG(REG_XTAL_CTRL4, 0x06);
-	WRITEREG(REG_TX_PA_GAIN, pa_gainlater);
-	return pa_gain;
-}
 
 
+#if defined (SDK_DEBUG)
+    PRINT("HLTB_RES <-: ");
+    for(i = 0; i < len; i++)
+    {
+            PRINT("%02x ", HLTB_RES[i]);
+    }
+    PRINT("\r\n");
+#endif
+
+    return errno;
+}
+
 static uint8_t EMV_Poll(void)
 {
-	uint8_t gain_index=0,errno=0;
-	Poll_Type.Type_A = 0;
-	Poll_Type.Type_B = 0;
+    uint8_t errno=0;
+    Poll_Type.Type_A = 0;
+    Poll_Type.Type_B = 0;
 
-	while(1)
-	{
+    while(1)
+    {
 
-		if(!Poll_Type.Type_A)
-		{
-			Tp();
-			#ifdef EMV_DEBUG
-
-				/*????????????2?3?*/
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
-				Nfc_SysTick_Delay_Ms(10);
-				PRINT("\nDCREG_RX_CTRL0A = 0x%2x\n", READREG(REG_RX_CTRL0));
-				PRINT("\nDCREG_AVG_POWA = 0x%2x\n", READREG(REG_AVG_POW));
-				PRINT("\nDCREG_AVG_IA = 0x%2x\n", READREG(REG_AVG_I));
-				PRINT("\nDCREG_AVG_QA = 0x%2x\n", READREG(REG_AVG_Q));
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-
-
-				WRITEREG(REG_RX_CTRL0, RX_GAIN_6DB);
-				WRITEREG(REG_RX_CTRL1, gain_i_q_table[0][1]);
-				WRITEREG(REG_RX_CTRL2, gain_i_q_table[0][2]);
-				WRITEREG(REG_XTAL_CTRL4, 0x07);
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
-				Nfc_SysTick_Delay_Ms(10);
-				/*?rx_vpp??,????,*/
-				PRINT("\nVPPREG_RX_CTRL0A = 0x%2x\n", READREG(REG_RX_CTRL0));
-				PRINT("\nVPPDCREG_AVG_POWA = 0x%2x\n", READREG(REG_AVG_POW));
-				PRINT("\nVPPDCREG_AVG_IA = 0x%2x\n", READREG(REG_AVG_I));
-				PRINT("\nVPPDCREG_AVG_QA = 0x%2x\n", READREG(REG_AVG_Q));
-				WRITEREG(REG_XTAL_CTRL4, 0x06);
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
-				WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-
-				WRITEREG(REG_RX_CTRL0, RX_GAIN_18DB);
-				WRITEREG(REG_RX_CTRL1, gain_i_q_table[2][1]);
-				WRITEREG(REG_RX_CTRL2, gain_i_q_table[2][2]);
-
-			#endif
-			errno  = YC_EMV_Contactless_L1_WUPA();
-
-			if(errno == EOT_SHOUT)
-			{
-				PRINT("WUPA return shout");
-				return EOT_SHOUT;
-			}
-
-			if(errno  != EMV_ERR_TIME_OUT)
-			{
-
-				#ifdef EMV_DEBUG
-					/*?????*/
-					PRINT("\nRSSIREG_137 = 0x%2x\n", READREG(137));
-					PRINT("\nRSSIREG_RX_CTRL0 = 0x%2x\n", READREG(REG_RX_CTRL0));
-					PRINT("\nRSSIREG_AVG_POW = 0x%2x\n", READREG(REG_AVG_POW));
-					PRINT("\nRSSIREG_AVG_I = 0x%2x\n", READREG(REG_AVG_I));
-					PRINT("\nRSSIREG_AVG_Q = 0x%2x\n", READREG(REG_AVG_Q));
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
-					Nfc_SysTick_Delay_Ms(10);
-					/*??*/
-					PRINT("\nDCREG_RX_CTRL0 = 0x%2x\n", READREG(REG_RX_CTRL0));
-					PRINT("\nDCREG_AVG_POW = 0x%2x\n", READREG(REG_AVG_POW));
-					PRINT("\nDCREG_AVG_I = 0x%2x\n", READREG(REG_AVG_I));
-					PRINT("\nDCREG_AVG_Q = 0x%2x\n", READREG(REG_AVG_Q));
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-
-					WRITEREG(REG_RX_CTRL0, RX_GAIN_6DB);
-					WRITEREG(REG_RX_CTRL1, gain_i_q_table[0][1]);
-					WRITEREG(REG_RX_CTRL2, gain_i_q_table[0][2]);
-					WRITEREG(REG_XTAL_CTRL4, 0x07);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
-					Nfc_SysTick_Delay_Ms(10);
-					/**/
-					PRINT("\nVPPREG_RX_CTRL0 = 0x%2x\n", READREG(REG_RX_CTRL0));
-					PRINT("\nVPPDCREG_AVG_POW = 0x%2x\n", READREG(REG_AVG_POW));
-					PRINT("\nVPPDCREG_AVG_I = 0x%2x\n", READREG(REG_AVG_I));
-					PRINT("\nVPPDCREG_AVG_Q = 0x%2x\n", READREG(REG_AVG_Q));
-					WRITEREG(REG_XTAL_CTRL4, 0x06);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
-					WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
-
-					WRITEREG(REG_RX_CTRL0, RX_GAIN_18DB);
-					WRITEREG(REG_RX_CTRL1, gain_i_q_table[2][1]);
-					WRITEREG(REG_RX_CTRL2, gain_i_q_table[2][2]);
-
-				#endif
-
-				#ifdef RXGAIN_CORRECTION
-					YC_EMV_Contactless_L1_dyn_adj();
-				#endif
-				Poll_Type.Type_A = 1;
-
-				YC_EMV_Contactless_L1_HLTA();
-			}
-
-			if(!Poll_Type.Type_B)
-			{
-				Tp();
-				errno  = YC_EMV_Contactless_L1_WUPB(NULL);
-				if(errno == EOT_SHOUT)
-				{
-					PRINT("WUPB return shout");
-					return EOT_SHOUT;
-				}
-				if( errno != EMV_ERR_TIME_OUT)
-				{
-					Poll_Type.Type_B = 1;
-				}
-			}
-			else
-			{
-				break;
-			}
-		}
-		else
-		{
-			break;
-		}
+        if(!Poll_Type.Type_A)
+        {
+            Tp();
+            errno  = YC_EMV_Contactless_L1_WUPA();
 
-		if(!(Poll_Type.Type_A || Poll_Type.Type_B))
-			return EMV_ERR_NO_CARD;
-	}
+            if(errno == EOT_SHOUT)
+            {
+                return EOT_SHOUT;
+            }
+
+            if(errno  != EMV_ERR_TIME_OUT)
+            {
+                Poll_Type.Type_A = 1;
+
+                YC_EMV_Contactless_L1_HLTA();
+            }
+
+            if(!Poll_Type.Type_B)
+            {
+                Tp();
+                errno  = YC_EMV_Contactless_L1_WUPB(NULL);
+                if(errno == EOT_SHOUT)
+                {
+                        return EOT_SHOUT;
+                }
+                if(errno != EMV_ERR_TIME_OUT)
+                {
+                        Poll_Type.Type_B = 1;
+                }
+            }
+            else
+            {
+                break;
+            }
+        }
+        else
+        {
+            break;
+        }
 
-	return EMV_ERR_NONE;
+        if(!(Poll_Type.Type_A || Poll_Type.Type_B))
+        {
+            return EMV_ERR_NO_CARD;
+        }
+    }
+
+    return EMV_ERR_NONE;
 }
 
 /**
   * @brief  Type A Collision Detection
-  *		    Requirements 9.4: Type A Collision Detection
+  *                 Requirements 9.4: Type A Collision Detection
   * @param  None
   * @retval Error code
   */
 unsigned char EMV_A_Collision_Detect(void)
 {
-	uint8_t i = 0;
-	uint8_t cl;
-	uint8_t UID_complete;
-	uint8_t ISOIEC14443_4_compliant;
-	uint8_t retr;
-	uint8_t errno = EMV_ERR_NONE;
+    uint8_t i = 0;
+    uint8_t cl;
+    uint8_t UID_complete;
+    uint8_t ISOIEC14443_4_compliant;
+    uint8_t retr=0;
+    uint8_t errno = EMV_ERR_NONE;
 
-	Tp();
+    Tp();
 
-	retr = 0;
+    while(1)
+    {
+        errno = YC_EMV_Contactless_L1_WUPA();
+        if(errno == EOT_SHOUT)
+        {
+            return EOT_SHOUT;
+        }
+        if(errno == EMV_ERR_NONE)
+        {
+            break;
+        }
 
+        AntiColExceptionProcess();
+    }
 
-	while(1)
-	{
-		errno = YC_EMV_Contactless_L1_WUPA();
-		if(errno == EOT_SHOUT)
-		{
-				return EOT_SHOUT;
-		}
-		if(errno == EMV_ERR_NONE)
-			break;
+    do
+    {
+        ++i;
+
+        if(i == 1)
+        {
+            cl = CL1;
+        }
+        else if(i == 2)
+        {
+            cl = CL2;
+        }
+        else
+        {
+            cl = CL3;
+        }
+
+        retr = 0;
+        while(1)
+        {
+
+            errno = YC_EMV_Contactless_L1_ANTICOLLISION(cl);
+            if(errno == EOT_SHOUT)
+            {
+                return EOT_SHOUT;
+            }
+            if(errno == EMV_ERR_NONE)
+            {
+                break;
+            }
+
+            AntiColExceptionProcess();
+        }
+
+        retr = 0;
+        while(1)
+        {
+
+            errno = YC_EMV_Contactless_L1_SELECT(cl, &UID_complete, &ISOIEC14443_4_compliant);
+            if(errno == EOT_SHOUT)
+            {
+                return EOT_SHOUT;
+            }
+            if(errno == EMV_ERR_NONE)
+            {
+                break;
+            }
 
-		AntiColExceptionProcess();
-	}
+            GeneralExceptionProcess();
+        }
 
-	do{
-		++i;
+        if(!UID_complete)
+        {
+            if(!ISOIEC14443_4_compliant)
+            {
+                    return EMV_ERR_PROTOCOL;
+            }
 
-		if(i == 1)
-			cl = CL1;
-		else if(i == 2)
-			cl = CL2;
-		else
-			cl = CL3;
-
-		retr = 0;
-		while(1)
-		{
-
-			errno = YC_EMV_Contactless_L1_ANTICOLLISION(cl);
-			if(errno == EOT_SHOUT)
-			{
-					return EOT_SHOUT;
-			}
-			if(errno == EMV_ERR_NONE)
-				break;
-
-			AntiColExceptionProcess();
-		}
-
-		retr = 0;
-		while(1)
-		{
-
-			errno = YC_EMV_Contactless_L1_SELECT(cl, &UID_complete, &ISOIEC14443_4_compliant);
-			if(errno == EOT_SHOUT)
-			{
-					return EOT_SHOUT;
-			}
-			if(errno == EMV_ERR_NONE)
-				break;
-
-			GeneralExceptionProcess();
-		}
-
-		if(!UID_complete)
-		{
-			if(!ISOIEC14443_4_compliant)
-				return EMV_ERR_PROTOCOL;
-
-			break;
-		}
+            break;
+        }
 
-		if(i == 3)
-			return EMV_ERR_PROTOCOL;
+        if(i == 3)
+        {
+            return EMV_ERR_PROTOCOL;
+        }
 
-	} while(i < 3);
+    }
+    while(i < 3);
 
-	return errno;
+    return errno;
 }
-
 /**
   * @brief  Type B Collision Detection
-  *		   	Requirements 9.5: Type B Collision Detection
+  *                     Requirements 9.5: Type B Collision Detection
   * @param  None
   * @retval Error code
   */
 unsigned char EMV_B_Collision_Detect(void)
 {
-	uint8_t retr = 0;
-	uint8_t ISOIEC14443_4_compliant=0;
-	uint8_t errno = EMV_ERR_NONE;
+    uint8_t retr = 0;
+    uint8_t ISOIEC14443_4_compliant=0;
+    uint8_t errno = EMV_ERR_NONE;
 
-	Tp();
+    Tp();
 
-	while(1)
-	{
+    while(1)
+    {
 
-		errno = YC_EMV_Contactless_L1_WUPB(&ISOIEC14443_4_compliant);
-		if(errno == EOT_SHOUT)
-		{
-				return EOT_SHOUT;
-		}
-		if(errno == EMV_ERR_NONE)
-		{
-			if(!ISOIEC14443_4_compliant)
-				return EMV_ERR_PROTOCOL;
+        errno = YC_EMV_Contactless_L1_WUPB(&ISOIEC14443_4_compliant);
+        if(errno == EOT_SHOUT)
+        {
+            return EOT_SHOUT;
+        }
+        if(errno == EMV_ERR_NONE)
+        {
+            if(!ISOIEC14443_4_compliant)
+            {
+                return EMV_ERR_PROTOCOL;
+            }
 
-			break;
-		}
+            break;
+        }
 
-		AntiColExceptionProcess();
-	}
+        AntiColExceptionProcess();
+    }
 
-	return errno;
+    return errno;
 }
 
 /**
   * @brief  General Collision Detection
-  *		    Requirements 9.3: Collision Detection
+  *                 Requirements 9.3: Collision Detection
   * @param  None
   * @retval Error code
   */
 static uint8_t EMV_Collision_General_Detect(void)
 {
-	uint8_t errno = EMV_ERR_NONE;
+    uint8_t errno = EMV_ERR_NONE;
 
-	if(Poll_Type.Type_A && Poll_Type.Type_B)
-	{
-		return EMV_ERR_COLLISION;
-	}
-	else if(Poll_Type.Type_A)
-	{
-		errno = EMV_A_Collision_Detect();
-	}
-	else if(Poll_Type.Type_B)
-	{
-		errno = EMV_B_Collision_Detect();
-	}
+    if(Poll_Type.Type_A && Poll_Type.Type_B)
+    {
+        return EMV_ERR_COLLISION;
+    }
+    else if(Poll_Type.Type_A)
+    {
+        errno = EMV_A_Collision_Detect();
+    }
+    else if(Poll_Type.Type_B)
+    {
+        errno = EMV_B_Collision_Detect();
+    }
 
-	return errno;
+    return errno;
 }
 
 /**
@@ -1972,61 +1838,67 @@
   */
 static uint8_t EMV_Active(void)
 {
-	uint8_t retr = 0;
-	uint8_t errno = EMV_ERR_NONE;
-	printf_flag = 0;
-	errno = EMV_Poll();
-	if(errno == EOT_SHOUT)
-	{
-		return EOT_SHOUT;
-	}
+    uint8_t retr = 0;
+    uint8_t errno = EMV_ERR_NONE;
 
-	if(errno != EMV_ERR_NONE)
-		return EMV_ERR_NO_CARD;
+    errno = EMV_Poll();
+    if(errno == EOT_SHOUT)
+    {
+        return EOT_SHOUT;
+    }
 
-	printf_flag = 1;
-	errno = EMV_Collision_General_Detect();
-	if(errno == EOT_SHOUT)
-	{
-		return EOT_SHOUT;
-	}
+    if(errno != EMV_ERR_NONE)
+    {
+        return EMV_ERR_NO_CARD;
+    }
 
-	if(errno == EMV_ERR_NONE)
-	{
-		if(Poll_Type.Type_A)
-		{
-			while(1)
-			{
-
-				errno = YC_EMV_Contactless_L1_RATS();
-				if(errno == EOT_SHOUT)
-				{
-					return EOT_SHOUT;
-				}
-				if(errno == EMV_ERR_NONE)
-					break;
-
-				GeneralExceptionProcess();
-			}
-		}
-		else if(Poll_Type.Type_B)
-		{
-			while(1)
-			{
-
-				errno = YC_EMV_Contactless_L1_ATTRIB();
-				if(errno == EOT_SHOUT)
-				{
-					return EOT_SHOUT;
-				}
-				if(errno == EMV_ERR_NONE)
-					break;
-				GeneralExceptionProcess();
-			}
-		}
-	}
+    errno = EMV_Collision_General_Detect();
+    if(errno == EOT_SHOUT)
+    {
+        return EOT_SHOUT;
+    }
+
+    if(errno == EMV_ERR_NONE)
+    {
+        if(Poll_Type.Type_A)
+        {
+            while(1)
+            {
+
+                errno = YC_EMV_Contactless_L1_RATS();
+                if(errno == EOT_SHOUT)
+                {
+                    return EOT_SHOUT;
+                }
+                if(errno == EMV_ERR_NONE)
+                {
+                    break;
+                }
+
+                GeneralExceptionProcess();
+            }
+        }
+        else if(Poll_Type.Type_B)
+        {
+                while(1)
+                {
+
+                    errno = YC_EMV_Contactless_L1_ATTRIB();
+                    if(errno == EOT_SHOUT)
+                    {
+                        return EOT_SHOUT;
+                    }
+                    if(errno == EMV_ERR_NONE)
+                    {
+                        break;
+                    }
+
+                    GeneralExceptionProcess();
+                }
+        }
+    }
 
-	return errno;
+    return errno;
 }
 
 /**
@@ -2036,217 +1908,174 @@
   */
 static uint8_t EMV_PICC_Remove(void)
 {
-	if(Poll_Type.Type_A)
-	{
-		YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_A);
+    if(Poll_Type.Type_A)
+    {
+        YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_A);
 
-		Tp();
+        Tp();
 
-		while(YC_EMV_Contactless_L1_WUPA() != EMV_ERR_TIME_OUT)
-		{
-removea:
-			YC_EMV_Contactless_L1_HLTA();
+        while(YC_EMV_Contactless_L1_WUPA() != EMV_ERR_TIME_OUT)
+        {
+        removea:
+            YC_EMV_Contactless_L1_HLTA();
 
-			Tp();
-		}
+            Tp();
+        }
 
-		Tretransmission();
+        Tretransmission();
 
-		if(YC_EMV_Contactless_L1_WUPA() != EMV_ERR_TIME_OUT)
-			goto removea;
+        if(YC_EMV_Contactless_L1_WUPA() != EMV_ERR_TIME_OUT)
+        {
+            goto removea;
+        }
 
-		Tretransmission();
+        Tretransmission();
 
-		if(YC_EMV_Contactless_L1_WUPA() != EMV_ERR_TIME_OUT)
-			goto removea;
+        if(YC_EMV_Contactless_L1_WUPA() != EMV_ERR_TIME_OUT)
+        {
+            goto removea;
+        }
 
-		return EMV_ERR_TIME_OUT;
-	}
-	else if(Poll_Type.Type_B)
-	{
-		YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
+        return EMV_ERR_TIME_OUT;
+    }
+    else if(Poll_Type.Type_B)
+    {
+        YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
 
-		Tp();
+        Tp();
 
-		while(YC_EMV_Contactless_L1_WUPB(NULL) != EMV_ERR_TIME_OUT)
-		{
-removeb:
-			Tp();
-		}
+        while(YC_EMV_Contactless_L1_WUPB(NULL) != EMV_ERR_TIME_OUT)
+        {
+        removeb:
+            Tp();
+        }
 
-		Tretransmission();
+        Tretransmission();
 
-		if(YC_EMV_Contactless_L1_WUPB(NULL) != EMV_ERR_TIME_OUT)
-			goto removeb;
+        if(YC_EMV_Contactless_L1_WUPB(NULL) != EMV_ERR_TIME_OUT)
+        {
+            goto removeb;
+        }
 
-		Tretransmission();
+        Tretransmission();
 
-		if(YC_EMV_Contactless_L1_WUPB(NULL) != EMV_ERR_TIME_OUT)
-			goto removeb;
+        if(YC_EMV_Contactless_L1_WUPB(NULL) != EMV_ERR_TIME_OUT)
+        {
+            goto removeb;
+        }
 
-		return EMV_ERR_TIME_OUT;
-	}
-	else
-		return EMV_ERR_NO_CARD;
+        return EMV_ERR_TIME_OUT;
+    }
+    else
+    {
+        return EMV_ERR_NO_CARD;
+    }
 }
 
 
 
 static uint8_t EMV_LoopBack(void)
 {
-	uint16_t i;
-	uint8_t errno = EMV_ERR_NONE;
-	uint8_t res[256];
-	uint16_t reslen;
-
-	const uint8_t APDU_PPSE[] = {0x00,0xA4,0x04,0x00,0x0E,
-							0x32,0x50,0x41,0x59,0x2E,0x53,0x59,0x53,0x2E,0x44,0x44,0x46,0x30,0x31,
-							0x00};
-
-	#if defined (SDK_DEBUG)
-	PRINT("C-APDU ->: ");
-	for(i = 0; i < sizeof(APDU_PPSE); i++)
-	{
-		PRINT("%02x ", APDU_PPSE[i]);
-	}
-	PRINT("\n");
-	#endif
-	errno = YC_EMV_Contactless_L1_APDU_Transceive(APDU_PPSE, sizeof(APDU_PPSE), res, &reslen);
-
-	if(errno != EMV_ERR_NONE)
-		return errno;
-
-	#if defined (SDK_DEBUG)
-	PRINT("R-APDU <-: ");
-	for(i = 0; i < reslen; i++)
-	{
-		PRINT("%02x ", res[i]);
-	}
-	PRINT("\n");
-	#endif
+    uint16_t i;
+    uint8_t errno = EMV_ERR_NONE;
+    uint8_t res[FSD];
+    uint16_t reslen;
+
+    const uint8_t APDU_PPSE[] = {0x00,0xA4,0x04,0x00,0x0E,
+                                    0x32,0x50,0x41,0x59,0x2E,0x53,0x59,0x53,0x2E,0x44,0x44,0x46,0x30,0x31,
+                                    0x00
+                                };
+
+#if defined (SDK_DEBUG)
+    PRINT("C-APDU ->: ");
+    for(i = 0; i < sizeof(APDU_PPSE); i++)
+    {
+            PRINT("%02x ", APDU_PPSE[i]);
+    }
+    PRINT("\n");
+#endif
+    errno = YC_EMV_Contactless_L1_APDU_Transceive(APDU_PPSE, sizeof(APDU_PPSE), res, &reslen);
 
-	while(1)
-	{
-		if(res[1] == 0x70)
-		{
-			return EOT_IND_REMOVE;
-		}
-
-		if(res[1] == 0x72)
-		{
-			return EOT_IND_POWER_OFF;
-		}
-
-		#if defined (SDK_DEBUG)
-		PRINT("C-APDU ->: ");
-		for(i = 0; i < reslen - 2; i++)
-		{
-			PRINT("%02x ", res[i]);
-		}
-		PRINT("\n");
-		#endif
-
-		errno = YC_EMV_Contactless_L1_APDU_Transceive(res, reslen - 2, res, &reslen);
-
-		if(errno != EMV_ERR_NONE)
-			return errno;
-
-		#if defined (SDK_DEBUG)
-		PRINT("R-APDU <-: ");
-		for(i = 0; i < reslen; i++)
-		{
-			PRINT("%02x ", res[i]);
-		}
-		PRINT("\n");
-		#endif
-	}
+
+    if(errno != EMV_ERR_NONE)
+    {
+        return errno;
+    }
+
+
+#if defined (SDK_DEBUG)
+    PRINT("R-APDU <-: ");
+    for(i = 0; i < reslen; i++)
+    {
+        PRINT("%02x ", res[i]);
+    }
+    PRINT("\n");
+#endif
+
+    while(1)
+    {
+        if(res[1] == 0x70)
+        {
+                return EOT_IND_REMOVE;
+        }
+
+        if(res[1] == 0x72)
+        {
+                return EOT_IND_POWER_OFF;
+        }
+
+
+#if defined (SDK_DEBUG)
+        PRINT("C-APDU ->: ");
+        for(i = 0; i < reslen - 2; i++)
+        {
+                PRINT("%02x ", res[i]);
+        }
+        PRINT("\n");
+#endif
+
+        errno = YC_EMV_Contactless_L1_APDU_Transceive(res, reslen - 2, res, &reslen);
+
+        if(errno != EMV_ERR_NONE)
+        {
+                return errno;
+        }
+
+
+#if defined (SDK_DEBUG)
+        PRINT("R-APDU <-: ");
+        for(i = 0; i < reslen; i++)
+        {
+                PRINT("%02x ", res[i]);
+        }
+        PRINT("\n");
+#endif
+    }
 }
 
 static void EMV_Field_Reset(void)
 {
-	YC_EMV_Contactless_L1_Rf_Switch(OFF);
-	Tp();
-	YC_EMV_Contactless_L1_Rf_Switch(ON);
+    YC_EMV_Contactless_L1_Rf_Switch(OFF);
+    Tp();
+    YC_EMV_Contactless_L1_Rf_Switch(ON);
 }
 
 static void EMV_Field_Power_Off(void)
 {
-	YC_EMV_Contactless_L1_Rf_Switch(OFF);
-	Tpoweroff();
-	YC_EMV_Contactless_L1_Rf_Switch(ON);
+    YC_EMV_Contactless_L1_Rf_Switch(OFF);
+    Tpoweroff();
+    YC_EMV_Contactless_L1_Rf_Switch(ON);
 }
 
 /**
-  * @brief  EMV Main
-  *			Requirements 9.1: PCD Requirements Related to the Main Loop
-  * @param  None
-  * @retval None
-  */
-void EMV_Main_Loop(void)
-{
-	uint8_t Resart= 0;
-	uint8_t errno = EMV_ERR_NONE;
-	YC_EMV_Contactless_L1_Init();
-	while(1)
-	{
-
-		YC_EMV_Contactless_L1_Rf_Switch(ON);
-		///MyPrintf("###########################################################################\r\n");
-		if(Resart == 1)
-		{
-			YC_EMV_HwReset();
-
-			Nfc_SysTick_Delay_Ms(50);
-
-			WRITEREG(REG_LDO_ADC_CLKGEN_LPO_CTRL,0xA8);
-			WRITEREG(REG_XTAL_CTRL4,0x24);
-			WRITEREG(REG_LDO_CORE_LPO_CLK_CTRL,0x5b);
-			YC_EMV_Contactless_L1_Init();
-			Resart = 0;
-
-		}
-
-		errno = EMV_Active();
-		if(errno == EOT_SHOUT)
-		{
-			Resart = 1;
-
-		}
-		if(errno == EMV_ERR_NONE)
-		{
-			errno = EMV_LoopBack();
-			if(errno == EOT_SHOUT)
-			{
-				Resart = 1;
-			}
-			if(errno == EOT_IND_REMOVE)
-			{
-				EMV_Field_Reset();
-
-				EMV_PICC_Remove();
-			}
-			else
-			{
-				EMV_Field_Power_Off();
-			}
-		}
-		else
-		{
-			Tresetdelay();
-
-			EMV_Field_Reset();
-		}
-	}
-}
-/**
   * @brief  Enter low power mode
   * @param  None
   * @retval None
   */
 void YC_EMV_Contactless_L1_Sleep(void)
 {
-	CLEARBITMASK(REG_TOP_CTRL, BIT0);
-	SETBITMASK(REG_TOP_CTRL, BIT2);
+    CLEARBITMASK(REG_TOP_CTRL, BIT0);
+    SETBITMASK(REG_TOP_CTRL, BIT2);
 }
 
 /**
@@ -2256,12 +2085,10 @@
   */
 void YC_EMV_Contactless_L1_Wake(void)
 {
-	CLEARBITMASK(REG_TOP_CTRL, BIT2);
-	SETBITMASK(REG_TOP_CTRL, BIT0);
+    CLEARBITMASK(REG_TOP_CTRL, BIT2);
+    SETBITMASK(REG_TOP_CTRL, BIT0);
 }
 
-
-
 void set_dc_win(uint8_t win)
 {
     uint8_t tmp;
@@ -2278,15 +2105,6 @@
     WRITEREG(REG_RSSI_CALC_CTRL, tmp);
 }
 
-
-void set_rx_gain(uint8_t gn)
-{
-    uint8_t tmp;
-    tmp = READREG(REG_RX_CTRL0);
-    tmp = tmp & 0x07;
-    tmp = tmp | gn;
-    WRITEREG(REG_RX_CTRL0, tmp);
-}
 void force_dc_calc(void)
 {
     uint8_t tmp;
@@ -2299,419 +2117,243 @@
 }
 uint8_t dc_cali_i(void)
 {
-	uint8_t cali=0, dc=0, cnt = 0;
-	while(1)
-	{
-		cnt ++;
-		force_dc_calc();
-		dc = get_dc_i();
-		cali = get_cali_i();
-		if(cnt == 0xff)
-			return CALI_FAIL;
-
-		if((dc <= DC_ACCEPT_RANGE) || (dc >= (256 - DC_ACCEPT_RANGE)))
-			return CALI_OK;
-
-		if((dc & 0x80) == 0)
-		{
-			if((cali & 0x80) == 0)
-			{
-				if(cali == 0)
-				{
-					cali = 0x80;
-				}
-				else
-				{
-					cali = cali - 1;
-				}
-			}
-			else
-			{
-				if(cali == 0xff)
-				{
-					cali = cali;
-				}
-				else
-				{
-					cali = cali + 1;
-				}
-			}
-		}
-		else
-		{
-			if((cali & 0x80) == 0)
-			{
-				if(cali == 0x7f)
-				{
-					cali = 0x7f;
-				}
-				else
-				{
-					cali = cali + 1;
-				}
-			}
-			else
-			{
-				if(cali == 0x80)
-				{
-					cali = 0x00;
-				}
-				else
-				{
-					cali = cali - 1;
-				}
-			}
-		}
+    uint8_t cali=0, dc=0, cnt = 0;
+    while(1)
+    {
+        cnt ++;
+        force_dc_calc();
+        dc = get_dc_i();
+        cali = get_cali_i();
+        if(cnt == 0xff)
+        {
+            return CALI_FAIL;
+        }
+
+        if((dc <= DC_ACCEPT_RANGE) || (dc >= (256 - DC_ACCEPT_RANGE)))
+        {
+            return CALI_OK;
+        }
 
-		set_cali_i(cali);
+        if((dc & 0x80) == 0)
+        {
+            if((cali & 0x80) == 0)
+            {
+                if(cali == 0)
+                {
+                    cali = 0x80;
+                }
+                else
+                {
+                    cali = cali - 1;
+                }
 
-	}
+            }
+            else
+            {
+                if(cali == 0xff)
+                {
+                    cali = cali;
+                }
+                else
+                {
+                    cali = cali + 1;
+                }
+            }
+
+        }
+        else
+        {
+            if((cali & 0x80) == 0)
+            {
+                if(cali == 0x7f)
+                {
+                    cali = 0x7f;
+                }
+                else
+                {
+                    cali = cali + 1;
+                }
+            }
+            else
+            {
+                if(cali == 0x80)
+                {
+                    cali = 0x00;
+                }
+                else
+                {
+                    cali = cali - 1;
+                }
+            }
+        }
+
+        set_cali_i(cali);
+
+    }
 }
 uint8_t dc_cali_q(void)
 {
-	uint8_t cali=0, dc=0, cnt=0;
-	while(1)
-	{
-		cnt ++;
-		force_dc_calc();
-		dc = get_dc_q();
-
-		cali = get_cali_q();
-
-		if(cnt == 0xff)
-			return CALI_FAIL;
-
-		if((dc <= DC_ACCEPT_RANGE) || (dc >= (256 - DC_ACCEPT_RANGE)))
-			return CALI_OK;
-		if((dc & 0x80) == 0)
-		{
-			if((cali & 0x80) == 0)
-			{
-				if(cali == 0)
-				{
-					cali = 0x80;
-				}
-				else
-				{
-					cali = cali - 1;
+    uint8_t cali=0, dc=0, cnt=0;
+    while(1)
+    {
+        cnt ++;
+        force_dc_calc();
+        dc = get_dc_q();
+
+        cali = get_cali_q();
+
+        if(cnt == 0xff)
+        {
+            return CALI_FAIL;
+        }
+
+        if((dc <= DC_ACCEPT_RANGE) || (dc >= (256 - DC_ACCEPT_RANGE)))
+        {
+            return CALI_OK;
+        }
+        if((dc & 0x80) == 0)
+        {
+            if((cali & 0x80) == 0)
+            {
+                if(cali == 0)
+                {
+                    cali = 0x80;
+                }
+                else
+                {
+                    cali = cali - 1;
                 }
             }
-			else
-			{
+            else
+            {
                 if(cali == 0xff)
-				{
+                {
                     cali = cali;
                 }
-				else
-				{
+                else
+                {
                     cali = cali + 1;
                 }
             }
         }
-		else
-		{
+        else
+        {
             if((cali & 0x80) == 0)
-			{
+            {
                 if(cali == 0x7f)
-				{
+                {
                     cali = 0x7f;
                 }
-				else
-				{
+                else
+                {
                     cali = cali + 1;
                 }
             }
-			else
-			{
+            else
+            {
                 if(cali == 0x80)
-				{
+                {
                     cali = 0x00;
                 }
-				else
-				{
+                else
+                {
                     cali = cali - 1;
                 }
             }
         }
-		set_cali_q(cali);
+        set_cali_q(cali);
 
-	}
+    }
 
 }
 
 void dc_cali_alg(uint8_t win_size)
 {
-	uint8_t i;
 	WRITEREG(REG_DA_RX_FLT_GRCK_EN, 0x00);
 	WRITEREG(REG_DA_TX_PA_EN, 0x00);
 	set_dc_win(win_size);
 
-	WRITEREG(REG_TOP_CTRL, 0x13);
-	WRITEREG(REG_RX_CTRL0, 0x02);
-	set_rssi_calc_en(1);
+    WRITEREG(REG_TOP_CTRL, 0x11);
+    set_rssi_calc_en(1);
 
-	WRITEREG(REG_ADC_CTRL, 0x08);
+    WRITEREG(REG_ADC_CTRL, 0x08);
 
-	WRITEREG(REG_RX_CTRL3, RX_CTRL3|0x80);
+	WRITEREG(REG_RX_CTRL3, RX_CTRL3);
+	WRITEREG(REG_RX_CTRL4, RX_CTRL4);
 	WRITEREG(REG_RX_CTRL5, RX_CTRL5);
 
-	for(i = 0; i < 9; i++)
-	{
-		set_rx_gain(gain_i_q_table[i][0]);
-
-		if(CALI_OK == dc_cali_i())
-		{
-			gain_i_q_table[i][1] = get_cali_i();
-		}
-		else
-		{
-			#ifdef EMV_DEBUG
-			PRINT("%d db i calibration fail\n", 6*(i+1));
-			#endif
-		}
-		if(CALI_OK == dc_cali_q())
-		{
-			gain_i_q_table[i][2] = get_cali_q();
-		}
-		else
-		{
-			#ifdef EMV_DEBUG
-			PRINT("%d db q calibration fail\n", 6*(i+1));
-			#endif
-		}
-	}
-	for(i = 0; i < 9; i++)
-	{
-		#ifdef EMV_DEBUG
-		PRINT("%d db, i cali: 0x%02x, q cali: 0x%02x\n", 6*(i+1), gain_i_q_table[i][1], gain_i_q_table[i][2]);
-		#endif
-	}
-}
-
-
-void printf_debug_info(uint8_t status, uint8_t *data, uint16_t num)
-{
-	#if 1
-	uint16_t i = 0;
-	uint8_t len = 0;
-	uint8_t recvbuf[FSD];
-	uint16_t index = 0;
-
-	PRINT("\n**************************************************\n");
-	PRINT("\nrecv erro\n");
-
-	PRINT("\nREG_IRQ0_STATE = 0x%2x\n", READREG(REG_IRQ0_STATE));
-
-	if (status == EMV_ERR_TIME_OUT)
-	{
-		PRINT("\nstatus = EMV_ERR_TIME_OUT\n");
-
-		len = READREG(REG_FIFO_LENGTH);
-		if (len >= 32)
-		{
-			while((READREG(REG_IRQ0_STATE) & 0x04) == 0)
-			{
-				if((READREG(REG_IRQ0_STATE) & 0x40) != 0)
-				{
-					for(i = 0; i < FIFO_LENGTH - WATER_LEVEL; i++)
-					{
-						recvbuf[index++] = READREG(REG_FIFO_DATA);
-						if(index >= FSD)
-						{
-							PRINT("\nrecv data overflow\n");
-						}
-					}
-
-					/* Clear hi_alert_irq */
-					SETBITMASK(REG_IRQ0_CLEAR, 0x40);
-					CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
-				}
-			}
-		}
-
-		if(index < FSD)
-		{
-			/* Receiving has completed */
-			len = READREG(REG_FIFO_LENGTH);
-			for(i = 0; i < len; i++)
-			{
-				recvbuf[index++] = READREG(REG_FIFO_DATA);
-				if(index >= FSD)
-				{
-					PRINT("\nrecv data overflow\n");
-				}
-			}
-		}
-		if (index > 0)
-		{
-			PRINT("\nrecvnum = 0x%2x\n", index);
-			PRINT("\nrecvdata =\n");
-			for (i = 0; i < index; i++)
-			{
-				PRINT(" 0x%2x\n", recvbuf[i]);
-			}
-		}
-		else
-		{
-			PRINT("\nrecvnum = 0;\n");
-		}
-	}
-	else
-	{
-		PRINT("\nstatus = EMV_ERR_TRANSMISSION\n");
-		if (num > 0)
-		{
-			PRINT("\nrecvnum = 0x%2x\n", num);
-			PRINT("\nrecvdata =\n");
-			for (i = 0; i < num; i++)
-			{
-				PRINT(" 0x%2x\n", data[i]);
-			}
-		}
-		else
-		{
-			PRINT("\nrecvnum = 0; =\n");
-		}
-	}
-
-	PRINT("\nREG_ERROR_FLAG = 0x%2x\n", READREG(REG_ERROR_FLAG));
-	PRINT("\nREG_PROTOCOL_ERROR = 0x%2x\n", READREG(REG_PROTOCOL_ERROR));
-	PRINT("\nREG_RX_COLL = 0x%2x\n", READREG(REG_RX_COLL));
-	PRINT("\nREG_RX_LAST_BITS = 0x%2x\n", READREG(REG_RX_LAST_BITS));
-	PRINT("\nREG_EMD_CONDITION_MASK0 = 0x%2x\n", READREG(REG_EMD_CONDITION_MASK0));
-	PRINT("\nREG_EMD_CONDITION_MASK1 = 0x%2x\n", READREG(REG_EMD_CONDITION_MASK1));
-	PRINT("\nREG_EMD_STATUS0 = 0x%2x\n", READREG(REG_EMD_STATUS0));
-	PRINT("\nREG_EMD_STATUS1 = 0x%2x\n", READREG(REG_EMD_STATUS1));
-	PRINT("\nREG_EMD_FRAME_LENGTH = 0x%2x\n", READREG(REG_EMD_FRAME_LENGTH));
-	PRINT("\nREG_RX_CTRL0 = 0x%2x\n", READREG(REG_RX_CTRL0));
-	PRINT("\nREG_AVG_POW = 0x%2x\n", READREG(REG_AVG_POW));
-	PRINT("\nREG_AVG_I = 0x%2x\n", READREG(REG_AVG_I));
-	PRINT("\nREG_AVG_Q = 0x%2x\n", READREG(REG_AVG_Q));
-	#endif
-}
-
-//agc���յ���ȷ��atqa����
-//#define YC_DEBUG_PRINT_EN
-#define SIGNAL_RSSI_MAX  0X50
-#define SIGNAL_RSSI_MIN  0X20
+    Set_Receive_Parameters(RX_GAIN_18DB,RX_I_R_500);
 
-
-void YC_EMV_Contactless_L1_dyn_adj (void)
-{
-    uint8_t rssi = 0;
-    uint8_t val = 0;
-    uint8_t i = 0;
-    rssi = READREG(REG_AVG_POW);
-#ifdef YC_DEBUG_PRINT_EN
-		PRINT("----> NfcDynAdj ---->\r\n");
-		PRINT("----> NfcDynAdj, TX_PA = 0x%2x\r\n", READREG(REG_TX_PA_GAIN));
-        PRINT("----> NfcDynAdj, rssi xxxxxxxxxxxxxxx : 0x%02x\r\n", rssi);
-#endif
-    if(rssi > SIGNAL_RSSI_MAX)
-    {
-		if (rssi > 0x68) {
-			return;
-		}
-        val = READREG(REG_RX_CTRL0);
-        for (i = 0; i < 6; i++)
-        {
-            if (val == gain_i_q_table[i][0])
-            {
-                break;
-            }
-        }
-        if (i > 0)
-        {
-            i--;
-            WRITEREG(REG_RX_CTRL0, gain_i_q_table[i][0]);
-            WRITEREG(REG_RX_CTRL1, gain_i_q_table[i][1]);
-            WRITEREG(REG_RX_CTRL2, gain_i_q_table[i][2]);
-#ifdef YC_DEBUG_PRINT_EN
-            PRINT("----> NfcDynAdj, REG_RX_CTRL0 pre ... : 0x%02x\r\n", val);
-            PRINT("----> NfcDynAdj, REG_RX_CTRL0 aft ___ : 0x%02x\r\n", gain_i_q_table[i][0]);
-#endif
-        }
+    if(CALI_OK == dc_cali_i())
+    {
+        gain_i_q_table[2][1] = get_cali_i();
     }
-    else if(rssi < SIGNAL_RSSI_MIN)
+    else
     {
-		if (rssi < 0x03) {
-			return;
-		}
-        val = READREG(REG_RX_CTRL0);
-        for (i = 0; i < 6; i++)
-        {
-            if (val == gain_i_q_table[i][0])
-            {
-                break;
-            }
-        }
-        if (i <= 4) // max(4) - 1
-        {
-            i++;
-
-            WRITEREG(REG_RX_CTRL0, gain_i_q_table[i][0]);
-            WRITEREG(REG_RX_CTRL1, gain_i_q_table[i][1]);
-            WRITEREG(REG_RX_CTRL2, gain_i_q_table[i][2]);
-#ifdef YC_DEBUG_PRINT_EN
-            PRINT("----> NfcDynAdj, REG_RX_CTRL0 pre ... : 0x%02x\r\n", val);
-            PRINT("----> NfcDynAdj, REG_RX_CTRL0 aft ___ : 0x%02x\r\n", gain_i_q_table[i][0]);
-#endif
-        }
+        gain_i_q_table[2][1] = 0;
+    }
+    if(CALI_OK == dc_cali_q())
+    {
+        gain_i_q_table[2][2] = get_cali_q();
+    }
+    else
+    {
+        gain_i_q_table[2][2] = 0;
     }
 }
 
-
 /************************************Parameter Adjustment Function**************************************/
 void Set_Carrier_Strength(unsigned char PaGain)
 {
-	WRITEREG(REG_TX_PA_GAIN, PaGain);
+    WRITEREG(REG_TX_PA_GAIN, PaGain);
 }
 void Set_Receive_Parameters(unsigned char RxGain,unsigned char RfAtt)
 {
-	uint8_t val = 0;
-	uint8_t i = 0;
+    uint8_t val = 0;
+    uint8_t i = 0;
 
-	val = RxGain | RfAtt;
-	WRITEREG(REG_RX_CTRL0, val);
-	switch (RxGain)
-	{
-		case	RX_GAIN_6DB:
-			i = 0;
-		break;
-		case	RX_GAIN_12DB:
-			i = 1;
-		break;
-		case	RX_GAIN_18DB:
-			i = 2;
-		break;
-		case	RX_GAIN_24DB:
-			i = 3;
-		break;
-		case	RX_GAIN_30DB:
-			i = 4;
-		break;
-		case	RX_GAIN_36DB:
-			i = 5;
-		break;
-		case	RX_GAIN_42DB:
-			i = 6;
-		break;
-		case	RX_GAIN_48DB:
-			i = 7;
-		break;
-		case	RX_GAIN_54DB:
-			i = 8;
-		break;
-		default:
-			i = 0;
-		break;
-	}
-	WRITEREG(REG_RX_CTRL1, gain_i_q_table[i][1]);
-	WRITEREG(REG_RX_CTRL2, gain_i_q_table[i][2]);
+    val = RxGain | RfAtt;
+    WRITEREG(REG_RX_CTRL0, val);
+    switch(RxGain)
+    {
+        case    RX_GAIN_6DB:
+            i = 0;
+        break;
+        case    RX_GAIN_12DB:
+            i = 1;
+        break;
+        case    RX_GAIN_18DB:
+            i = 2;
+        break;
+        case    RX_GAIN_24DB:
+            i = 3;
+        break;
+        case    RX_GAIN_30DB:
+            i = 4;
+        break;
+        case    RX_GAIN_36DB:
+            i = 5;
+        break;
+        case    RX_GAIN_42DB:
+            i = 6;
+        break;
+        case    RX_GAIN_48DB:
+            i = 7;
+        break;
+        case    RX_GAIN_54DB:
+            i = 8;
+        break;
+        default:
+            i = 0;
+        break;
+    }
+    WRITEREG(REG_RX_CTRL1, gain_i_q_table[i][1]);
+    WRITEREG(REG_RX_CTRL2, gain_i_q_table[i][2]);
 }
 
 void Set_Min_Level(unsigned short MinLevel)
 {
-	WRITEREG(REG_MIN_LEVEL_LOW, MinLevel & 0xFF);
-	WRITEREG(REG_MIN_LEVEL_HIGH, MinLevel >> 8);
+    WRITEREG(REG_MIN_LEVEL_LOW, MinLevel & 0xFF);
+    WRITEREG(REG_MIN_LEVEL_HIGH, MinLevel >> 8);
 }
+
