user_nfc.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. #include "user_nfc.h"
  2. #include "user_spi.h"
  3. #include "lpcd.h"
  4. static nfc_work_s nfc_work = {
  5. .work_type = NFC_TYPE_RST_START,
  6. .nfc_delay_count = 0,
  7. .nfc_param = {
  8. {.init_stat = false,.version = 0,.loss_delay = 0,.card_stat = NFC_CARD_NULL,.elecStat = false,.idA = {0},.idB = {0},},
  9. {.init_stat = false,.version = 0,.loss_delay = 0,.card_stat = NFC_CARD_NULL,.elecStat = false,.idA = {0},.idB = {0},},
  10. {.init_stat = false,.version = 0,.loss_delay = 0,.card_stat = NFC_CARD_NULL,.elecStat = false,.idA = {0},.idB = {0},},
  11. {.init_stat = false,.version = 0,.loss_delay = 0,.card_stat = NFC_CARD_NULL,.elecStat = false,.idA = {0},.idB = {0},},
  12. {.init_stat = false,.version = 0,.loss_delay = 0,.card_stat = NFC_CARD_NULL,.elecStat = false,.idA = {0},.idB = {0},},
  13. },
  14. };
  15. static unsigned char uid_length = 0;
  16. static unsigned char CT[2];//卡类型
  17. static unsigned char IDA[15];//存A卡ID
  18. static unsigned char PassWd[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  19. static unsigned char RWDATA[16];
  20. static uint8_t nfc_cs_idx = 0;
  21. static vUser_nfc_upload_card_stat_func xUpload_card_stat = NULL;
  22. tmosTaskID user_nfc_task_id = INVALID_TASK_ID;
  23. static uint16_t user_nfc_task_process_event(uint8_t task_id, uint16_t events);
  24. static void set_nfc_cs(bool stat)
  25. {
  26. switch(nfc_cs_idx)
  27. {
  28. case 0:{
  29. if(stat == true)
  30. {
  31. NFC_01_CS_ON;
  32. }
  33. else{
  34. NFC_01_CS_OFF;
  35. }
  36. }break;
  37. case 1:{
  38. if(stat == true)
  39. {
  40. NFC_02_CS_ON;
  41. }
  42. else{
  43. NFC_02_CS_OFF;
  44. }
  45. }break;
  46. case 2:{
  47. if(stat == true)
  48. {
  49. NFC_03_CS_ON;
  50. }
  51. else{
  52. NFC_03_CS_OFF;
  53. }
  54. }break;
  55. case 3:{
  56. if(stat == true)
  57. {
  58. NFC_04_CS_ON;
  59. }
  60. else{
  61. NFC_04_CS_OFF;
  62. }
  63. }break;
  64. case 4:{
  65. if(stat == true)
  66. {
  67. NFC_05_CS_ON;
  68. }
  69. else{
  70. NFC_05_CS_OFF;
  71. }
  72. }break;
  73. }
  74. }
  75. /*******************************************************************************
  76. * @函数名称 user_nfc_gpio_init
  77. * @函数说明 GPIO初始化
  78. * @输入参数 无
  79. * @输出参数 无
  80. * @返回参数 无
  81. *******************************************************************************/
  82. static void user_nfc_gpio_init(void)
  83. {
  84. GPIO_InitTypeDef GPIO_InitStructure = {0};
  85. USER_NFC_GPIO_RCC_ENABLE;
  86. //输出端口初始化
  87. GPIO_InitStructure.GPIO_Pin = NFC_01_CS_PIN;
  88. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  89. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  90. GPIO_Init(NFC_01_CS_GPIO, &GPIO_InitStructure);
  91. NFC_01_CS_OFF;
  92. GPIO_InitStructure.GPIO_Pin = NFC_02_CS_PIN;
  93. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  94. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  95. GPIO_Init(NFC_02_CS_GPIO, &GPIO_InitStructure);
  96. NFC_02_CS_OFF;
  97. GPIO_InitStructure.GPIO_Pin = NFC_03_CS_PIN;
  98. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  99. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  100. GPIO_Init(NFC_03_CS_GPIO, &GPIO_InitStructure);
  101. NFC_03_CS_OFF;
  102. GPIO_InitStructure.GPIO_Pin = NFC_04_CS_PIN;
  103. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  104. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  105. GPIO_Init(NFC_04_CS_GPIO, &GPIO_InitStructure);
  106. NFC_04_CS_OFF;
  107. GPIO_InitStructure.GPIO_Pin = NFC_05_CS_PIN;
  108. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  109. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  110. GPIO_Init(NFC_05_CS_GPIO, &GPIO_InitStructure);
  111. NFC_05_CS_OFF;
  112. GPIO_InitStructure.GPIO_Pin = NFC_01_RST_PIN;
  113. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  114. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  115. GPIO_Init(NFC_01_RST_GPIO, &GPIO_InitStructure);
  116. NFC_01_RST_DISABLE;
  117. GPIO_InitStructure.GPIO_Pin = NFC_02_RST_PIN;
  118. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  119. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  120. GPIO_Init(NFC_02_RST_GPIO, &GPIO_InitStructure);
  121. NFC_02_RST_DISABLE;
  122. GPIO_InitStructure.GPIO_Pin = NFC_03_RST_PIN;
  123. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  124. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  125. GPIO_Init(NFC_03_RST_GPIO, &GPIO_InitStructure);
  126. NFC_03_RST_DISABLE;
  127. GPIO_InitStructure.GPIO_Pin = NFC_04_RST_PIN;
  128. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  129. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  130. GPIO_Init(NFC_04_RST_GPIO, &GPIO_InitStructure);
  131. NFC_04_RST_DISABLE;
  132. GPIO_InitStructure.GPIO_Pin = NFC_05_RST_PIN;
  133. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  134. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  135. GPIO_Init(NFC_05_RST_GPIO, &GPIO_InitStructure);
  136. NFC_05_RST_DISABLE;
  137. }
  138. /*********************************************************************************************************
  139. ** Function name: NFC_HardReset
  140. ** Descriptions: FM175xx硬件复位
  141. ** input parameters: N/A
  142. ** output parameters: N/A
  143. ** Returned value: true:操作成功 ERROR:操作失败
  144. *********************************************************************************************************/
  145. void NFC_HardReset(void)
  146. {
  147. switch(nfc_cs_idx)
  148. {
  149. case 0:{
  150. NFC_01_RST_ENABLE;
  151. }break;
  152. case 1:{
  153. NFC_02_RST_ENABLE
  154. }break;
  155. case 2:{
  156. NFC_03_RST_ENABLE
  157. }break;
  158. case 3:{
  159. NFC_04_RST_ENABLE
  160. }break;
  161. case 4:{
  162. NFC_05_RST_ENABLE
  163. }break;
  164. }
  165. Delay_Ms(1);
  166. switch(nfc_cs_idx)
  167. {
  168. case 0:{
  169. NFC_01_RST_DISABLE;
  170. }break;
  171. case 1:{
  172. NFC_02_RST_DISABLE
  173. }break;
  174. case 2:{
  175. NFC_03_RST_DISABLE
  176. }break;
  177. case 3:{
  178. NFC_04_RST_DISABLE
  179. }break;
  180. case 4:{
  181. NFC_05_RST_DISABLE
  182. }break;
  183. }
  184. Delay_Ms(1);
  185. }
  186. /*********************************************************************************************************
  187. ** Function name: NFC_HPD
  188. ** Descriptions: 硬件低功耗操作
  189. ** input parameters: mode = 1 退出HPD模式 ,mode = 0 进入HPD模式
  190. ** output parameters: N/A
  191. ** Returned value: NONE
  192. *********************************************************************************************************/
  193. void NFC_HardPowerdown(uint8_t mode)
  194. {
  195. if(mode == 0x00)
  196. {
  197. switch(nfc_cs_idx)
  198. {
  199. case 0:{
  200. NFC_01_RST_ENABLE;
  201. }break;
  202. case 1:{
  203. NFC_02_RST_ENABLE
  204. }break;
  205. case 2:{
  206. NFC_03_RST_ENABLE
  207. }break;
  208. case 3:{
  209. NFC_04_RST_ENABLE
  210. }break;
  211. case 4:{
  212. NFC_05_RST_ENABLE
  213. }break;
  214. } /* 读卡芯片进入硬件低功耗 */
  215. }
  216. else{
  217. switch(nfc_cs_idx)
  218. {
  219. case 0:{
  220. NFC_01_RST_DISABLE;
  221. }break;
  222. case 1:{
  223. NFC_02_RST_DISABLE
  224. }break;
  225. case 2:{
  226. NFC_03_RST_DISABLE
  227. }break;
  228. case 3:{
  229. NFC_04_RST_DISABLE
  230. }break;
  231. case 4:{
  232. NFC_05_RST_DISABLE
  233. }break;
  234. } /* 读卡芯片退出硬件低功耗 */
  235. }
  236. }
  237. /*******************************************************************************
  238. * @函数名称 ReadRawRC
  239. * @函数说明 读寄存器
  240. * @输入参数 无
  241. * @输出参数 无
  242. * @返回参数 无
  243. *****************************************************************************/
  244. unsigned char ReadRawRC(unsigned char Address)
  245. {
  246. unsigned char ucAddr;
  247. unsigned char ucResult=0;
  248. ucAddr = ((Address<<1)&0x7E)|0x80;
  249. set_nfc_cs(true);
  250. SPI_ReadWriteByte(ucAddr);//向总线写多个数据
  251. //SPI_WriteNBytes(SPI1,&ucAddr,1);
  252. ucResult = SPI_ReadWriteByte(0xFF);//向总线读多个数据
  253. //SPI_ReadNBytes(SPI1,&ucResult,1);
  254. set_nfc_cs(false);
  255. return ucResult;
  256. }
  257. /*******************************************************************************
  258. * @函数名称 WriteRawRC
  259. * @函数说明 写寄存器
  260. * @输入参数 无
  261. * @输出参数 无
  262. * @返回参数 无
  263. *****************************************************************************/
  264. void WriteRawRC(unsigned char Address, unsigned char value)
  265. {
  266. unsigned char ucAddr;
  267. uint8_t write_buffer[2]={0};
  268. ucAddr = ((Address<<1)&0x7E);
  269. set_nfc_cs(true);
  270. SPI_ReadWriteByte(ucAddr);//向总线写多个数据
  271. SPI_ReadWriteByte(value);//向总线写多个数据
  272. set_nfc_cs(false);
  273. }
  274. /*******************************************************************************
  275. * @函数名称 SetBitMask
  276. * @函数说明 设置位
  277. * @输入参数 无
  278. * @输出参数 无
  279. * @返回参数 无
  280. *****************************************************************************/
  281. void SetBitMask(unsigned char reg,unsigned char mask)
  282. {
  283. char tmp = 0x0;
  284. tmp = ReadRawRC(reg);
  285. WriteRawRC(reg,tmp | mask); // set bit mask
  286. }
  287. /*******************************************************************************
  288. * @函数名称 ClearBitMask
  289. * @函数说明 清除位
  290. * @输入参数 无
  291. * @输出参数 无
  292. * @返回参数 无
  293. *****************************************************************************/
  294. void ClearBitMask(unsigned char reg,unsigned char mask)
  295. {
  296. char tmp = 0x0;
  297. tmp = ReadRawRC(reg);
  298. WriteRawRC(reg, tmp & ~mask); // clear bit mask
  299. }
  300. /*******************************************************************************
  301. * @函数名称 Card_Check
  302. * @函数说明 检测卡片类型以及卡片的信息
  303. * @输入参数 无
  304. * @输出参数 无
  305. * @返回参数 无
  306. *****************************************************************************/
  307. static bool Card_Check(void)
  308. {
  309. bool stat = false;
  310. stat = TyteA_Read(CT, IDA);
  311. if(stat == true)
  312. {
  313. memset(nfc_work.nfc_param[nfc_cs_idx].idA, 0, 8);
  314. if(CT[0] == 0x04 && CT[1] == 0x00)
  315. {
  316. nfc_work.nfc_param[nfc_cs_idx].idA[4] = IDA[0];
  317. nfc_work.nfc_param[nfc_cs_idx].idA[5] = IDA[1];
  318. nfc_work.nfc_param[nfc_cs_idx].idA[6] = IDA[2];
  319. nfc_work.nfc_param[nfc_cs_idx].idA[7] = IDA[3];
  320. }
  321. else if(CT[0] == 0x44 && CT[1] == 0x00){
  322. nfc_work.nfc_param[nfc_cs_idx].idA[1] = IDA[1];
  323. nfc_work.nfc_param[nfc_cs_idx].idA[2] = IDA[2];
  324. nfc_work.nfc_param[nfc_cs_idx].idA[3] = IDA[3];
  325. nfc_work.nfc_param[nfc_cs_idx].idA[4] = IDA[5];
  326. nfc_work.nfc_param[nfc_cs_idx].idA[5] = IDA[6];
  327. nfc_work.nfc_param[nfc_cs_idx].idA[6] = IDA[7];
  328. nfc_work.nfc_param[nfc_cs_idx].idA[7] = IDA[8];
  329. }
  330. }
  331. return stat;
  332. }
  333. /*******************************************************************************
  334. * @函数名称 user_nfc_task
  335. * @函数说明 任务执行程序
  336. * @输入参数 无
  337. * @输出参数 无
  338. * @返回参数 无
  339. *****************************************************************************/
  340. static void prvUser_nfc_upload_card_stat(uint8_t idx, bool stat, unsigned char *card)
  341. {
  342. PRINT("No.%d read card = %s,%02X%02X%02X%02X\n",idx, (stat == true)?"true":"false",
  343. card[4], card[5], card[6], card[7]);
  344. if(xUpload_card_stat != NULL)
  345. {
  346. xUpload_card_stat(idx, stat, card);
  347. }
  348. }
  349. /*******************************************************************************
  350. * @函数名称 nfc_rst_enable
  351. * @函数说明 复位开始
  352. * @输入参数 无
  353. * @输出参数 无
  354. * @返回参数 无
  355. *****************************************************************************/
  356. static void nfc_rst_enable(void)
  357. {
  358. NFC_01_RST_ENABLE;
  359. NFC_02_RST_ENABLE;
  360. NFC_03_RST_ENABLE;
  361. NFC_04_RST_ENABLE;
  362. NFC_05_RST_ENABLE;
  363. }
  364. /*******************************************************************************
  365. * @函数名称 nfc_rst_disable
  366. * @函数说明 复位结束
  367. * @输入参数 无
  368. * @输出参数 无
  369. * @返回参数 无
  370. *****************************************************************************/
  371. static void nfc_rst_disable(void)
  372. {
  373. NFC_01_RST_DISABLE;
  374. NFC_02_RST_DISABLE;
  375. NFC_03_RST_DISABLE;
  376. NFC_04_RST_DISABLE;
  377. NFC_05_RST_DISABLE;
  378. }
  379. /*******************************************************************************
  380. * @函数名称 user_nfc_task
  381. * @函数说明 任务执行程序
  382. * @输入参数 无
  383. * @输出参数 无
  384. * @返回参数 无
  385. *****************************************************************************/
  386. static void user_nfc_task(void)
  387. {
  388. bool stat = false;
  389. if(nfc_work.nfc_delay_count > 0)
  390. {
  391. nfc_work.nfc_delay_count--;
  392. }
  393. else{
  394. switch(nfc_work.work_type)
  395. {
  396. case NFC_TYPE_RST_START:{
  397. PRINT("NFC_TYPE_RST_START\n");
  398. nfc_rst_disable();
  399. Delay_Ms(2);
  400. nfc_rst_enable();
  401. Delay_Ms(2);
  402. nfc_rst_disable();
  403. nfc_work.nfc_delay_count = 2;
  404. nfc_work.work_type = NFC_TYPE_RST_END;
  405. }break;
  406. case NFC_TYPE_RST_END:{
  407. PRINT("NFC_TYPE_RST_END\n");
  408. nfc_cs_idx = 0;
  409. nfc_work.nfc_delay_count = 2;
  410. nfc_work.work_type = NFC_TYPE_INIT;
  411. }break;
  412. case NFC_TYPE_INIT:{
  413. uint8_t id = Read_Reg(VersionReg);
  414. PRINT("No.%d NFC_TYPE_INIT,id=0x%02X\n", nfc_cs_idx, id);
  415. Lpcd_Init_Register(); /* 扩展寄存器初始化 */
  416. nfc_work.nfc_param[nfc_cs_idx].init_stat = true;
  417. nfc_work.nfc_delay_count = 2;
  418. nfc_cs_idx++;
  419. if(nfc_cs_idx >= USER_NFC_MAX_COUNT)
  420. {
  421. nfc_cs_idx = 0;
  422. nfc_work.work_type = NFC_TYPE_CARD_CHECK;
  423. }
  424. }break;
  425. case NFC_TYPE_CARD_CHECK:{
  426. stat = Card_Check();
  427. nfc_work.nfc_delay_count = 10;
  428. if(stat == true)
  429. {
  430. nfc_work.nfc_param[nfc_cs_idx].loss_delay = ID_LOSE_DELAY_COUNT;
  431. if(nfc_work.nfc_param[nfc_cs_idx].card_stat != NFC_CARD_IN)
  432. {
  433. nfc_work.nfc_param[nfc_cs_idx].card_stat = NFC_CARD_IN;
  434. prvUser_nfc_upload_card_stat(nfc_cs_idx, true, nfc_work.nfc_param[nfc_cs_idx].idA);
  435. }
  436. }
  437. else{
  438. if(nfc_work.nfc_param[nfc_cs_idx].loss_delay > 0)
  439. {
  440. nfc_work.nfc_param[nfc_cs_idx].loss_delay--;
  441. }
  442. else{
  443. memset(nfc_work.nfc_param[nfc_cs_idx].idA, 0, 8);
  444. if(nfc_work.nfc_param[nfc_cs_idx].card_stat != NFC_CARD_NO)
  445. {
  446. nfc_work.nfc_param[nfc_cs_idx].card_stat = NFC_CARD_NO;
  447. prvUser_nfc_upload_card_stat(nfc_cs_idx, false, nfc_work.nfc_param[nfc_cs_idx].idA);
  448. }
  449. }
  450. }
  451. nfc_cs_idx++;
  452. if(nfc_cs_idx >= USER_NFC_MAX_COUNT)
  453. {
  454. nfc_cs_idx = 0;
  455. nfc_work.work_type = NFC_TYPE_CARD_CHECK;
  456. }
  457. }break;
  458. default:
  459. break;
  460. }
  461. }
  462. }
  463. /*******************************************************************************
  464. * @函数名称 vUser_nfc_set_upload_key_stat_func
  465. * @函数说明 设置上报NFC读卡信息的回调函数
  466. * @输入参数 func:函数指针
  467. * @输出参数 无
  468. * @返回参数 无
  469. *******************************************************************************/
  470. void vUser_nfc_set_upload_key_stat_func(vUser_nfc_upload_card_stat_func func)
  471. {
  472. xUpload_card_stat = func;
  473. }
  474. /*******************************************************************************
  475. * @函数名称 user_nfc_task_process_event
  476. * @函数说明 task的event处理回调函数,需要在注册task时候,传进去
  477. * @输入参数 task_id:任务ID
  478. events:事件
  479. * @输出参数 无
  480. * @返回参数 无
  481. *******************************************************************************/
  482. static uint16_t user_nfc_task_process_event(uint8_t task_id, uint16_t events)
  483. {
  484. //event 处理
  485. if(events & (1 << NFC_QUEUE_TIME))
  486. {
  487. user_nfc_task();
  488. return (events ^ (1 << NFC_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志
  489. }
  490. return 0;
  491. }
  492. /*******************************************************************************
  493. * @函数名称 vUser_nfc_task_start
  494. * @函数说明 NFC任务开始
  495. * @输入参数 无
  496. * @输出参数 无
  497. * @返回参数 无
  498. *******************************************************************************/
  499. void vUser_nfc_task_start(void)
  500. {
  501. bStatus_t stat = tmos_start_reload_task(user_nfc_task_id, (1 << NFC_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_NFC_INTERVAL));
  502. // PRINT("NFC task start=%d\n", stat);
  503. }
  504. /*******************************************************************************
  505. * @函数名称 vUser_nfc_init
  506. * @函数说明 初始化
  507. * @输入参数 无
  508. * @输出参数 无
  509. * @返回参数 无
  510. *****************************************************************************/
  511. void vUser_nfc_init(void)
  512. {
  513. user_nfc_gpio_init();
  514. user_spi_Init();
  515. user_nfc_task_id = TMOS_ProcessEventRegister(user_nfc_task_process_event);
  516. PRINT("user_nfc_task_id=%d\n", user_nfc_task_id);
  517. }