Index: yc_emv_contactless_l1.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.h	(revision 727)
+++ /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.h	(working copy)
@@ -18,6 +18,7 @@
 
 #include "yc3121.h"
 #include "yc_nfc_common.h"
+#include "yc_timer.h"
 
 /* Modulation index */
 #define MOD_INDEX       0x10
@@ -27,6 +28,7 @@
 #define RX_MINLEVEL     0X18A
 /*while timeout*/
 #define W_TIME_OUT      0XFFFFFFFF
+//#define READ_RxVpp
 
 /* Interface to configure the registers of YC5018 */
 extern void WRITEREG(unsigned char addr, unsigned char data);
@@ -199,7 +201,7 @@
 #define	WAIT_ATQB_PRESCALER    0
 #define	WAIT_ATQB_RELOAD       21240
 
-#define RX_CTRL3        0xBD
+#define RX_CTRL3        0x3D
 #define RX_CTRL4        0x0B
 #define RX_CTRL5        0x7C
 
@@ -493,6 +495,9 @@
 uint8_t dc_cali_q(void);
 void force_dc_calc(void);
 void dc_cali_alg(uint8_t win_size);
+void NFC_time_start(void);
+void NFCtimer0_enable(unsigned long num);
+unsigned char  Aset_read_power_xRSSI_RXVPP(void);
 
 typedef struct
 {
Index: yc_emv_contactless_l1.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.c	(revision 727)
+++ /YC3121_SDK/fw/sdk/yc_nfc/yc_emv_contactless_l1.c	(working copy)
@@ -1,7 +1,7 @@
 #include "yc_emv_contactless_l1.h"
 
 /*
-//注意1：EMV_Transceive函数内各while超时退出时间是否满足要求。要实际测试，避免还没接收完成就退出。
+//注意1：EMV_Transceive函数中等待发送完成while超时退出时间为15ms，两处等待接收完成while超时退出时间为1s，RATS中while超时退出时间为1s.
 //注意2：typeB的调制深度寄存器REG_TX_PA_MOD_GAIN的值设置必须大于等于8
 //注意3：复位引脚由低到高后可以判断REG_PMU_STATE寄存器大于等于3时进行后续寄存器配置
 //注意4：增加上电DC矫正功能，用于量产时对每个芯片矫正。
@@ -24,11 +24,7 @@
     CMD_RBLOCK
 } Cmd_t;
 
-//typedef struct
-//{
-//    uint8_t Type_A;
-//    uint8_t Type_B;
-//} EMV_Poll_Type_t;
+
 
 EMV_Poll_Type_t Poll_Type;
 
@@ -51,7 +47,11 @@
 static unsigned char FWI;
 static unsigned char FSCI;
 static unsigned char Block_Num;
-
+uint32_t contactless_over_time_cnt = 0;
+#define     CONTACTLESS_OVER_TIME_VAL           1                          		//量产中最大的接收、发送超时时间，设置为1S
+#define     CONTACTLESS_OVER_TIME_CNT           contactless_over_time_cnt       //量产中最大的接收、发送超时时间，设置为1S
+volatile unsigned int time0_cntNFC_last = 0;
+#define 	TIM0_CNTNFC    TIM_CNT(0)
 const static unsigned short FSC_Table[] = {16, 24, 32, 40, 48, 64, 96,
                                            128, 256, 512, 1024, 2048, 4096
                                           };
@@ -79,7 +79,7 @@
   */
 void SETBITMASK(unsigned char addr, unsigned char mask)
 {
-    unsigned char reg;
+    unsigned char reg = 0;
     reg = READREG(addr);
     WRITEREG(addr, (reg | mask));
 }
@@ -92,7 +92,7 @@
   */
 static void CLEARBITMASK(unsigned char addr, unsigned char mask)
 {
-    unsigned char reg;
+    unsigned char reg = 0;
     reg = READREG(addr);
     WRITEREG(addr, (reg & (~mask)));
 }
@@ -129,7 +129,7 @@
   */
 static void EMV_Set_FWT(unsigned int t)
 {
-    unsigned short prescal, reload;
+    unsigned short prescal = 0, reload = 0;
 
     reload = 65535;
     prescal = t / 65535 - 1;
@@ -219,6 +219,9 @@
     WRITEREG(REG_RX_CTRL4, RX_CTRL4);
     WRITEREG(REG_RX_CTRL5, RX_CTRL5);
 
+    SETBITMASK(REG_RX_TYPE_B_FRAMING, 0x02);
+    SETBITMASK(REG_RX_TYPE_B_FRAMING, 0x01);
+
     Set_Min_Level(RX_MINLEVEL);     //设置接收门限
     Set_Receive_Parameters(RX_GAIN_18DB, RX_I_R_500);       //设置接收增益及内部电阻
     Set_Carrier_Strength(PA_GAIN_VAL);  //设置发射功率
@@ -278,11 +281,34 @@
     {
         CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
         CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x10);
-        SysTick_Delay_Ms(2);
+        Nfc_SysTick_Delay_Ms(2);
         CLEARBITMASK(REG_TOP_CTRL, 0x01);
     }
 }
 
+
+
+
+
+void NFCtimer0_enable(unsigned long num)
+{
+    TIM_InitTypeDef TIM_struct;
+
+    enable_clock(CLKCLS_TIM);
+
+    TIM_struct.period = num;
+    TIM_struct.TIMx = (TIM_NumTypeDef)0;
+    TIM_Init(&TIM_struct);
+    TIM_Cmd((TIM_NumTypeDef)0, ENABLE);
+}
+
+void NFC_time_start(void)
+{
+    NFCtimer0_enable(0xffffffff);
+
+    contactless_over_time_cnt = CONTACTLESS_OVER_TIME_VAL * CPU_MHZ;
+}
+
 /**
   * @brief Interface of transceiving.
   * @param cmd: command
@@ -301,9 +327,12 @@
     unsigned short i = 0;
     unsigned char j = 0;
     unsigned char len = 0;
-    unsigned int t = 0, t2 = 0;
+    unsigned int t = 0;
     unsigned char err_flag = 0;
 
+
+    time0_cntNFC_last = TIM0_CNTNFC;
+
     if ((cmd != CMD_HLTA) && (!response || !responselen))
     {
         return EMV_ERR_PARA;
@@ -475,16 +504,17 @@
         }
     }
 
-    t2 = 0;
     while ((READREG(REG_IRQ0_STATE) & 0x08) == 0)
     {
-        t2++;
-        if (t2 > W_TIME_OUT)
+#ifndef EMV_L1_TEST
+        if ((time0_cntNFC_last - TIM0_CNTNFC) >= 800000)
         {
             return EOT_SHOUT;
         }
+#endif
     }
 
+
     SETBITMASK(REG_IRQ0_CLEAR, 0x40);
     CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
 
@@ -492,11 +522,9 @@
     {
         return EMV_ERR_NONE;
     }
-
-    t2 = 0;
     while (1)
     {
-        t2++;
+
         if ((READREG(REG_IRQ0_STATE) & 0x01) != 0)
         {
             return EMV_ERR_TIME_OUT;
@@ -514,18 +542,18 @@
             break;
         }
 
-        if (t2 > W_TIME_OUT)
+#ifndef EMV_L1_TEST
+        if ((time0_cntNFC_last - TIM0_CNTNFC) >= contactless_over_time_cnt)
         {
 
             return EOT_SHOUT;
         }
+#endif
     }
-
-    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++)
@@ -552,10 +580,12 @@
             CLEARBITMASK(REG_IRQ0_CLEAR, 0x40);
         }
 
-        if (t2 > W_TIME_OUT)
+#ifndef EMV_L1_TEST
+        if ((time0_cntNFC_last - TIM0_CNTNFC) >= contactless_over_time_cnt)
         {
             return EOT_SHOUT;
         }
+#endif
     }
 
     len = READREG(REG_FIFO_LENGTH);
@@ -599,7 +629,7 @@
         unsigned char *res,
         unsigned short *reslen)
 {
-    unsigned short i;
+    unsigned short i = 0;
 
     unsigned char Recv[FSD] = {0};
     unsigned char S_Block[2] = {0};
@@ -611,15 +641,15 @@
     unsigned char Send_Offset = 0;
     unsigned char Recv_Offset = 0;
 
-    unsigned char Swtx;
+    unsigned char Swtx = 0;
 
-    unsigned char Time_Out;
+    unsigned char Time_Out = 0;
 
-    unsigned char Tran_Err;
+    unsigned char Tran_Err = 0;
 
-    unsigned char Retran;
+    unsigned char Retran = 0;
 
-    unsigned char Recieving;
+    unsigned char Recieving = 0;
     unsigned char errno = EMV_ERR_NONE;
 
     if (!inf || !res || !reslen)
@@ -853,11 +883,11 @@
   */
 unsigned char YC_EMV_Contactless_L1_WUPA(void)
 {
-    unsigned char i;
+    unsigned char i = 0;
     unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char WUPA[1];
-    unsigned char ATQA[FSD];
+    unsigned char WUPA[1] = {0};
+    unsigned char ATQA[FSD] = {0};
 
 
     YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_A);
@@ -865,7 +895,7 @@
     WUPA[0] = 0x52;
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("WUPA ->: %02x\r\n", WUPA[0]);
 #endif
     Set_Receive_Parameters(RX_GAIN_18DB, RX_I_R_500);
@@ -874,7 +904,7 @@
     if (errno == EMV_ERR_NONE)
     {
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("ATQA <-: ");
         for (i = 0; i < len; i++)
         {
@@ -898,16 +928,16 @@
   */
 unsigned char YC_EMV_Contactless_L1_REQA(void)
 {
-    unsigned char i;
+    unsigned char i = 0;
     unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char REQA[1];
-    unsigned char ATQA[FSD];
+    unsigned char REQA[1] = {0};
+    unsigned char ATQA[FSD] = {0};
 
     REQA[0] = 0x26;
 
 
-#if defined (SDK_DEBUG)
+#ifdef  SDK_DEBUG
     PRINT("REQA ->: %02x\r\n", REQA[0]);
 #endif
 
@@ -916,7 +946,7 @@
 
     if (errno == EMV_ERR_NONE)
     {
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("ATQA <-: ");
         for (i = 0; i < len; i++)
         {
@@ -945,11 +975,11 @@
   */
 unsigned char YC_EMV_Contactless_L1_ANTICOLLISION(unsigned char cl)
 {
-    unsigned char i;
+    unsigned char i = 0;
     unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char ANTICOLLISION[2];
-    unsigned char  UID_CLn_Temp[FSD];
+    unsigned char ANTICOLLISION[2] = {0};
+    unsigned char  UID_CLn_Temp[FSD] = {0};
 
     ANTICOLLISION[0] = cl;
     ANTICOLLISION[1] = 0x20;
@@ -958,7 +988,7 @@
     SETBITMASK(REG_RX_BIT_CTRL, 0x10);
     CLEARBITMASK(REG_RX_BIT_CTRL, 0x08);
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("ANTICOLLISION ->: ");
     for (i = 0; i < 2; i++)
     {
@@ -969,7 +999,7 @@
 
     errno = EMV_Transceive(CMD_ANTICOLLISION, ANTICOLLISION, 2, 0, UID_CLn_Temp, &len, 0);
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("\r\n");
 #endif
     CLEARBITMASK(REG_RX_BIT_CTRL, 0x10);
@@ -979,7 +1009,7 @@
     if (errno == EMV_ERR_NONE)
     {
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("UID CLn <-: ");
         for (i = 0; i < len; i++)
         {
@@ -1051,11 +1081,11 @@
         unsigned char *UID_complete,
         unsigned char *ISOIEC14443_4_compliant)
 {
-    unsigned char i;
+    unsigned char i = 0;
     unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char SELECT[7];
-    unsigned char SAK[FSD];
+    unsigned char SELECT[7] = {0};
+    unsigned char SAK[FSD] = {0};
 
     SELECT[0] = cl;
     SELECT[1] = 0x70;
@@ -1088,7 +1118,7 @@
     }
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("SELECT ->: ");
     for (i = 0; i < 7; i++)
     {
@@ -1102,7 +1132,7 @@
 
     if (errno == EMV_ERR_NONE)
     {
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("SAK <-: ");
         for (i = 0; i < len; i++)
         {
@@ -1137,14 +1167,14 @@
   */
 unsigned char YC_EMV_Contactless_L1_RATS(void)
 {
-    unsigned char i;
+    unsigned char i = 0;
     unsigned short len = 0;
-    unsigned char SFGI;
+    unsigned char SFGI = 0;
     unsigned char TA = 0, TB = 0, TC = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char RATS[2];
+    unsigned char RATS[2] = {0};
 
-    unsigned char ATS[FSD];
+    unsigned char ATS[FSD] = {0};
 
     RATS[0] = 0xE0;
 
@@ -1152,7 +1182,7 @@
 
     SETBITMASK(REG_RX_CODER_CTRL, 0x20);
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("RATS ->: ");
     for (i = 0; i < 2; i++)
     {
@@ -1165,7 +1195,7 @@
 
     if (errno == EMV_ERR_NONE)
     {
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("ATS <-: ");
         for (i = 0; i < len; i++)
         {
@@ -1248,10 +1278,16 @@
                     WRITEREG(REG_T_CTRL, 0x01);
                     WRITEREG(REG_T_CTRL, 0x00);
 
-                    while ((READREG(REG_IRQ0_STATE) & 0x01) == 0);
+                    while ((READREG(REG_IRQ0_STATE) & 0x01) == 0)
+                    {
+
+                        if ((time0_cntNFC_last - TIM0_CNTNFC) >= contactless_over_time_cnt)
+                        {
+                            return EOT_SHOUT;
+                        }
+                    }
                 }
             }
-
             if (TC)
             {
 
@@ -1271,13 +1307,13 @@
   */
 void YC_EMV_Contactless_L1_HLTA(void)
 {
-    unsigned char i;
-    unsigned char HLTA[2];
+    unsigned char i = 0;
+    unsigned char HLTA[2] = {0};
 
     HLTA[0] = 0x50;
     HLTA[1] = 0x00;
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("HLTA ->: ");
     for (i = 0; i < 2; i++)
     {
@@ -1300,11 +1336,11 @@
   */
 unsigned char YC_EMV_Contactless_L1_WUPB(unsigned char *ISOIEC14443_4_compliant)
 {
-    unsigned char i;
+    unsigned char i = 0;
     unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char ATQB[FSD];
-    unsigned char WUPB[3];
+    unsigned char ATQB[FSD] = {0};
+    unsigned char WUPB[3] = {0};
 
     YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
     Nfc_SysTick_Delay_Ms(3);
@@ -1313,7 +1349,7 @@
     WUPB[1] = 0x00;
     WUPB[2] = 0x08;
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("WUPB ->: ");
     for (i = 0; i < 3; i++)
     {
@@ -1328,7 +1364,7 @@
     if (errno == EMV_ERR_NONE)
     {
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("ATQB <-: ");
         for (i = 0; i < len; i++)
         {
@@ -1397,11 +1433,11 @@
   */
 unsigned char YC_EMV_Contactless_L1_REQB(unsigned char *ISOIEC14443_4_compliant)
 {
-    unsigned char i;
-    unsigned short len;
+    unsigned char i = 0;
+    unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char ATQB[FSD];
-    unsigned char REQB[3];
+    unsigned char ATQB[FSD] = {0};
+    unsigned char REQB[3] = {0};
 
     YC_EMV_Contactless_L1_Switch_Card_Type(TYPE_B);
     Nfc_SysTick_Delay_Ms(3);
@@ -1413,7 +1449,7 @@
     REQB[2] = 0x00;
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("REQB ->: ");
     for (i = 0; i < 3; i++)
     {
@@ -1428,7 +1464,7 @@
     {
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("ATQB <-: ");
         for (i = 0; i < len; i++)
         {
@@ -1495,11 +1531,11 @@
   */
 unsigned char YC_EMV_Contactless_L1_ATTRIB(void)
 {
-    unsigned char i;
-    unsigned short len;
+    unsigned char i = 0;
+    unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char ATTRIB[9];
-    unsigned char  ATTRIB_RES[FSD];
+    unsigned char ATTRIB[9] = {0};
+    unsigned char  ATTRIB_RES[FSD] = {0};
 
     ATTRIB[0] = 0x1D;
 
@@ -1519,7 +1555,7 @@
 
     SETBITMASK(REG_RX_CODER_CTRL, 0x20);
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("ATTRIB ->: ");
     for (i = 0; i < 9; i++)
     {
@@ -1534,7 +1570,7 @@
     {
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("ATTRIB_RES <-: ");
         for (i = 0; i < len; i++)
         {
@@ -1553,10 +1589,7 @@
         {
             return EMV_ERR_PROTOCOL;
         }
-
-
     }
-
     return errno;
 }
 
@@ -1567,11 +1600,11 @@
   */
 unsigned char YC_EMV_Contactless_L1_HLTB(void)
 {
-    unsigned char i;
-    unsigned short len;
+    unsigned char i = 0;
+    unsigned short len = 0;
     unsigned char errno = EMV_ERR_NONE;
-    unsigned char HLTB[5];
-    unsigned char HLTB_RES[FSD];
+    unsigned char HLTB[5] = {0};
+    unsigned char HLTB_RES[FSD] = {0};
 
     HLTB[0] = 0x50;
     HLTB[1] = picc_b.PUPI[0];
@@ -1579,9 +1612,7 @@
     HLTB[3] = picc_b.PUPI[2];
     HLTB[4] = picc_b.PUPI[3];
 
-
-
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("HLTB ->: ");
     for (i = 0; i < 5; i++)
     {
@@ -1594,7 +1625,7 @@
 
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("HLTB_RES <-: ");
     for (i = 0; i < len; i++)
     {
@@ -1673,9 +1704,9 @@
 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 cl = 0;
+    uint8_t UID_complete = 0;
+    uint8_t ISOIEC14443_4_compliant = 0;
     uint8_t retr = 0;
     uint8_t errno = EMV_ERR_NONE;
 
@@ -1976,17 +2007,17 @@
 
 static uint8_t EMV_LoopBack(void)
 {
-    uint16_t i;
+    uint16_t i = 0;
     uint8_t errno = EMV_ERR_NONE;
-    uint8_t res[FSD];
-    uint16_t reslen;
+    uint8_t res[FSD] = {0};
+    uint16_t reslen = 0;
 
     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)
+#ifdef SDK_DEBUG
     PRINT("C-APDU ->: ");
     for (i = 0; i < sizeof(APDU_PPSE); i++)
     {
@@ -2003,7 +2034,7 @@
     }
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
     PRINT("R-APDU <-: ");
     for (i = 0; i < reslen; i++)
     {
@@ -2025,7 +2056,7 @@
         }
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("C-APDU ->: ");
         for (i = 0; i < reslen - 2; i++)
         {
@@ -2042,7 +2073,7 @@
         }
 
 
-#if defined (SDK_DEBUG)
+#ifdef SDK_DEBUG
         PRINT("R-APDU <-: ");
         for (i = 0; i < reslen; i++)
         {
@@ -2052,7 +2083,6 @@
 #endif
     }
 }
-
 static void EMV_Field_Reset(void)
 {
     YC_EMV_Contactless_L1_Rf_Switch(OFF);
@@ -2074,6 +2104,9 @@
   */
 void YC_EMV_Contactless_L1_Sleep(void)
 {
+    CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x20);
+    CLEARBITMASK(REG_TX_PA_GAIN_CTRL, 0x10);
+    Nfc_SysTick_Delay_Ms(20);
     CLEARBITMASK(REG_TOP_CTRL, BIT0);
     SETBITMASK(REG_TOP_CTRL, BIT2);
 }
@@ -2091,14 +2124,14 @@
 
 void set_dc_win(uint8_t win)
 {
-    uint8_t tmp;
+    uint8_t tmp = 0;
     tmp = READREG(REG_RSSI_CALC_CONFIG);
     WRITEREG(REG_RSSI_CALC_CONFIG, ((tmp & 0xFC) | win));
 }
 
 void set_rssi_calc_en(uint8_t en)
 {
-    uint8_t tmp;
+    uint8_t tmp = 0;
     tmp = READREG(REG_RSSI_CALC_CTRL);
     tmp = tmp & 0xfd;
     tmp = tmp | ((en & 0x01) << 1);
@@ -2107,7 +2140,7 @@
 
 void force_dc_calc(void)
 {
-    uint8_t tmp;
+    uint8_t tmp = 0;
     tmp = READREG(REG_RSSI_CALC_CTRL);
     WRITEREG(REG_RSSI_CALC_CTRL, (tmp & 0xFE));
     WRITEREG(REG_RSSI_CALC_CTRL, (tmp | 0x01));
@@ -2118,6 +2151,7 @@
 uint8_t dc_cali_i(void)
 {
     uint8_t cali = 0, dc = 0, cnt = 0;
+    set_cali_i(0x00);
     while (1)
     {
         cnt ++;
@@ -2194,6 +2228,7 @@
 uint8_t dc_cali_q(void)
 {
     uint8_t cali = 0, dc = 0, cnt = 0;
+    set_cali_q(0x00);
     while (1)
     {
         cnt ++;
@@ -2281,7 +2316,24 @@
     WRITEREG(REG_RX_CTRL3, RX_CTRL3);
     WRITEREG(REG_RX_CTRL4, RX_CTRL4);
     WRITEREG(REG_RX_CTRL5, RX_CTRL5);
+    Set_Receive_Parameters(RX_GAIN_6DB, RX_I_R_1K);
 
+    if (CALI_OK == dc_cali_i())
+    {
+        gain_i_q_table[0][1] = get_cali_i();
+    }
+    else
+    {
+        gain_i_q_table[0][1] = 0;
+    }
+    if (CALI_OK == dc_cali_q())
+    {
+        gain_i_q_table[0][2] = get_cali_q();
+    }
+    else
+    {
+        gain_i_q_table[0][2] = 0;
+    }
     Set_Receive_Parameters(RX_GAIN_18DB, RX_I_R_500);
 
     if (CALI_OK == dc_cali_i())
@@ -2356,4 +2408,124 @@
     WRITEREG(REG_MIN_LEVEL_LOW, MinLevel & 0xFF);
     WRITEREG(REG_MIN_LEVEL_HIGH, MinLevel >> 8);
 }
+void YC_EMV_Contactless_L1_InitRSSI(void)
+{
+    SETBITMASK(REG_TOP_CTRL, 0x10);
+    WRITEREG(REG_RX_CTRL3, 0x3D);
+    SETBITMASK(REG_RX_CTRL4, 0x01);
+    WRITEREG(REG_RX_CTRL5, 0x7C);
+    SETBITMASK(REG_RSSI_CALC_CONFIG, 0x04);
+    SETBITMASK(REG_RSSI_CALC_CTRL, 0x02);
+
+}
+
+
+uint8_t RSSI_maxi = 0, RSSI_maxq = 0;
+uint8_t Aset_read_power_index(void)
+{
+    uint8_t tmp = 0;
+    WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
+    WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
+    Nfc_SysTick_Delay_Us(100);
+    tmp = READREG(REG_AVG_POW);
+    RSSI_maxi = READREG(REG_AVG_I);
+    RSSI_maxq = READREG(REG_AVG_Q);
+    WRITEREG(REG_RSSI_CALC_CTRL, 0x00);
+
+
+    return tmp;
+
+
+}
+signed char positive_numi = 0, positive_numq = 0 ;
+signed char negative_numi = 0, negative_numq = 0 ;
+unsigned char  Aset_read_power_xRSSI(void)
+{
+
+    unsigned char tmp = 0, tmp_avgi = 0, tmp_avgq = 0;
+    set_dc_win(WIN_SIZE_128);
+
+    WRITEREG(REG_TX_PA_GAIN, PA_GAIN_VAL);
+
+    YC_EMV_Contactless_L1_Rf_Switch(ON);
+    Set_Receive_Parameters(RX_GAIN_6DB, RX_I_R_1K);       //设置接收增益及内部电阻
+
+
+    WRITEREG(REG_ADC_CTRL, 0x08);
+    WRITEREG(REG_XTAL_CTRL4, 0x07);
+
+    WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
+    WRITEREG(REG_RSSI_CALC_CTRL, 0x03);
+    Nfc_SysTick_Delay_Us(100);
+
+    tmp = READREG(REG_AVG_POW);
+    tmp_avgi = READREG(REG_AVG_I);
+    tmp_avgq = READREG(REG_AVG_Q);
+
+    if ((tmp_avgi & 0x80) | (tmp_avgq & 0x80))
+    {
+        negative_numi = tmp_avgi;
+        negative_numq = tmp_avgq;
+
+        return 11;
+
+    }
+    else
+    {
+        positive_numi = tmp_avgi;
+        positive_numq = tmp_avgq;
+        WRITEREG(REG_ADC_CTRL, 0x00);
+        WRITEREG(REG_XTAL_CTRL4, 0x06);
+        WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
+
+        return 0;
+
+    }
+}
+
+unsigned char  Aset_read_power_xRSSI_RXVPP(void)
+{
+    unsigned char i = 0, j = 0, time = 0;
+
+
+    YC_EMV_Contactless_L1_InitRSSI();
+    YC_EMV_Contactless_L1_Rf_Switch(ON);
+
+    Nfc_SysTick_Delay_Ms(30);
+    while (0x0b == Aset_read_power_xRSSI())
+    {
+        time++;
+        YC_EMV_Contactless_L1_Rf_Switch(OFF);
+        Nfc_SysTick_Delay_Ms(30);
+        YC_EMV_Contactless_L1_Rf_Switch(ON);
+        if (time > 0x0f)
+        {
+            break;
+        }
+    }
+    set_dc_win(WIN_SIZE_256);
+
+    WRITEREG(REG_TX_PA_GAIN, 0);
+
+    YC_EMV_Contactless_L1_Rf_Switch(ON);
+    Set_Receive_Parameters(RX_GAIN_6DB, RX_I_R_1K);       //设置接收增益及内部电阻
+
+    WRITEREG(REG_ADC_CTRL, 0x08);
+    WRITEREG(REG_XTAL_CTRL4, 0x07);
+    Nfc_SysTick_Delay_Us(100);
+
+
+    for (j = 0; j <= PA_GAIN_VAL; j++)
+    {
+        WRITEREG(REG_TX_PA_GAIN, j);
+        i = Aset_read_power_index();
+        PRINT("pa = 0x%02x, rssi = 0x%02x \r\n", j, i);
+
+    }
+    WRITEREG(REG_ADC_CTRL, 0x00);
+    WRITEREG(REG_XTAL_CTRL4, 0x06);
+    WRITEREG(REG_RSSI_CALC_CTRL, 0x02);
+
+    return i;
+}
 
Index: yc_nfc_common.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_nfc/yc_nfc_common.c	(revision 727)
+++ /YC3121_SDK/fw/sdk/yc_nfc/yc_nfc_common.c	(working copy)
@@ -26,6 +26,8 @@
 void WRITEREG(uint8_t addr, uint8_t data)
 {
     uint8_t flag = 0, ucbuf[3] = {0};
+
+    GPIO_Config(NFC_SPI_CS_PORT, NFC_SPI_CS_PIN, SPID1_NCS);
     if (addr & 0x80)	//page1
     {
         flag = 1;
@@ -42,11 +44,14 @@
         ucbuf[1] = 0x00;
         SPI_SendBuff(NFC_SPI, ucbuf, 2);
     }
+
+    GPIO_Config(NFC_SPI_CS_PORT, NFC_SPI_CS_PIN, OUTPUT_HIGH);
 }
 uint8_t READREG(uint8_t addr)
 {
     uint8_t reg = 0xFF, ucbuf[3] = {0};
     uint8_t flag = 0;
+    GPIO_Config(NFC_SPI_CS_PORT, NFC_SPI_CS_PIN, SPID1_NCS);
     if (addr & 0x80)	//page1
     {
         flag = 1;
@@ -62,5 +67,6 @@
         ucbuf[1] = 0x00;
         SPI_SendBuff(NFC_SPI, ucbuf, 2);
     }
+    GPIO_Config(NFC_SPI_CS_PORT, NFC_SPI_CS_PIN, OUTPUT_HIGH);
     return reg;
 }
