lpcd.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. /******************************************************************************/
  2. /** \file lpcd.c
  3. **
  4. ** lpcd driver API.
  5. ** @link Driver Group Some description @endlink
  6. **
  7. ** - 2020-07-29 1.0 Ronnie First version for Device Driver Library of
  8. ** Module.
  9. **
  10. ******************************************************************************/
  11. /*******************************************************************************
  12. * Include files
  13. ******************************************************************************/
  14. #include "lpcd.h"
  15. #include "fm175xx.h"
  16. #include "user_nfc.h"
  17. #include "mifare_card.h"
  18. #include "type_a.h"
  19. #include "type_b.h"
  20. #include "string.h"
  21. //#define TAG "lpcd"
  22. struct lpcd_struct Lpcd;
  23. void Lpcd_Set_IRQ_pin(void)
  24. {
  25. SetReg(ComIEnReg, BIT7);//IRQ引脚反相输出
  26. SetReg(DivIEnReg, BIT7);//IRQ引脚CMOS输出模式(IRQ引脚不需要外接上拉电阻)
  27. }
  28. //***********************************************
  29. //函数名称:Lpcd_Reset_Status()
  30. //函数功能:LPCD功能复位
  31. //入口参数:
  32. //出口参数:SUCCESS:操作完成
  33. //***********************************************
  34. bool Lpcd_Reset_Status(void)//LPCD功能复位
  35. {
  36. Write_Ext_Reg(JREG_LPCD_CTRL1, JBIT_BIT_CTRL_CLR + JBIT_LPCD_RSTN); //复位LPCD寄存器
  37. Write_Ext_Reg(JREG_LPCD_CTRL1, JBIT_BIT_CTRL_SET + JBIT_LPCD_RSTN); //复位放开LPCD寄存器
  38. return true;
  39. }
  40. //***********************************************
  41. //函数名称:Lpcd_Init_Register()
  42. //函数功能:LPCD寄存器初始化
  43. //入口参数:
  44. //出口参数:SUCCESS:操作完成
  45. //***********************************************
  46. bool Lpcd_Init_Register(void)
  47. {
  48. Lpcd_Set_IRQ_pin();
  49. Write_Ext_Reg(JREG_LPCD_CTRL1,JBIT_BIT_CTRL_SET + JBIT_LPCD_EN); //使能LPCD功能
  50. if(LPCD_AUTO_DETECT_TIMES == 1)
  51. {
  52. Write_Ext_Reg(JREG_LPCD_CTRL1,JBIT_BIT_CTRL_SET + JBIT_LPCD_SENSE_1);//配置1次检测
  53. }
  54. else{
  55. Write_Ext_Reg(JREG_LPCD_CTRL1,JBIT_BIT_CTRL_CLR + JBIT_LPCD_SENSE_1);//配置3次检测
  56. }
  57. Write_Ext_Reg(JREG_LPCD_CTRL3,LPCD_MODE << 3);//配置LpcdCtrl3寄存器,LPCD工作模式
  58. Write_Ext_Reg(JREG_LPCD_AUTO_WUP_CFG,(LPCD_AUTO_WUP_EN << 3) + LPCD_AUTO_WUP_CFG );//配置Auto_Wup_Cfg寄存器
  59. return true;
  60. }
  61. //***********************************************
  62. //函数名称:Lpcd_Set_Timer()
  63. //函数功能:LPCD设置Timer
  64. //入口参数:
  65. //出口参数:SUCCESS:操作完成
  66. //***********************************************
  67. bool Lpcd_Set_Timer(void)
  68. {
  69. Lpcd.Timer1 = LPCD_TIMER1_CFG & 0x0F;//TIMER1 = 0x01~0x0F
  70. Lpcd.Timer2 = LPCD_TIMER2_CFG & 0x1F;//TIMER2 = 0x01~0x1F
  71. Lpcd.Timer3 = LPCD_TIMER3_CFG & 0x1F;//TIMER3 = 0x03~0x1F
  72. Lpcd.TimerVmid = LPCD_TIMER_VMID_CFG & 0x1F;
  73. if (Lpcd.Timer3 > 0xF) //Timer3Cfg用到5bit,选择16分频
  74. {
  75. Lpcd.Timer3_Offset = 0x05;
  76. Lpcd.Timer3_Div = 2; //16分频
  77. Lpcd.Fullscale_Value = ((Lpcd.Timer3 - 1)<<3) - Lpcd.Timer3_Offset;
  78. }
  79. else if(Lpcd.Timer3 > 0x7) //Timer3Cfg用到4bit,选择8分频
  80. {
  81. Lpcd.Timer3_Offset = 0x0E;
  82. Lpcd.Timer3_Div = 1; //8分频
  83. Lpcd.Fullscale_Value = ((Lpcd.Timer3 - 1)<<4) - Lpcd.Timer3_Offset;
  84. }
  85. else{
  86. Lpcd.Timer3_Offset = 0x1F;
  87. Lpcd.Timer3_Div = 0; //4分频
  88. Lpcd.Fullscale_Value = ((Lpcd.Timer3 - 1)<<5) - Lpcd.Timer3_Offset;
  89. }
  90. Lpcd.Calibration.Range_L = LPCD_THRESHOLD;//
  91. Lpcd.Calibration.Range_H = Lpcd.Fullscale_Value - LPCD_THRESHOLD;//
  92. Write_Ext_Reg(JREG_LPCD_T1CFG, (Lpcd.Timer3_Div <<4) + Lpcd.Timer1);//配置Timer1Cfg寄存器
  93. Write_Ext_Reg(JREG_LPCD_T2CFG, Lpcd.Timer2);//配置Timer2Cfg寄存器
  94. Write_Ext_Reg(JREG_LPCD_T3CFG, Lpcd.Timer3);//配置Timer3Cfg寄存器
  95. Write_Ext_Reg(JREG_LPCD_VMIDBD_CFG, Lpcd.TimerVmid);//配置VmidBdCfg寄存器
  96. return true;
  97. }
  98. //***********************************************
  99. //函数名称:Lpcd_Set_Gain()
  100. //函数功能:LPCD设置幅度包络信号的放大、衰减增益
  101. //入口参数:
  102. //出口参数:SUCCESS:操作完成
  103. //***********************************************
  104. bool Lpcd_Set_Gain(uint8_t lpcd_gain)
  105. {
  106. lpcd_gain &= 0x1F;
  107. Write_Ext_Reg(JREG_LPCD_CTRL4, lpcd_gain);
  108. return true;
  109. }
  110. //***********************************************
  111. //函数名称:Lpcd_Set_Threshold()
  112. //函数功能:LPCD设置触发阈值
  113. //入口参数:
  114. //出口参数:SUCCESS:操作完成
  115. //***********************************************
  116. uint8_t Lpcd_Set_Threshold(uint8_t lpcd_threshold_min, uint8_t lpcd_threshold_max)
  117. {
  118. uint8_t temp;
  119. if(lpcd_threshold_max < lpcd_threshold_min)
  120. {
  121. temp = lpcd_threshold_min;
  122. lpcd_threshold_min = lpcd_threshold_max;
  123. lpcd_threshold_max = temp;
  124. }
  125. Write_Ext_Reg(JREG_LPCD_THRESHOLD_MIN_L,(lpcd_threshold_min & 0x3F));//写入THRESHOLD_Min阈值低6位
  126. Write_Ext_Reg(JREG_LPCD_THRESHOLD_MIN_H,(lpcd_threshold_min>>6));//写入THRESHOLD_Min阈值高2位
  127. Write_Ext_Reg(JREG_LPCD_THRESHOLD_MAX_L,(lpcd_threshold_max & 0x3F));//写入THRESHOLD_Max阈值低6位
  128. Write_Ext_Reg(JREG_LPCD_THRESHOLD_MAX_H,(lpcd_threshold_max>>6));//写入THRESHOLD_Max阈值高2位
  129. return true;
  130. }
  131. //***********************************************
  132. //函数名称:Lpcd_Set_Drive()
  133. //函数功能:LPCD设置输出驱动
  134. //入口参数:
  135. //出口参数:SUCCESS:操作完成
  136. //***********************************************
  137. uint8_t Lpcd_Set_Driver(uint8_t lpcd_cwp,uint8_t lpcd_cwn,uint8_t lpcd_tx2_en)
  138. {
  139. uint8_t reg_data;
  140. GetReg(VersionReg, &reg_data);
  141. if(reg_data == 0x88)//V03版本芯片
  142. {
  143. if(lpcd_cwn > 1)
  144. {
  145. lpcd_cwn = 1;
  146. }
  147. lpcd_cwn &= 0x01;
  148. lpcd_cwp &= 0x07;
  149. Write_Ext_Reg(JREG_LPCD_CTRL2, ((lpcd_tx2_en << 4) + (lpcd_cwn << 3) + lpcd_cwp));//V03版本芯片
  150. }
  151. if(reg_data == 0x89)//V03以上版本芯片
  152. {
  153. lpcd_cwn &= 0x0F;
  154. lpcd_cwp &= 0x07;
  155. Write_Ext_Reg(JREG_LPCD_CTRL2,((lpcd_tx2_en<<4) + lpcd_cwp));//V03以上版本芯片
  156. SetReg(GsNOnReg, lpcd_cwn << 4); //V03以上版本芯片
  157. }
  158. return true;
  159. }
  160. //***********************************************
  161. //函数名称:Lpcd_Set_Reference()
  162. //函数功能:LPCD设置基准信号的充电电流与充电电容
  163. //入口参数:
  164. //出口参数:SUCCESS:操作完成
  165. //***********************************************
  166. bool Lpcd_Set_Reference(uint8_t lpcd_bias_current, uint8_t lpcd_reference)
  167. {
  168. lpcd_reference &= 0x7F;
  169. lpcd_bias_current &= 0x07;
  170. Write_Ext_Reg(JREG_LPCD_BIAS_CURRENT, ((lpcd_reference & 0x40)>>1) + (lpcd_bias_current & 0x07));
  171. Write_Ext_Reg(JREG_LPCD_ADC_REFERECE, (lpcd_reference & 0x3F));
  172. return true;
  173. }
  174. //***********************************************
  175. //函数名称:Lpcd_Calibrate_Reference()
  176. //函数功能:LPCD设置校准基准电压
  177. //入口参数:
  178. //出口参数:SUCCESS:校准成功;ERROR:校准失败
  179. //***********************************************
  180. bool Lpcd_Calibrate_Reference(void)
  181. {
  182. bool result = false;
  183. Lpcd_Reset_Status();//校准基准电压前,先复位状态机
  184. for(uint8_t i = 4;i < 0x7F; i++)
  185. {
  186. Lpcd.Calibration.Reference = 0 + i;//
  187. Lpcd_Set_Reference(LPCD_BIAS_CURRENT,Lpcd.Calibration.Reference);//
  188. Lpcd.Calibration.Gain_Index = 10;//
  189. Lpcd_Set_Gain(LPCD_GAIN[Lpcd.Calibration.Gain_Index]);//
  190. Lpcd_Set_Driver(7,15,1);//
  191. Lpcd_Get_Calibration_Value(&Lpcd.Calibration.Value);
  192. // if(Lpcd_Debug_Info)
  193. // {
  194. // ESP_LOGI(TAG, "-> Refference = 0x%x",i); //Uart_Send_Msg("\r\n");
  195. // ESP_LOGI(TAG, "; Lpcd.Calibration.Value = 0x%x",Lpcd.Calibration.Value);
  196. // }
  197. if((Lpcd.Calibration.Value == 0)&&(Lpcd.Calibration.Reference != 0))
  198. {
  199. // ESP_LOGI(TAG, "Calibra Reference Success!\r\n");
  200. result = true;
  201. break;//
  202. }
  203. if((Lpcd.Calibration.Value == 0)&&(Lpcd.Calibration.Reference == 0))
  204. {
  205. // ESP_LOGI(TAG, "Calibra Reference Error!\r\n");
  206. result = false; //
  207. break;
  208. }
  209. }
  210. return result;
  211. }
  212. //***********************************************
  213. //函数名称:Lpcd_Scan_Gain()
  214. //函数功能:LPCD在各级放大、衰减增益的条件下进行校准操作,得到11个校准数据与10个校准差值
  215. //入口参数:
  216. //出口参数:SUCCESS:操作完成
  217. //***********************************************
  218. //***********************************************
  219. //函数名称:Lpcd_Calibrate_Driver()
  220. //函数功能:LPCD设置校准输出驱动
  221. //入口参数:
  222. //出口参数:SUCCESS:操作完成
  223. //***********************************************
  224. bool Lpcd_Calibrate_Driver(void)
  225. {
  226. Lpcd.Calibration.Gain_Index = LPCD_GAIN_INDEX ;//
  227. for(uint8_t j = 0; j < 12; j++)//
  228. {
  229. Lpcd_Set_Gain(LPCD_GAIN[Lpcd.Calibration.Gain_Index]);// 设置Gain
  230. for(uint8_t i = 2; i < 7; i++ )//
  231. {
  232. Lpcd.Calibration.Driver_Index = i;
  233. Lpcd_Set_Driver(LPCD_P_DRIVER[Lpcd.Calibration.Driver_Index],LPCD_N_DRIVER[Lpcd.Calibration.Driver_Index],LPCD_TX2RF_EN);//
  234. Lpcd_Get_Calibration_Value(&Lpcd.Calibration.Value);//设置Driver
  235. // if(Lpcd_Debug_Info)
  236. // {
  237. // ESP_LOGI(TAG, "-> Driver = 0x%x",i);
  238. // ESP_LOGI(TAG, "Lpcd.Calibration.Value = 0x%x",Lpcd.Calibration.Value);
  239. // }
  240. if((Lpcd.Calibration.Value > Lpcd.Calibration.Range_L)&&(Lpcd.Calibration.Value < Lpcd.Calibration.Range_H))
  241. {
  242. // if((Lpcd.Calibration.Value - LPCD_THRESHOLD > 0 )&&((Lpcd.Calibration.Value + LPCD_THRESHOLD) < Lpcd.Fullscale_Value))//
  243. if((Lpcd.Calibration.Value - (Lpcd.Fullscale_Value>>2) > 0 )&&((Lpcd.Calibration.Value + (Lpcd.Fullscale_Value>>2) ) < Lpcd.Fullscale_Value))//
  244. {
  245. Lpcd.Calibration.Threshold_Max = Lpcd.Calibration.Value + LPCD_THRESHOLD;
  246. Lpcd.Calibration.Threshold_Min = Lpcd.Calibration.Value - LPCD_THRESHOLD;
  247. // ESP_LOGI(TAG, "-> Lpcd.Calibration.Value = 0x%x",Lpcd.Calibration.Value);
  248. // ESP_LOGI(TAG, "Lpcd.Fullscale_Value = 0x%x",Lpcd.Fullscale_Value);
  249. // ESP_LOGI(TAG, "-> Lpcd.Calibration.Threshold_Max = 0x%x",Lpcd.Calibration.Threshold_Max);
  250. // ESP_LOGI(TAG, "Lpcd.Calibration.Threshold_Min = 0x%x",Lpcd.Calibration.Threshold_Min);
  251. Lpcd_Set_Threshold(Lpcd.Calibration.Threshold_Min,Lpcd.Calibration.Threshold_Max);
  252. // if(Lpcd_Debug_Test)
  253. // {
  254. // while(1)//
  255. // {
  256. // Lpcd_Get_Calibration_Value(&Lpcd.Calibration.Value);//
  257. // ESP_LOGI(TAG, "-> Lpcd.Calibration.Value2 = "); ESP_LOGI(TAG, "0x%x",Lpcd.Calibration.Value);ESP_LOGI(TAG, "\r\n");
  258. // }
  259. // }
  260. // ESP_LOGI(TAG, "Calibra Driver Success!\r\n");
  261. return true;
  262. }
  263. }
  264. }
  265. // if(Lpcd.Calibration.Value > Lpcd.Calibration.Range_H)//
  266. if(Lpcd.Calibration.Value > (Lpcd.Fullscale_Value - (Lpcd.Fullscale_Value>>1)))//
  267. {
  268. if(Lpcd.Calibration.Gain_Index == 11)
  269. {
  270. break;//
  271. }
  272. else{
  273. Lpcd.Calibration.Gain_Index++;
  274. }
  275. // ESP_LOGI(TAG, "Gain_Index++\r\n");
  276. }
  277. // if(Lpcd.Calibration.Value < Lpcd.Calibration.Range_L)//
  278. if(Lpcd.Calibration.Value < (Lpcd.Fullscale_Value>>2))//
  279. {
  280. if(Lpcd.Calibration.Gain_Index == 0)
  281. {
  282. break;//
  283. }
  284. else{
  285. Lpcd.Calibration.Gain_Index--;
  286. }
  287. // ESP_LOGI(TAG, "Gain_Index--\r\n");
  288. }
  289. }
  290. // ESP_LOGI(TAG, "Calibra Driver Error !\r\n");
  291. return false;
  292. }
  293. //***********************************************
  294. //函数名称:WaitForLpcdIrq()
  295. //函数功能:等待LPCD中断
  296. //入口参数:IrqType
  297. //出口参数:SUCCESS:读取操作完成 ERROR:超时退出
  298. //***********************************************
  299. bool Lpcd_WaitFor_Irq(uint8_t IrqType)
  300. {
  301. uint8_t ExtRegData;
  302. uint8_t TimeOutCount;
  303. TimeOutCount = 0;
  304. ExtRegData = Read_Ext_Reg(JREG_LPCD_IRQ);
  305. for(TimeOutCount = LPCD_CALIBRA_IRQ_TIMEOUT; TimeOutCount > 0; TimeOutCount--)
  306. {
  307. Delay_Ms(1); //延时
  308. ExtRegData = Read_Ext_Reg(JREG_LPCD_IRQ);
  309. if(ExtRegData & IrqType)
  310. return true;
  311. }
  312. return false;
  313. }
  314. bool Lpcd_Get_Calibration_Value(uint8_t *value)
  315. {
  316. bool result;
  317. Write_Ext_Reg(JREG_LPCD_MISC, BFL_JBIT_CALIBRATE_VMID_EN);//使能VMID电源,BFL_JBIT_AMP_EN_SEL = 1 提前使能AMP Lpcd_Reset_Status(); //清除CalibraIRq标志
  318. Write_Ext_Reg(JREG_LPCD_CTRL1, JBIT_BIT_CTRL_CLR + JBIT_LPCD_CALIBRATE_EN);//关闭校准模式
  319. Write_Ext_Reg(JREG_LPCD_CTRL1, JBIT_BIT_CTRL_SET + JBIT_LPCD_CALIBRATE_EN);//使能校准模式
  320. result = Lpcd_WaitFor_Irq(JBIT_CALIBRATE_IRQ);//等待校准结束中断
  321. Clear_BitMask(JREG_LPCD_MISC,BFL_JBIT_CALIBRATE_VMID_EN);//关闭VMID电源
  322. Write_Ext_Reg(JREG_LPCD_CTRL1,JBIT_BIT_CTRL_CLR + JBIT_LPCD_CALIBRATE_EN);//关闭校准模式
  323. Lpcd_Get_Value(&*value);
  324. Lpcd_Reset_Status(); //清除CalibraIRq标志
  325. return result;
  326. }
  327. //***********************************************
  328. //函数名称:Lpcd_Get_Value()
  329. //函数功能:读取LPCD的数值
  330. //入口参数: *value
  331. //出口参数:SUCCESS:读取操作完成 ERROR:操作超时
  332. //***********************************************
  333. bool Lpcd_Get_Value(uint8_t *value)
  334. {
  335. uint8_t ExtRegData;
  336. ExtRegData = Read_Ext_Reg(JREG_LPCD_ADC_RESULT_H);//读取幅度信息,高2位
  337. *value = ((ExtRegData & 0x3) << 6);
  338. ExtRegData = Read_Ext_Reg(JREG_LPCD_ADC_RESULT_L);//读取幅度信息,低6位
  339. *value += (ExtRegData & 0x3F);
  340. return true;
  341. }
  342. //***********************************************
  343. //函数名称:Lpcd_IRQ_Event()
  344. //函数功能:LPCD中断处理
  345. //入口参数:
  346. //出口参数:
  347. //***********************************************
  348. void Lpcd_IRQ_Event(void)
  349. {
  350. uint8_t reg;
  351. Lpcd_Calibration_Event();
  352. // if(Lpcd.Irq & JBIT_CARD_IN_IRQ)//如果有卡片中断,进入读卡操作
  353. // {
  354. Lpcd_Set_Driver(LPCD_P_DRIVER[Lpcd.Calibration.Driver_Index],LPCD_N_DRIVER[Lpcd.Calibration.Driver_Index],LPCD_TX2RF_EN);//配置LPCD输出驱动
  355. //Lpcd_Set_Reference(LPCD_BIAS_CURRENT,Lpcd.Calibration.Reference);
  356. //Lpcd_Set_Gain(LPCD_GAIN[Lpcd.Calibration.Gain_Index]);
  357. Lpcd_Set_IRQ_pin();
  358. // }
  359. Lpcd.Irq = 0;//清除LPCD中断标志
  360. return;
  361. }
  362. void Lpcd_Calibration_Restore(void)
  363. {
  364. Lpcd.Calibration.Reference = Lpcd.Calibration_Backup.Reference;
  365. Lpcd.Calibration.Gain_Index = Lpcd.Calibration_Backup.Gain_Index;
  366. Lpcd.Calibration.Driver_Index = Lpcd.Calibration_Backup.Driver_Index;
  367. // ESP_LOGI(TAG, "-> Restore Success!\r\n");
  368. return;
  369. }
  370. void Lpcd_Calibration_Backup(void)
  371. {
  372. Lpcd.Calibration_Backup.Reference = Lpcd.Calibration.Reference;
  373. Lpcd.Calibration_Backup.Gain_Index = Lpcd.Calibration.Gain_Index;
  374. Lpcd.Calibration_Backup.Driver_Index = Lpcd.Calibration.Driver_Index;
  375. // ESP_LOGI(TAG, "-> Bakckup Success!\r\n");
  376. return;
  377. }
  378. //***********************************************
  379. //函数名称:Lpcd_Calibration_Event()
  380. //函数功能:LCPD校准程序
  381. //入口参数:无
  382. //出口参数:SUCCESS:校准成功;ERROR:校准失败
  383. //***********************************************
  384. bool Lpcd_Calibration_Event(void)
  385. {
  386. bool result;
  387. // CD_SetTPD(); /* 再拉高 */
  388. // mDelay(2);
  389. Lpcd_Init_Register(); //
  390. Lpcd_Set_Timer();
  391. Lpcd_Set_Aux(LPCD_AUX_EN); //??AUX????
  392. // ESP_LOGI(TAG, "Start Calibration!\r\n");
  393. Lpcd_Reset_Status();
  394. result = Lpcd_Calibrate_Reference();
  395. if(result == false)
  396. {
  397. return false;
  398. }
  399. result = Lpcd_Calibrate_Driver();
  400. if (result == true)
  401. {
  402. // ESP_LOGI(TAG, "Calibration Success!\r\n");
  403. return true;
  404. }
  405. else
  406. {
  407. // ESP_LOGI(TAG, "Calibration Error!\r\n");
  408. Lpcd_Calibration_Restore();//恢复校准参数
  409. }
  410. return false;
  411. }
  412. //***********************************************
  413. //函数名称:Lpcd_Set_Mode()
  414. //函数功能:LCPD工作模式设置
  415. //入口参数:mode = 1:开启 mode = 0 :关闭
  416. //出口参数:
  417. //***********************************************
  418. void Lpcd_Set_Mode(uint8_t mode)
  419. {
  420. if(mode == 1)
  421. {
  422. // SetReg(ComIEnReg, 0x80); /* */
  423. // SetReg(DivIEnReg, 0x80);
  424. // SetReg(ComIrqReg,0x7f);
  425. // Lpcd_Set_IE(1);//FM175XX打开LPCD中断
  426. // NFC_HardPowerdown(0);//进入LPCD模式
  427. // ESP_LOGI(TAG, "LPCD Mode Entered!\r\n");
  428. // vTaskDelay(10 / portTICK_PERIOD_MS);
  429. // // NVIC_EnableIRQ(PIN_INT1_IRQn);
  430. unsigned int sw = 15;
  431. unsigned char delta = 0x34;
  432. WriteRawRC(0x01,0x0F); //
  433. WriteRawRC(0x14, 0x83); // Tx2CW = 1 ,continue
  434. WriteRawRC(0x37, 0x5e); //
  435. WriteRawRC(0x3c, delta);//Delta[3:0]
  436. WriteRawRC(0x3d, 0x18); //休眠时间 200MS
  437. // WriteRawRC(0x3d, 0x0d); //休眠时间 100MS
  438. WriteRawRC(0x3e, 0x80 | sw);//探测时间
  439. WriteRawRC(0x37, 0x00); // 关闭私有寄存器保护开关
  440. #if 1
  441. WriteRawRC(0x37, 0x5a);//打开私有寄存器保护开关
  442. WriteRawRC(0x38, 0xf0);//设置LPCD 发射功率
  443. WriteRawRC(0x39, 0x3f);//设置LPCD 发射功率
  444. // WriteRawRC(0x31, 0xa1);
  445. WriteRawRC(0x33, 0xa0);//调整步长,20,60,A0,E0
  446. WriteRawRC(0x36, 0x80);
  447. WriteRawRC(0x37, 0x00);//关闭私有寄存器保护开关
  448. #endif
  449. ClearBitMask(0x02, BIT7);//IRQ引脚反相输出
  450. WriteRawRC(0x03, 0xA0); //打开卡探测中断,IRQ 为CMOS 输出
  451. WriteRawRC(0x01, 0x10); //PCD soft powerdown
  452. }
  453. else{
  454. NFC_HardPowerdown(1);//退出LPCD模式
  455. Lpcd_Set_IE(0);//FM75XX关闭LPCD中断
  456. // ESP_LOGI(TAG, "LPCD Mode Exited!\r\n");
  457. }
  458. return;
  459. }
  460. //***********************************************
  461. //函数名称:Lpcd_Get_IRQ()
  462. //函数功能:LPCD读取中断标志
  463. //入口参数:*irq IRQ标志
  464. //出口参数:
  465. //***********************************************
  466. void Lpcd_Get_IRQ(uint8_t *irq)
  467. {
  468. *irq = Read_Ext_Reg(JREG_LPCD_IRQ);//读取LPCD中断寄存器
  469. // ESP_LOGI(TAG, "Lpcd.Irq = 0x%x",*irq);
  470. if(Lpcd.Irq & JBIT_CARD_IN_IRQ)
  471. {
  472. Lpcd_Get_Value(&Lpcd.Value);
  473. // ESP_LOGI(TAG, "Lpcd.Value = 0x%x",Lpcd.Value);
  474. }
  475. Lpcd_Reset_Status();//清除FM175XX中断状态
  476. return;
  477. }
  478. //***********************************************
  479. //函数名称:Lpcd_Set_IE()
  480. //函数功能:LPCD中断引脚设置
  481. //入口参数:mode = 1:开启 mode = 0 :关闭
  482. //出口参数:SUCCESS:操作完成
  483. //***********************************************
  484. bool Lpcd_Set_IE(uint8_t mode)
  485. {
  486. if(mode == 1)
  487. {
  488. Write_Ext_Reg(JREG_LPCD_CTRL1,JBIT_BIT_CTRL_SET + JBIT_LPCD_IE);//打开LPCD中断
  489. }
  490. else{
  491. Write_Ext_Reg(JREG_LPCD_CTRL1,JBIT_BIT_CTRL_CLR + JBIT_LPCD_IE);//关闭LPCD中断
  492. }
  493. return true;
  494. }
  495. //***********************************************
  496. //函数名称:Lpcd_Set_Aux()
  497. //函数功能:LPCD测试通道功能
  498. //入口参数:mode = 1:开启 mode = 0 :关闭
  499. //出口参数:SUCCESS:操作完成
  500. //***********************************************
  501. bool Lpcd_Set_Aux(uint8_t mode)
  502. {
  503. if (mode == 1)
  504. {
  505. Set_BitMask(0x39,BIT7);
  506. Clear_BitMask(0x3C,BIT1);
  507. Clear_BitMask(0x3D,(BIT2 | BIT1 | BIT0));
  508. Clear_BitMask(0x3E,(BIT1 | BIT0));
  509. SetReg(AnalogTestReg,0x00);
  510. Write_Ext_Reg(0x13,BIT0);//Aux1(pin19) = V_demodulation包络检波信号输出
  511. Write_Ext_Reg(0x14,BIT1);//Aux2(pin20)= Reference电压信号输出
  512. Write_Ext_Reg(0x15,0x00);//D2输出LPCD_OUT
  513. Write_Ext_Reg(0x16,(BIT4 | BIT3 ));//D1(pin25) = T3 ; D2(pin26) = LPCD_OUT
  514. SetReg(TestPinEnReg,0x86);//使能D1,D2 输出
  515. }
  516. else{
  517. Write_Ext_Reg(0x13,0x00);
  518. Write_Ext_Reg(0x14,0x00);
  519. Write_Ext_Reg(0x15,0x00);
  520. Write_Ext_Reg(0x16,0x00);
  521. SetReg(TestPinEnReg,0x80);//关闭D1;D2 输出
  522. }
  523. return true;
  524. }
  525. /*********************************************************************************************************
  526. ** Function name: TyteA_Read()
  527. ** Descriptions: ISO14443A协议测试
  528. ** input parameters: 无
  529. ** output parameters: 无
  530. ** Returned value: 无
  531. *********************************************************************************************************/
  532. bool TyteA_Read(uint8_t *picc_atqa, uint8_t *picc_uid)
  533. {
  534. uint8_t statues = true;
  535. uint8_t picc_sak[3]; /* 储存卡片应答信息 */
  536. FM175X_SoftReset(); /* FM175xx软件复位 */
  537. Set_Rf(3); /* 打开双天线 */
  538. Pcd_ConfigISOType(0); /* ISO14443寄存器初始化 */
  539. memset((void *)picc_uid, 0, 15);
  540. Delay_Ms(1);
  541. statues = TypeA_CardActive(picc_atqa, picc_uid, picc_sak); /* 激活卡片 */
  542. if(statues == true)
  543. {
  544. TypeA_Halt(0); /* 睡眠卡片 */
  545. }
  546. Set_Rf(0);
  547. SetReg(ComIEnReg, 0x80); /* */
  548. SetReg(DivIEnReg, 0x80);
  549. SetReg(ComIrqReg, 0x7f); /* */
  550. return statues;
  551. }
  552. /******************************************************************************
  553. * EOF (not truncated)
  554. ******************************************************************************/