#include "user_nfc.h" #include "user_spi.h" #include "lpcd.h" static nfc_work_s nfc_work = { .work_type = NFC_TYPE_RST_START, .nfc_delay_count = 0, .left_init_stat = false, .right_init_stat = false, .left_loss_delay = 0, .right_loss_delay = 0, .left_ver = 0, .left_ID = 0, .right_ver = 0, .right_ID = 0, .left_card_stat = NFC_CARD_NULL, .right_card_stat = NFC_CARD_NULL, .left_idA = {0}, .right_idA = {0}, .left_idB = {0}, .right_idB = {0}, .left_charge_stat = false, .right_charge_stat = false, }; static unsigned char uid_length = 0; static unsigned char CT[2];//卡类型 static unsigned char IDA[15];//存A卡ID static unsigned char PassWd[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; static unsigned char RWDATA[16]; static uint8_t nfc_cs_idx = 0; static vUser_nfc_upload_card_stat_func xUpload_card_stat = NULL; tmosTaskID user_nfc_task_id = INVALID_TASK_ID; static uint16_t user_nfc_task_process_event(uint8_t task_id, uint16_t events); /******************************************************************************* * @函数名称 user_nfc_gpio_init * @函数说明 GPIO初始化 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static void user_nfc_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; USER_NFC_GPIO_RCC_ENABLE; //输出端口初始化 GPIO_InitStructure.GPIO_Pin = LEFT_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LEFT_CS_GPIO, &GPIO_InitStructure); LEFT_CS_OFF; GPIO_InitStructure.GPIO_Pin = RIGHT_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RIGHT_CS_GPIO, &GPIO_InitStructure); RIGHT_CS_OFF; GPIO_InitStructure.GPIO_Pin = LEFT_RST_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LEFT_RST_GPIO, &GPIO_InitStructure); LEFT_RST_DISABLE; GPIO_InitStructure.GPIO_Pin = RIGHT_RST_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(RIGHT_RST_GPIO, &GPIO_InitStructure); RIGHT_RST_DISABLE; //输入端口初始化 GPIO_InitStructure.GPIO_Pin = LEFT_IRQ_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(LEFT_IRQ_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = RIGHT_IRQ_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(RIGHT_IRQ_GPIO, &GPIO_InitStructure); } /********************************************************************************************************* ** Function name: NFC_HardReset ** Descriptions: FM175xx硬件复位 ** input parameters: N/A ** output parameters: N/A ** Returned value: true:操作成功 ERROR:操作失败 *********************************************************************************************************/ void NFC_HardReset(void) { if(nfc_cs_idx == 0) { LEFT_RST_ENABLE; } else{ RIGHT_RST_ENABLE; } Delay_Ms(1); if(nfc_cs_idx == 0) { LEFT_RST_DISABLE; } else{ RIGHT_RST_DISABLE; } Delay_Ms(1); } /********************************************************************************************************* ** Function name: NFC_HPD ** Descriptions: 硬件低功耗操作 ** input parameters: mode = 1 退出HPD模式 ,mode = 0 进入HPD模式 ** output parameters: N/A ** Returned value: NONE *********************************************************************************************************/ void NFC_HardPowerdown(uint8_t mode) { if(mode == 0x00) { if(nfc_cs_idx == 0) { LEFT_RST_ENABLE; } else{ RIGHT_RST_ENABLE; } /* 读卡芯片进入硬件低功耗 */ } else{ if(nfc_cs_idx == 0) { LEFT_RST_DISABLE; } else{ RIGHT_RST_DISABLE; } /* 读卡芯片退出硬件低功耗 */ } } /******************************************************************************* * @函数名称 ReadRawRC * @函数说明 读寄存器 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ unsigned char ReadRawRC(unsigned char Address) { unsigned char ucAddr; unsigned char ucResult=0; ucAddr = ((Address<<1)&0x7E)|0x80; if(nfc_cs_idx == 0) { LEFT_CS_ON; } else{ RIGHT_CS_ON; } SPI_ReadWriteByte(ucAddr);//向总线写多个数据 //SPI_WriteNBytes(SPI1,&ucAddr,1); ucResult = SPI_ReadWriteByte(0xFF);//向总线读多个数据 //SPI_ReadNBytes(SPI1,&ucResult,1); if(nfc_cs_idx == 0) { LEFT_CS_OFF; } else{ RIGHT_CS_OFF; } return ucResult; } /******************************************************************************* * @函数名称 WriteRawRC * @函数说明 写寄存器 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ void WriteRawRC(unsigned char Address, unsigned char value) { unsigned char ucAddr; uint8_t write_buffer[2]={0}; ucAddr = ((Address<<1)&0x7E); if(nfc_cs_idx == 0) { LEFT_CS_ON; } else{ RIGHT_CS_ON; } SPI_ReadWriteByte(ucAddr);//向总线写多个数据 SPI_ReadWriteByte(value);//向总线写多个数据 if(nfc_cs_idx == 0) { LEFT_CS_OFF; } else{ RIGHT_CS_OFF; } } /******************************************************************************* * @函数名称 SetBitMask * @函数说明 设置位 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ void SetBitMask(unsigned char reg,unsigned char mask) { char tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg,tmp | mask); // set bit mask } /******************************************************************************* * @函数名称 ClearBitMask * @函数说明 清除位 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ void ClearBitMask(unsigned char reg,unsigned char mask) { char tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg, tmp & ~mask); // clear bit mask } /******************************************************************************* * @函数名称 Card_Check * @函数说明 检测卡片类型以及卡片的信息 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ static bool Card_Check(void) { bool stat = false; stat = TyteA_Read(CT, IDA); if(stat == true) { if(LEFT_TYPE_CARD_CHECK == nfc_work.work_type) { memset(nfc_work.left_idA, 0, 8); if(CT[0] == 0x04 && CT[1] == 0x00) { nfc_work.left_idA[4] = IDA[0]; nfc_work.left_idA[5] = IDA[1]; nfc_work.left_idA[6] = IDA[2]; nfc_work.left_idA[7] = IDA[3]; } else if(CT[0] == 0x44 && CT[1] == 0x00){ nfc_work.left_idA[1] = IDA[1]; nfc_work.left_idA[2] = IDA[2]; nfc_work.left_idA[3] = IDA[3]; nfc_work.left_idA[4] = IDA[5]; nfc_work.left_idA[5] = IDA[6]; nfc_work.left_idA[6] = IDA[7]; nfc_work.left_idA[7] = IDA[8]; } } else if(RIGHT_TYPE_CARD_CHECK == nfc_work.work_type) { memset(nfc_work.right_idA, 0, 8); if(CT[0] == 0x04 && CT[1] == 0x00) { nfc_work.right_idA[4] = IDA[0]; nfc_work.right_idA[5] = IDA[1]; nfc_work.right_idA[6] = IDA[2]; nfc_work.right_idA[7] = IDA[3]; } else if(CT[0] == 0x44 && CT[1] == 0x00){ nfc_work.right_idA[1] = IDA[1]; nfc_work.right_idA[2] = IDA[2]; nfc_work.right_idA[3] = IDA[3]; nfc_work.right_idA[4] = IDA[5]; nfc_work.right_idA[5] = IDA[6]; nfc_work.right_idA[6] = IDA[7]; nfc_work.right_idA[7] = IDA[8]; } } } return stat; } /******************************************************************************* * @函数名称 user_nfc_task * @函数说明 任务执行程序 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ static void prvUser_nfc_upload_card_stat(uint8_t idx, bool stat, unsigned char *card) { PRINT("%s read card = %s,%02X%02X%02X%02X\n",(idx == LEFT_IDX)?"left":"right", (stat == true)?"true":"false", card[4], card[5], card[6], card[7]); if(xUpload_card_stat != NULL) { xUpload_card_stat(idx, stat, card); } } /******************************************************************************* * @函数名称 user_nfc_task * @函数说明 任务执行程序 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ static void user_nfc_task(void) { bool stat = false; if(nfc_work.nfc_delay_count > 0) { nfc_work.nfc_delay_count--; } else{ switch(nfc_work.work_type) { case NFC_TYPE_RST_START:{ PRINT("NFC_TYPE_RST_START\n"); RIGHT_RST_DISABLE; LEFT_RST_DISABLE; Delay_Ms(2); RIGHT_RST_ENABLE; LEFT_RST_ENABLE; Delay_Ms(2); RIGHT_RST_DISABLE; LEFT_RST_DISABLE; nfc_work.nfc_delay_count = 2; nfc_work.work_type = NFC_TYPE_RST_END; }break; case NFC_TYPE_RST_END:{ PRINT("NFC_TYPE_RST_END\n"); nfc_work.nfc_delay_count = 2; nfc_work.work_type = LEFT_TYPE_INIT; }break; case LEFT_TYPE_INIT:{ nfc_cs_idx = 0; uint8_t id = Read_Reg(VersionReg); PRINT("LEFT_TYPE_INIT,id=0x%02X\n", id); Lpcd_Init_Register(); /* 扩展寄存器初始化 */ nfc_work.nfc_delay_count = 2; nfc_work.work_type = RIGHT_TYPE_INIT; nfc_work.left_init_stat = true; }break; case RIGHT_TYPE_INIT:{ nfc_cs_idx = 1; uint8_t id = Read_Reg(VersionReg); PRINT("RIGHT_TYPE_INIT,id=0x%02X\n", id); Lpcd_Init_Register(); /* 扩展寄存器初始化 */ nfc_work.nfc_delay_count = 2; nfc_work.work_type = NFC_CARD_CHECK_DELAY; nfc_work.right_init_stat = true; }break; case LEFT_TYPE_CARD_CHECK:{ // PRINT("LEFT_TYPE_CARD_CHECK\n"); nfc_cs_idx = 0; stat = Card_Check(); if(nfc_work.right_charge_stat == false) { nfc_work.work_type = RIGHT_TYPE_CARD_CHECK; } else{ nfc_work.work_type = NFC_CARD_CHECK_DELAY; } nfc_work.nfc_delay_count = 50; if(stat == true) { nfc_work.left_loss_delay = ID_LOSE_DELAY_COUNT; if(nfc_work.left_card_stat != NFC_CARD_IN) { nfc_work.left_card_stat = NFC_CARD_IN; prvUser_nfc_upload_card_stat(LEFT_IDX, true, nfc_work.left_idA); } } else{ if(nfc_work.left_loss_delay > 0) { nfc_work.left_loss_delay--; } else{ memset(nfc_work.left_idA, 0, 8); if(nfc_work.left_card_stat != NFC_CARD_NO) { nfc_work.left_card_stat = NFC_CARD_NO; prvUser_nfc_upload_card_stat(LEFT_IDX, false, nfc_work.left_idA); } } } }break; case RIGHT_TYPE_CARD_CHECK:{ // PRINT("RIGHT_TYPE_CARD_CHECK\n"); nfc_cs_idx = 1; stat = Card_Check(); nfc_work.work_type = NFC_CARD_CHECK_DELAY; nfc_work.nfc_delay_count = 10; if(stat == true) { nfc_work.right_loss_delay = ID_LOSE_DELAY_COUNT; if(nfc_work.right_card_stat != NFC_CARD_IN) { nfc_work.right_card_stat = NFC_CARD_IN; prvUser_nfc_upload_card_stat(RIGHT_IDX, true, nfc_work.right_idA); } } else{ if(nfc_work.right_loss_delay > 0) { nfc_work.right_loss_delay--; } else{ memset(nfc_work.right_idA, 0, 8); if(nfc_work.right_card_stat != NFC_CARD_NO) { nfc_work.right_card_stat = NFC_CARD_NO; prvUser_nfc_upload_card_stat(RIGHT_IDX, false, nfc_work.right_idA); } } } }break; case NFC_CARD_CHECK_DELAY:{ // PRINT("NFC_CARD_CHECK_DELAY\n"); if(nfc_work.left_charge_stat == false) { nfc_work.work_type = LEFT_TYPE_CARD_CHECK; } else if(nfc_work.right_charge_stat == false) { nfc_work.work_type = RIGHT_TYPE_CARD_CHECK; } nfc_work.nfc_delay_count = 40; }break; default: break; } } } /******************************************************************************* * @函数名称 vUser_nfc_set_upload_key_stat_func * @函数说明 设置上报NFC读卡信息的回调函数 * @输入参数 func:函数指针 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_nfc_set_upload_key_stat_func(vUser_nfc_upload_card_stat_func func) { xUpload_card_stat = func; } /******************************************************************************* * @函数名称 user_nfc_task_process_event * @函数说明 task的event处理回调函数,需要在注册task时候,传进去 * @输入参数 task_id:任务ID events:事件 * @输出参数 无 * @返回参数 无 *******************************************************************************/ static uint16_t user_nfc_task_process_event(uint8_t task_id, uint16_t events) { //event 处理 if(events & (1 << NFC_QUEUE_TIME)) { user_nfc_task(); return (events ^ (1 << NFC_QUEUE_TIME)); //异或的方式清除该事件运行标志,并返回未运行的事件标志 } return 0; } /******************************************************************************* * @函数名称 vUser_nfc_task_start * @函数说明 NFC任务开始 * @输入参数 无 * @输出参数 无 * @返回参数 无 *******************************************************************************/ void vUser_nfc_task_start(void) { bStatus_t stat = tmos_start_reload_task(user_nfc_task_id, (1 << NFC_QUEUE_TIME), MS1_TO_SYSTEM_TIME(USER_NFC_INTERVAL)); PRINT("NFC task start=%d\n", stat); } /******************************************************************************* * @函数名称 vUser_nfc_init * @函数说明 初始化 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ void vUser_nfc_init(void) { user_nfc_gpio_init(); user_spi_Init(); user_nfc_task_id = TMOS_ProcessEventRegister(user_nfc_task_process_event); PRINT("user_nfc_task_id=%d\n", user_nfc_task_id); } /******************************************************************************* * @函数名称 vUser_nfc_set_charge_stat * @函数说明 设置无线充电状态 * @输入参数 无 * @输出参数 无 * @返回参数 无 *****************************************************************************/ void vUser_nfc_set_charge_stat(uint8_t idx, bool stat) { if(idx == LEFT_IDX) { nfc_work.left_charge_stat = stat; } else if(idx == RIGHT_IDX) { nfc_work.right_charge_stat = stat; } }