Files
OldPeopleHome/zigbee/ZStack-CC2530-r200/ZStack-CC2530-r200/Components/hal/include/hal_irdec.h
2019-08-19 18:48:35 +08:00

98 lines
2.9 KiB
C

/***********************************************************
** FileName: IRDecode.h
** Introductions: IR Remote decode for MCU of CC2530
** Last Modify time: 2013.05.20
** Modify: 修改定时器4辅助判断解码中的超时失效
** Author: GuoZhenjiang <zhenjiang.guo@sunplusapp.com>
***********************************************************/
/***********************解码原理****************************
* 1、定时器1的通道0(Alt.2 = P1.2)是红外信号接收输入引脚
* 2、采用定时器1通道0上升沿输入捕获模式获取红外信号
* 3、定时器1计数频率1MHz
* 4、每当上升沿捕获后获取当前计数值(周期),然后清零计数值并重新开始计数
* 5、获取的每一小周期按照时间阀值判断是引导码、数据0、数据1
* 5、解码过程中利用定时器4辅助判断是否超时
***********************************************************/
#ifndef __IRDECODE_H__
#define __IRDECODE_H__
#include "OSAL.h"
#define IRDEC_INT_EVENT 0xF1 //IO端口中断采用0xF0
typedef struct {
uint8 irLen;
uint8 irCode[15];
} OSALIRDecData_t;
typedef struct
{
osal_event_hdr_t hdr; //事件类型及状态
uint8 endPoint;
OSALIRDecData_t *data;
} OSALIRDecIntData_t;
#define CLR_T1CNT T1CNTL = 0 // 向T1CNTL寄存器中写任何值会导致T1CNT清零。
// T1CTL
// 定时器1时钟预分频
typedef enum
{
Tdiv_1 = 0X00, //标记频率/1
Tdiv_8 = 0X04, //标记频率/8
Tdiv_32 = 0X08, //标记频率/32
Tdiv_128 = 0X0C, //标记频率/128
}Timer1Div_t;
// 定时器1运行模式
typedef enum
{
Tmod_stop = 0X00, //暂停运行
Tmod_free = 0X01, //自由运行
Tmod_Mod = 0X02, //模模式
Tmod_PN = 0X03, //正/倒计数模式
}Timer1Mod_t;
// T1CCTLx(x = 0,1,2,3,4,5)
// 定时器1通道配置
typedef enum
{
TCCSet = 0X00, //比较匹配时置位
TCCClear = 0X08, //比较匹配时清零
TCCExch = 0X02, //模模式
TCCSet0Clr = 0X03, //正/倒计数模式
}Timer1CC_t;
// 红外遥控编码解调后周期 in us
// 4.500ms引导码判断阀值
#define T_IR_GUIDE4_MIN 8000 //4.5ms引导码 理论时间9.000ms
#define T_IR_GUIDE4_MAX 9500
// 9.000ms引导码判断阀值
#define T_IR_GUIDE9_MIN 12000 //9ms引导码 理论时间13.500ms
#define T_IR_GUIDE9_MAX 14000
// 数据位0判断阀值
#define T_IR_0_MIN 1000 //位0 理论时间1.125ms
#define T_IR_0_MAX 1500
// 数据位1判断阀值
#define T_IR_1_MIN 2000 //位1 理论时间2.250ms
#define T_IR_1_MAX 2300
// 用于判断一次红外信号结束的周期阀值
#define T_IR_ENDED 50 // 比位1的周期稍微长点,不在引导码范围内
typedef enum
{
WaitForGuideTrig1, // 等待引导码第一个上升沿
WaitForGuideTrig2, // 等待引导码第二个上升沿
Decoding, // 位0位1解码过程中
Decode_GuideOverTime, // 引导码结束等待超时
Decode_bitOverTime, // 位0 位1 结束等待超时
Decode_BufOverflow, // 接收队列溢出导致解码结束
Decode_OverUnknow, // 未知原因导致解码结束
}IRDecodeSta_t;
// 中断处理法红外遥控解码初始化
void IRDecodeT1Init(unsigned char taskid, unsigned char ep);
#endif //__IRDECODE_H__