来源:百问网_嵌入式Linux wiki_jz2440 新1期视频维基教程 (视频笔墨版)
作者:韦东山
本笔墨数:1468,阅读时长:2分钟

本节开始讲解红外遥控器旗子暗记的吸收和解码,视频分为三部分,每一部分都专注做一件事情,让每节视频更短一点。
红外遥控器的操作比前面的温度、温湿度传感器都要大略。
首先看一下事理图上的红外遥控吸收器:
我们用遥控器对它按动的时候,它就可以吸收到红外旗子暗记,然后把红外旗子暗记转换成电平旗子暗记,通过IRD这根线,传给SOC。
全体传输,只涉及单向传输,由HS0038向主芯片传送。
因此,我们只须要编写程序,从IRD上获取数据即可,在这之前,我们须要先理解下数据是怎么表示的,也便是传输的红外数据的格式。
红外协议有:NEC、SONY、RC5、RC6等,常用的便是NEC格式,因此我们紧张对NEC进行讲解。
在剖析文章中的波形之前,我们先想象一下怎么在一条数据线上传输旗子暗记。
开始传输数据之前,一样平常都会发出一个start起始旗子暗记,关照对方我开始传输数据了,后面便是每一位每一位的数据。
NEC协议的开始是一段勾引码:
这个勾引码由一个9ms的低脉冲加上一个4.5ms的高脉冲组成,它用来关照吸收方我要开始传输数据了。
然后接着的是数据,数据由4字节组成:地址、地址(取反)、数据、数据(取反),这些取反是用来校验用的。
地址是指遥控器的ID,每一类遥控器的ID都不一样,数据便是遥控器上的不同按键。
从前面的图可以知道,NEC每次要发32位的数据,每一位用什么来表示0和1呢?
数据1和01,开始都是0.56ms的低脉冲,对付数据1,后面的高脉冲比较长,对付数据0,后面的高脉冲比较短。 可以看出,红外遥控器的数据表示方法是比较大略的。
我们长按一个按键,第一次按的时候,他会发出勾引码,地址,地址取反,数据,数据取反。
接着由于长按,遥控器会发送一个不一样的勾引码,这个勾引码由9ms的低脉冲,2.25ms的高脉冲组成,表示现在按的还是上次一样的按键,然后再一贯是勾引码(重复),直到松开。
里面的内容和前面文章基本同等,但这个更详细,创造每次数据传输完还有一个0.5625ms的低脉冲表示数据传输结束。
对付勾引码(重复)也一样,也有一个0.5625ms的低脉冲表示传输结束。
大部分文章都漏掉了却束的低脉冲。
NEC协议里有很多韶光,这些韶光有一个有趣的征象,把所有韶光里面最小的0.53ms看作基本脉冲宽度,假设用t表示,那么其它所有韶光都是t的倍数:
我们可以看到对付所有的韶光,最小的单位都是0.56ms,这个韶光对人来说是非常短的,但对嵌入式系统它是非常非常长的了,足够我们做很多事情了,那么我们可以利用中断来处理这些数据。
并且对付红外遥控器来说,我们根本不知道用户什么时候按下遥控器,利用轮询的办法特殊耗资源,因此直策应用中断来处理。
利用官方文档的时序图:
图中的脉冲方向恰好相反,绿色表示低脉冲,白色表示高脉冲。
涉及内容:
①中断引脚设置为双边缘触发,在每一个脉冲变革的地方都会产生中断;②发生中断时,打算当前中断与上次中断之间的韶光差,就得到脉冲宽度,放入buffer,同时还要记录引脚极性;③主循环从buffer取出数据,并解析时序;我们可以估算下,每按下一次遥控器,会产生多少中断,2+322+1=67次。
中断发生时,将数据放入buffer,主函数从buffer取出数据,用什么数据构造来实现数据的存取?
最好的办法便是环形缓冲区,所谓环形缓冲区便是一边存储数据一边读取数据,下节课再详细讲解。
编程要点:
①中断②系统韶光③环形缓冲区④NEC解析「新品首发」STM32MP157开拓板火爆预售!
首批仅300套