//////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_drv.c /// @brief bsp @ driver config ///------------------------------------------------------------------------- /// @version 1.0 /// @author CC /// @date 20180331 /// @note cc_AS_stc02 ////////////////////////////////////////////////////////////////////////////// #include "task_rfid.h" #include "../app/app_config.h" #include "../bsp/bsp_config.h" #include "../msp/uart0.h" #include "../msp/uart4.h" S_TASK_RFID _s_task_rfid; //4通道,读取次数 3 3 3 3 U8 rfidSetChannelCmd[] = {0xBB,0x00,0x1B,0x00,0x05,0x02,0x03,0x03,0x03,0x03,0x2E,0x7E}; //设置功率 26dBm U8 rfidSetWCmd[] = {0xBB,0x00,0xB6,0x00,0x02,0x0A,0x28,0xEA,0x7E}; //选择卡片 U8 rfidSelCmd[] = {0x00}; //轮询读取(FFFF代表永久轮询) U8 rfidLoopRead[] = {0xBB,0x00,0x27,0x00,0x03,0x22,0xFF,0xFF,0x4A,0x7E}; //============================================= void L3_task_rfid_init(void) { _s_task_rfid.last_send_time = 0; L1_task_init(&_s_task_rfid.task); L3_task_s_go(_s_task_rfid,D_task_init); } #define D_task_RFID_SET 0x50 #define D_task_RFID_READ 0x51 void L3_task_rfid_handler(S_TASK_RFID *s) { TTSS_Task_init() L0_uart0_uchex(sizeof(rfidSetChannelCmd) / sizeof(U8)); L0_uart0_uchex(sizeof(rfidSetWCmd) / sizeof(U8)); L0_uart0_uchex(sizeof(rfidSelCmd) / sizeof(U8)); L0_uart0_uchex(sizeof(rfidLoopRead) / sizeof(U8)); //注意这里加delay,因为rfid_en是强推挽模式,强推挽模式生效有延迟,经测试这里的时间需要>=2s L2_task_go_Tdelay(D_task_RFID_SET,D_Tdelay_4s); TTSS_Task_step(D_task_RFID_SET) //1个小时发一次 if(s->last_send_time == 0 || D_sys_now - s->last_send_time > D_sys_Jiffies(3600000)) { //1.设置天线 L0_uart4_sendArray(rfidSetChannelCmd, sizeof(rfidSetChannelCmd) / sizeof(U8)); NOP10(); //2.设置功率 L0_uart4_sendArray(rfidSetWCmd, sizeof(rfidSetWCmd) / sizeof(U8)); NOP10(); //3.选择掩码 L0_uart4_sendArray(rfidSelCmd, sizeof(rfidSelCmd) / sizeof(U8)); NOP10(); //4.启动轮询 L0_uart4_sendArray(rfidLoopRead, sizeof(rfidLoopRead) / sizeof(U8)); NOP10(); //记录上次发送时间 s->last_send_time = D_sys_now; } L2_task_go(D_task_RFID_READ); TTSS_Task_step(D_task_RFID_READ) if(ts_uart[uNum4].r.ok == 1) { ts_uart[uNum4].r.ok = 0; parse_rfid_pkg(); } //read next L2_task_go_Tdelay(D_task_RFID_SET,0); TTSS_Task_end(); } //RFID协议:BB 02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98 0C 7E //帧头:BB //Type:00命令帧 /01响应帧 /02通知帧 //Command: 07指令桢 /22单次读写 /27多次轮询 /28停止轮询 /0C选择 / B6设置功率 //数据长度:00 11 //数据:D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 [EB 98] //校验:0C 从Type到数据字段 [02 22 00 11 D5 30 00 E2 00 10 71 00 00 52 9B 09 40 B4 02 EB 98] 的所有字节的累加和 //帧尾:7E void parse_rfid_pkg() { TPC_RFID *p = (TPC_RFID *) ts_uart[uNum4].r.buf; p->ocr = p->buf[p->num[0] << 8 | p->num[1]]; p->tail = p->buf[p->num[0] << 8 | p->num[1] + 1]; if(p->head == 0xBB && p->tail == 0x7E && 1 /*count_ocr() */) { //只读取type=0x02, cmd=0x22的协议 if(p->type == 0x02 && p->cmd == 0x22){ U8 index = 0; U16 num = (U16)p->num[0] << 8 | p->num[1]; U16 rfidno = (U16)p->buf[num-5] << 8 | p->buf[num-4]; U8 rssi = p->buf[0]; U8 ant = p->buf[num-1]; //1.判定RFID卡号是否符合规则 //2.保存RFID卡号到寄存器 L3_new_rfid(rfidno, rssi, ant); //3.查找编号是否在rfidtable中 index = L3_find_rfid_table(rfidno); //4.亮灯 //TODO 如果缓冲区满了,没放进去,是否亮灯 if(index < LED_BTN_NUM){ R.led_status[index] = 1; } //5.打印日志 print_rfid_pkg(p); } } } void print_rfid_pkg(TPC_RFID *p) { L0_uart0_sendstr("\r\n--------- Recv RFID --------\r\n"); L0_uart0_sendstr("type : "); L0_uart0_uchex(p->type); L0_uart0_0d0a(); L0_uart0_sendstr("cmd: "); L0_uart0_uchex(p->cmd); L0_uart0_0d0a(); L0_uart0_sendstr("num: "); L0_uart0_uchex(p->num[0]); L0_uart0_uchex(p->num[1]); L0_uart0_0d0a(); L0_uart0_sendstr("dat : "); L0_uart0_sendArrayHex(p->buf, p->num[0] << 8 | p->num[1]); L0_uart0_0d0a(); L0_uart0_sendstr("ocr: "); L0_uart0_uchex(p->ocr); L0_uart0_0d0a(); }