Add portable NFC module

This commit is contained in:
2026-07-20 10:48:38 +08:00
commit 4ed123f87c
25 changed files with 3965 additions and 0 deletions

227
nfc/vendor/dp1312ea/LPCD.c vendored Normal file
View File

@@ -0,0 +1,227 @@
/***********************************************************************************************
*LPCD<43><44><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
***********************************************************************************************/
#include <stdio.h>
#include "DP1312EA_Config.h"
#include "DP1312EA.h"
#include "LPCD.h"
#include "nfc_platform.h"
extern u8 Status_INT;
/***********************************************************************************************
*дLPCD<43>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Ҫд<D2AA><D0B4>ֵ
***********************************************************************************************/
void write_Lpcd_reg(u8 reg,u8 value)
{
DP1312EA_WriteRawRC(0x37,0xa0);
DP1312EA_WriteRawRC(0x0f,reg);
DP1312EA_WriteRawRC(0x37,0xa1);
DP1312EA_WriteRawRC(0x0f,value);
}
/***********************************************************************************************
*<2A><>ȡLPCD<43>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,<2C><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1>ֵ
***********************************************************************************************/
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;
}
/***********************************************************************************************
*<2A><>ȡLPCD Iͨ<49><CDA8><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ
***********************************************************************************************/
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;
}
/***********************************************************************************************
*<2A><>ȡLPCD Qͨ<51><CDA8><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ
***********************************************************************************************/
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;
}
/***********************************************************************************************
*<2A><><EFBFBD><EFBFBD>LPCD I/Qͨ<51><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
***********************************************************************************************/
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);
}
/***********************************************************************************************
*<2A><>ֹLPCD<43><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>и<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ǰ<EFBFBD>Ƚ<EFBFBD>ֹLPCD<43><44><EFBFBD><EFBFBD>
***********************************************************************************************/
void DP1312EA_LPCD_Stop(void)
{
DP1312EA_WriteRawRC(0x37,0xa0);
DP1312EA_WriteRawRC(0x0f,0x00);
DP1312EA_WriteRawRC(0x37,0xa1);
DP1312EA_WriteRawRC(0x0f,0x00);
}
/***********************************************************************************************
*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬLPCD<43>жϱ<D0B6>־λ
***********************************************************************************************/
void Clear_lpcd_irq(void)
{
DP1312EA_WriteRawRC(DivIrqReg,0x20); //<2F><><EFBFBD>жϱ<D0B6><CFB1><EFBFBD>
}
/**********************************************************************************************************
*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>void DP1312EA_LPCD_Enter(u16 cycle,u16 duration )
*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>LPCDģʽ<C4A3><CABD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>˳<EFBFBD><CBB3>Ҫ<EFBFBD>󣬲<EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>
*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cycle<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>16λ<36><CEBB>Ĭ<EFBFBD><C4AC>0x22ff<66><66>380ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ10%<25><>
duration<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>16λ<36><CEBB>Ĭ<EFBFBD><C4AC>0x001f<31><66>2.5us<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ0x003f=5us,0x007f=10us<75><73>
*<2A><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD>
<20><>
*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IRQ<52>жϣ<D0B6>1)<29><>ѡCMOS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>裻2)<29><>ѡ<EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD>жϻ<D0B6><CFBB>͵<EFBFBD>ƽ<EFBFBD>жϣ<D0B6>
**********************************************************************************************************/
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); //<2F>Ӳ<EFBFBD><D3B2><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*set IRQ int level*/
#if (IRQ_LEVEL_SET == IRQ_HIGH_LEVEL)
DP1312EA_WriteRawRC(ComIEnReg,0x00); //ComIEnReg<65><67>bit7 <20><>0<EFBFBD><30><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD>ж<EFBFBD>
#else
DP1312EA_WriteRawRC(ComIEnReg,0x80); //ComIEnReg<65><67>bit7 <20><>1<EFBFBD><31><EFBFBD>͵<EFBFBD>ƽ<EFBFBD>ж<EFBFBD>
#endif
/*set IRQ Output Mode*/
#if (IRQ_OUT_MODE == IRQ_OUT_PP)
DP1312EA_WriteRawRC(DivlEnReg,0xE0); //bit7=1<><31><EFBFBD><EFBFBD>ΪCMOS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bit5=1 LPCD<43>ж<EFBFBD>ʹ<EFBFBD><CAB9>
#else
DP1312EA_WriteRawRC(DivlEnReg,0x60); //bit7=0<><30><EFBFBD><EFBFBD>ΪOPEN DRAIN<49><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>bit5=1 LPCD<43>ж<EFBFBD>ʹ<EFBFBD><CAB9>
#endif
DP1312EA_WriteRawRC(DivIrqReg,0x7F); //<2F><><EFBFBD>жϱ<D0B6><CFB1><EFBFBD>
//<2F><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD>ʱ<EFBFBD><CAB1>
write_Lpcd_reg(0x08,(u8)(duration>>8)); //ʱ<><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
write_Lpcd_reg(0x09,(u8)duration); //ʱ<><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
//<2F><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
write_Lpcd_reg(0x0a,0x00); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
write_Lpcd_reg(0x0b,0xff); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
//׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
write_Lpcd_reg(0x01,0xf0); //LPCD<43><44><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
write_Lpcd_reg(0x02,0x00);
write_Lpcd_reg(0x03,0xf0); //LPCD<43><44><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
write_Lpcd_reg(0x04,0x00);
//ʹ<><CAB9>LPCD<43><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ֿ<EFBFBD>
write_Lpcd_reg(0x00,0x50); //enable LPCD
//<2F><><EFBFBD><EFBFBD>LPCD
write_Lpcd_reg(0x00,0xd0); //start LPCD
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD>ģ<EFBFBD>Ϊ<EFBFBD>˹۲<CBB9>
n=read_Lpcd_reg(0x00);
#ifdef UART_DEBUG
nfc_platform_log("lpcd_00reg = %02x \n",n);
#endif
nfc_platform_sleep_ms(5);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ȴ<EFBFBD>һ<EFBFBD><D2BB>У׼<D0A3><D7BC><EFBFBD><EFBFBD>
DP1312EA_WriteRawRC(TxControlReg,0x83);
nfc_platform_sleep_ms(20);
//<2F><>ȡ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
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ֵ
set_I_Q_threshold(i,q);
//<2F><EFBFBD><E8B6A8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
write_Lpcd_reg(0x08,(u8)(duration>>8)); //ʱ<><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
write_Lpcd_reg(0x09,(u8)duration); //ʱ<><CAB1><EFBFBD><EFBFBD>λ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
//<2F><EFBFBD><E8B6A8><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
write_Lpcd_reg(0x0a,(u8)(cycle>>8));
write_Lpcd_reg(0x0b,(u8)(cycle));
DP1312EA_WriteRawRC(DivIrqReg,0x7F); //<2F><><EFBFBD>жϱ<D0B6><CFB1><EFBFBD>
}
/***********************************************************************************************
*<2A>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ж<EFBFBD>
***********************************************************************************************/
u8 DP1312EA_CLEAR_IRQ(void)
{
Clear_lpcd_irq();
return MI_OK;
}
/***********************************************************************************************
*<2A><><EFBFBD><EFBFBD>LPCD<43><44><EFBFBD>ȴ<EFBFBD><C8B4>ж<EFBFBD>
***********************************************************************************************/
void DP1312EA_LPCD_Start(void)
{
DP1312EA_Reset();
nfc_platform_sleep_ms(5);
DP1312EA_LPCD_Enter(LPCD_Cycle_Time,LPCD_Duration_Time);
}
/**************************************************END*****************************************/