红外 IR 协议原理分析
1、概述:
对多种红外遥控器的信号进行分析,其发出的红外指令中,引导码各不相同,而且后面的控制指令也有较大差别,甚至指令码的位数也不相同,原因是这些红外设计没有遵守相同的红外标准。但是其基本思想是相同的,即采用不同周期和不同占空比的脉冲分别表示逻辑0及1,只要根据期占空比及脉冲周期进行解析即可得到具体的按键码值。
2、协议种类:
市面上基本上有如下几大类协议:
NEC with simple repeat code
NEC with full repeat code
TC9012
松下7051码
SONY码
RC5/RC6A
3、协议datasheet表(引用hisi整理的统计表)
NEC with simple repeat code 码
NEC with full repeat code 码
TC9012和SONY码:
4、数据格式
基本上红外都是以38MHz作为载波频率,即每一位时间为1.12ms或2.25ms
NEC with simple repeat code数据格式由START(引导码)+数据码+burst突发帧三部分组成
发送单个帧格式:
发送重复帧格式,收到第一个完整帧数据后,接下来收到的数据帧由简化的引导码和burst信号组成
其它的编码本质上都差不多,例如松下7051编码:
遥控器红外发射信号的编码格式:引导码+设备码+键码+循环延时
引导码 = 3640us (高电平)+ 1800us(低电平)
"高电平"为红外线载波调制,"低电平"为无红外线载波调制。
设备码 = 32位:
格式 = 码0(S)8位 + 码1(Z)8位 + 码2(Y)8位 + 码3(X)8位;
键值码 = 16位:
格式 = 数据码0(8位)+数据码1(8位);
逻辑'0':= 380us (高电平)+ 380us(低电平);
逻辑'1'= 380us (高电平)+ 1350us(低电平);
循环延时=50ms,其误差≤5%;
表示先检测到引导码,然后进入开始统计设备码及键值码共48位,最后按下不入进入repeat模式进行延时50ms。
5、基本编程方法
1、注册ISR中断
request_irq(IR_IRQ_NO, (irq_handler_t)Ir_Isr, IRQF_DISABLED, NULL, HI_NULL);
2、处理Ir_Isr函数,根据寄存器IR_RCV状态将获得的键值(高低电平值)写入队列(data_l,data_h)
3、在定时器中处理队列数据,如每隔10ms或者50ms时间检测并将队列值送入到ir decode器中
4、ir decode处理,本质就是比较高低电平持续时间确定出具体的键值
/* d1 寄存器中读取的值,d2为协议定义的标准值,margin为误差码值 */
#define FACTOR 15/100
static inline int pulse_eq_margin(unsigned int d1, unsigned int d2, unsigned int margin)
{
return ((d1 > (d2 - margin)) && (d1 < (d2 + margin)));
}
首先判定引导码:
3640us (高电平)+ 1800us(低电平)引导码
pulse_eq_margin(data_l,header_pulse,header_pulse*FACTOR)
pulse_eq_margin(data_l,header_space,header_space*FACTOR)
然后再根据其状态进行取值
比如松下7051码可定义如下状态:
IR_STATE_INACTIVE, // 空闲状态
IR_STATE_HEADER_SPACE,
IR_STATE_BIT_PULSE,
IR_STATE_BIT_SPACE,
IR_STATE_FRAME_PULSE,
IR_STATE_FRAME_SPACE,
IR_STATE_REPEAT_PULSE,
IR_STATE_REPEAT_SPACE,
定义的重要数据结构如下:
unsigned int wanted_bits; /* 需要等待接收的位数,比如7051就需要接收48位*/
unsigned int header_pulse; /* Unit:μs 3640*/
unsigned int header_space; /* Unit:μs 1800*/
unsigned int bit0_pulse; /* Unit:μs 380*/
unsigned int bit0_space;
/* Unit:μs 380*/
unsigned int bit1_pulse;
/* Unit:μs 380*/
unsigned int bit1_space;
/* Unit:μs 1350*/
unsigned int frame_units;
/* Unit:μs 380*/
unsigned int frame_end_space; /* more than frame_end_space 50ms即 50000μs*/
unsigned int repeat_pulse;
/* no repeat 0 ex>NEC:9000*/
unsigned int repeat_space;
/* no repeat 0 ex>NEC:2250*/
然后就是求值:
if(pulse_eq_margin(data_time,bit1_space,frame_units>>1)){
data->bits |= (unsigned long long)(((unsigned long long)1)<<data->count)
}
其中bits用于保存键值,只有出现逻辑'1'时才须对其赋值,count用于计算位于STATE_BIT_SPACE累加值
其中会涉及到一些较细节的知识就不在此复述了,提供一种思路给大家,都有规律可偱。
红外 IR 协议原理分析的更多相关文章
- OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...
- 深入理解HTTP协议、HTTP协议原理分析【转】
转自:http://blog.csdn.net/lmh12506/article/details/7794512 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 基础概念篇 ...
- HTTP协议、HTTP协议原理分析
百度百科中说明: 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为 ...
- 前端必须会的!!!关于对HTTP协议的理解、HTTP协议原理分析
http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...
- QUIC协议原理分析(转)
之前深入了解了一下HTTP1.1.2.0.SPDY等协议,发现HTTP层怎么优化,始终要面对TCP本身的问题.于是了解到了QUIC,这里分享一篇之前找到的有意义的文章. 原创地址:https://mp ...
- 深入理解HTTP协议、HTTP协议原理分析
http://blog.csdn.net/g1036583997/article/details/50457441
- SPI协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...
- SMB协议原理抓包分析
SMB协议原理抓包分析 目录: 1.SMB概述 2.SMB原理 3.SMB配置 一.SMB概述 SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件.打印机. ...
- OSPF协议原理及配置5-LSA分析
OSPF协议原理及配置5-LSA分析 前面,已经介绍了邻接关系的建立和LSDB的同步.通过同步过程的介绍,我们可以了解LSDB的同步是通过交互LSA实现的. 不同角色的路由器发出的LSA的内容是不 ...
随机推荐
- windows环境变量如何在cmd中打印
在windows的cmd下,用"set"命令可以得到全部的环境变量,如何想得到某个环境变量,直接这样"set path"就可以了. set不仅如何,还有其他功能 ...
- HDU-4857(拓扑排序)
Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前. ...
- 深入理解linux网络技术内幕读书笔记(七)--组件初始化的内核基础架构
Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导 ...
- Xcode开启gcc/g++
Apple announced Xcode 4.3 for OSX Lion and 4.4 for OSX Mountain Lion last week. The major difference ...
- 你需要知道的九大排序算法【Python实现】之快速排序
五.快速排序 基本思想: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: #coding: ...
- 实现Android 动态载入APK(Fragment or Activity实现)
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...
- 大数据笔记09:大数据之Hadoop的HDFS使用
1. HDFS使用: HDFS内部中提供了Shell接口,所以我们可以以命令行的形式操作HDFS
- 关于driver_register做了些什么
现在进入driver_register()函数去看看.在driver_register() 中,调用了driver_find(drv->name, drv->bus)函数,这里是干啥呢?这 ...
- Create new Android Virtual Device时不能创建
在Create new Android Virtual Device时不能创建... 因为之前有重装过系统,ADT和java都没有更换,不知道是不是有哪里的环境(C盘中的配置)出错了... LOG在下 ...
- myFocus焦点图插件
注意 1.焦点图初始化ID和图片最外层ID保持一致 2.图片列表外面必须包裹一个div,且id必须为pic http://demo.jb51.net/js/myfocus/tutorials.html ...