/*********************************************************************************************** *LPCD驱动文件 ***********************************************************************************************/ #include #include "DP1312EA_Config.h" #include "DP1312EA.h" #include "LPCD.h" #include "nfc_platform.h" extern u8 Status_INT; /*********************************************************************************************** *写LPCD寄存器,输入寄存器地址和要写的值 ***********************************************************************************************/ void write_Lpcd_reg(u8 reg,u8 value) { DP1312EA_WriteRawRC(0x37,0xa0); DP1312EA_WriteRawRC(0x0f,reg); DP1312EA_WriteRawRC(0x37,0xa1); DP1312EA_WriteRawRC(0x0f,value); } /*********************************************************************************************** *读取LPCD寄存器,输入寄存器地址,返回读取的值 ***********************************************************************************************/ u8 read_Lpcd_reg(u8 reg) { u8 value; DP1312EA_WriteRawRC(0x37,0xa0); DP1312EA_WriteRawRC(0x0f,reg); DP1312EA_WriteRawRC(0x37,0xa1); value = DP1312EA_ReadRawRC(0x0f); return value; } /*********************************************************************************************** *读取LPCD I通道寄存器值 ***********************************************************************************************/ u8 Read_I_Channel(void) { u8 i; DP1312EA_WriteRawRC(0x37,0xa0); DP1312EA_WriteRawRC(0x0f,0x05); DP1312EA_WriteRawRC(0x37,0xa1); i = DP1312EA_ReadRawRC(0x0f); //LPCD_RI return i; } /*********************************************************************************************** *读取LPCD Q通道寄存器值 ***********************************************************************************************/ u8 Read_Q_Channel(void) { u8 q; DP1312EA_WriteRawRC(0x37,0xa0); DP1312EA_WriteRawRC(0x0f,0x06); DP1312EA_WriteRawRC(0x37,0xa1); q = DP1312EA_ReadRawRC(0x0f); //LPCD_RQ return q; } /*********************************************************************************************** *设置LPCD I/Q通道唤醒阈值 ***********************************************************************************************/ void set_I_Q_threshold(u8 I_value,u8 Q_value) { u8 I_MIN,I_MAX; u8 Q_MIN,Q_MAX; if((I_value>=LPCD_Sensitive_Value)&&(Q_value>=LPCD_Sensitive_Value)) { I_MIN = I_value - LPCD_Sensitive_Value; I_MAX = I_value + LPCD_Sensitive_Value; Q_MIN = Q_value - LPCD_Sensitive_Value; Q_MAX = Q_value + LPCD_Sensitive_Value; } else { I_MIN = 0x9c; I_MAX = 0x9c; Q_MIN = 0x7c; Q_MAX = 0x7c; } write_Lpcd_reg(0x01,I_MAX); write_Lpcd_reg(0x02,I_MIN); write_Lpcd_reg(0x03,Q_MAX); write_Lpcd_reg(0x04,Q_MIN); } /*********************************************************************************************** *禁止LPCD,若唤醒后读卡没有复位读卡芯片,需要读卡前先禁止LPCD功能 ***********************************************************************************************/ void DP1312EA_LPCD_Stop(void) { DP1312EA_WriteRawRC(0x37,0xa0); DP1312EA_WriteRawRC(0x0f,0x00); DP1312EA_WriteRawRC(0x37,0xa1); DP1312EA_WriteRawRC(0x0f,0x00); } /*********************************************************************************************** *清除读卡芯片LPCD中断标志位 ***********************************************************************************************/ void Clear_lpcd_irq(void) { DP1312EA_WriteRawRC(DivIrqReg,0x20); //清中断标记 } /********************************************************************************************************** *函数名称:void DP1312EA_LPCD_Enter(u16 cycle,u16 duration ) *功能描述: 设置并进入LPCD模式,有操作顺序要求,不要改动操作顺序。 *输入参数: cycle:检测周期,16位,默认0x22ff,380ms,误差约10%; duration:检测时长,16位,默认0x001f,2.5us;可选0x003f=5us,0x007f=10us; *返回参数: 无 *其它输出: IRQ中断,1)可选CMOS输出或开漏输出,开漏输出需外接上拉电阻;2)可选高电平中断或低电平中断; **********************************************************************************************************/ void DP1312EA_LPCD_Enter(u16 cycle,u16 duration ) { u8 i,q,n; n = DP1312EA_ReadRawRC(0x0c); DP1312EA_WriteRawRC(0x0c, n|0x10); //DP1312EA_WriteRawRC(0x28,0x02); //视测试效果启用,调节灵敏度 /*set IRQ int level*/ #if (IRQ_LEVEL_SET == IRQ_HIGH_LEVEL) DP1312EA_WriteRawRC(ComIEnReg,0x00); //ComIEnReg的bit7 置0,高电平中断 #else DP1312EA_WriteRawRC(ComIEnReg,0x80); //ComIEnReg的bit7 置1,低电平中断 #endif /*set IRQ Output Mode*/ #if (IRQ_OUT_MODE == IRQ_OUT_PP) DP1312EA_WriteRawRC(DivlEnReg,0xE0); //bit7=1设置为CMOS输出,bit5=1 LPCD中断使能 #else DP1312EA_WriteRawRC(DivlEnReg,0x60); //bit7=0设置为OPEN DRAIN输出,bit5=1 LPCD中断使能 #endif DP1312EA_WriteRawRC(DivIrqReg,0x7F); //清中断标记 //设置检测时长 write_Lpcd_reg(0x08,(u8)(duration>>8)); //时长高位寄存器 write_Lpcd_reg(0x09,(u8)duration); //时长低位寄存器 //设置检测周期 write_Lpcd_reg(0x0a,0x00); //检测周期高位寄存器 write_Lpcd_reg(0x0b,0xff); //检测周期低位寄存器 //准备启动操作1 write_Lpcd_reg(0x01,0xf0); //LPCD操作寄存器 write_Lpcd_reg(0x02,0x00); write_Lpcd_reg(0x03,0xf0); //LPCD操作寄存器 write_Lpcd_reg(0x04,0x00); //使能LPCD,与启动要分开 write_Lpcd_reg(0x00,0x50); //enable LPCD //启动LPCD write_Lpcd_reg(0x00,0xd0); //start LPCD //读取控制寄存器,不是必须的,为了观察 n=read_Lpcd_reg(0x00); #ifdef UART_DEBUG nfc_platform_log("lpcd_00reg = %02x \n",n); #endif nfc_platform_sleep_ms(5); //启动载波并等待一个校准周期 DP1312EA_WriteRawRC(TxControlReg,0x83); nfc_platform_sleep_ms(20); //读取I/Q值 i = Read_I_Channel(); q = Read_Q_Channel(); #ifdef UART_DEBUG nfc_platform_log("lpcd_: I:%02X ,Q:%02X\n",i,q); #endif //设置唤醒阈值 set_I_Q_threshold(i,q); //设定检测时长; write_Lpcd_reg(0x08,(u8)(duration>>8)); //时长高位寄存器 write_Lpcd_reg(0x09,(u8)duration); //时长低位寄存器 //设定最终检测周期 write_Lpcd_reg(0x0a,(u8)(cycle>>8)); write_Lpcd_reg(0x0b,(u8)(cycle)); DP1312EA_WriteRawRC(DivIrqReg,0x7F); //清中断标记 } /*********************************************************************************************** *等待卡中断 ***********************************************************************************************/ u8 DP1312EA_CLEAR_IRQ(void) { Clear_lpcd_irq(); return MI_OK; } /*********************************************************************************************** *启动LPCD并等待中断 ***********************************************************************************************/ void DP1312EA_LPCD_Start(void) { DP1312EA_Reset(); nfc_platform_sleep_ms(5); DP1312EA_LPCD_Enter(LPCD_Cycle_Time,LPCD_Duration_Time); } /**************************************************END*****************************************/