You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.0 KiB
135 lines
4.0 KiB
////////////////////////////////////////////////////////////////////////////
|
|
///@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)
|
|
{
|
|
L1_task_init(&_s_task_rfid.task);
|
|
L3_task_s_go(_s_task_rfid,D_task_init);
|
|
}
|
|
|
|
#define D_task_RFID_READ 0x50
|
|
|
|
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));
|
|
|
|
//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();
|
|
|
|
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_READ,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] = BLED0_ON;
|
|
}
|
|
//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();
|
|
}
|
|
|
|
|
|
|
|
|