228 lines
7.6 KiB
C
228 lines
7.6 KiB
C
/***********************************************************************************************
|
||
*LPCD驱动文件
|
||
***********************************************************************************************/
|
||
#include <stdio.h>
|
||
#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*****************************************/
|
||
|