Files
portable_modules/nfc/vendor/dp1312ea/LPCD.c
2026-07-20 10:48:38 +08:00

228 lines
7.6 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 "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位默认0x22ff380ms误差约10%
duration检测时长16位默认0x001f2.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*****************************************/