Files
banban/ql-application/threadx/interface/custom_app/lib/libnfc/LPCD.c
T

227 lines
7.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/***********************************************************************************************
*LPCD驱动文件
***********************************************************************************************/
#include <stdio.h>
#include "DP1312EA_Config.h"
#include "DP1312EA.h"
#include "LPCD.h"
#include "ql_rtos.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
printf("lpcd_00reg = %02x \n",n);
#endif
ql_rtos_task_sleep_ms(5);
//启动载波并等待一个校准周期
DP1312EA_WriteRawRC(TxControlReg,0x83);
ql_rtos_task_sleep_ms(20);
//读取I/Q值
i = Read_I_Channel();
q = Read_Q_Channel();
#ifdef UART_DEBUG
printf("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();
}
/***********************************************************************************************
*启动LPCD并等待中断
***********************************************************************************************/
void DP1312EA_LPCD_Start(void)
{
DP1312EA_Reset();
ql_rtos_task_sleep_ms(5);
DP1312EA_LPCD_Enter(LPCD_Cycle_Time,LPCD_Duration_Time);
}
/**************************************************END*****************************************/