sop板
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.
 
 
 
 

170 lines
4.9 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;
// U8 RFID_READ_MASK[] = {'Y','F','R','S', 0x00, 0xAA};
U8 RFID_READ_MASK[] = {'Y','F','R','S', 0x00, 0xAA}; //59 46 52 53 00 AA
//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_COUNT_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();
}
U8 verify_mask(U8 *rfid)
{
int i;
for(i=0;i<6;i++)
{
if(rfid[i] != RFID_READ_MASK[i])
{
return 0;
}
}
return 1;
}
//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
//数据:RSSI PC PC EPC0 00 10 71 00 00 52 EPC7 ANT [EB 98]
//数据:D5 20 00 E2 00 10 71 00 00 52 9B 40 [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];
//5.打印日志
print_rfid_pkg(p);
//校验RFID掩码
if(!verify_mask(&p->buf[num-11]))
{
L0_uart0_sendstr("---------- RFID Mask Error -------\r\n");
return;
}
//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;
}
}
}
}
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();
}