hs0038接收头工作原理(HS0038红外线接收器的编程)
hs0038接收头工作原理(HS0038红外线接收器的编程)objs = sensors/irda/irda_raw.o编译执行irda_rae_test(); 修改Makefile 增加irda_raw.c irda_raw.h获取电平极性方式,当前引脚极性电平取反#include "../../s3c2440_soc.h" #include "irda_raw.h" /* IRDA引脚 : EINT1/GPF1 */ static unsigned long long g_last_time = 0; /* * 配置GPIO 注册中断 * 在中断处理函数里: 记录中断发生的时间 跟上次中断的时间比较 计算出脉冲宽度 读取引脚极性 把数据放入环型缓冲区 */ /* 先实现GPIO的基本操作 */ static void irda_data_c

来源:百问网_嵌入式Linux wiki_jz2440 新1期视频维基教程 (视频文字版)
作者:韦东山
本文字数:1687,阅读时长:2分钟
先打印出原始数据
irda_raw.c
irda_raw.h
    
获取电平极性方式,当前引脚极性电平取反
#include "../../s3c2440_soc.h"
#include "irda_raw.h"
/* IRDA引脚 : EINT1/GPF1 */
static unsigned long long g_last_time = 0;
/* 
 * 配置GPIO  注册中断
 * 在中断处理函数里:
      记录中断发生的时间 
      跟上次中断的时间比较  计算出脉冲宽度
      读取引脚极性
      把数据放入环型缓冲区
 */
 /* 先实现GPIO的基本操作 */
static void irda_data_cfg_as_eint(void)
{
	/* 配置为中断引脚 */
	GPFCON &= ~(3<<2);
	GPFCON |= (2<<2);
	/* 设置中断触发方式: 双边沿触发 */
	EXTINT0 |= (7<<4);  /* eint1 */
}
static int irda_data_get(void)
{	/*如果bit1 等于1就表明高电平,返回1 */
	if (GPFDAT & (1<<1))
		return 1;
	else
		return 0;
}
/*irda中断处理函数*/
void irda_irq(int irq)
{
	/* 在中断处理函数里:
		 记录中断发生的时间 
		 跟上次中断的时间比较  计算出脉冲宽度
		 读取引脚极性
		 把数据放入环型缓冲区
	*/
	irda_raw_event event;
	/*获得当前时间并赋值给cur*/
	unsigned long long cur = get_system_time_us();
	/*上次时间和这次时间的差值,也就是周期*/
	event.duration = delta_time_us(g_last_time  cur);
	/*获取引脚极性*/
	event.pol      = !irda_data_get();
	/*我们需要环形缓冲区的函数放入环形缓冲区 */
	ir_event_put(&event);
	/*更新时间*/
	g_last_time = cur;
}
/* 注册中断 仿照之前的按键中断程序 */
void irda_init(void)
{	/*1. 配置为中断引脚
	* 2. 配置为双边沿触发 
	*/
	irda_data_cfg_as_eint();
	/*注册中断*/
	register_irq(1  irda_irq);
}
/*测试原始数据*/
void irda_raw_test(void)
{
	irda_raw_event event;
	unsigned long long pre = 0  cur;
	
	irda_init();
	while (1)
	{
		/*如果从唤醒缓冲区读到数据,就把它打印出来*/
		if (0 == ir_event_get(&event))
		{
			cur = get_system_time_us();
			/*如果这次时间和上次时间相差远的话,就打印回车换行*/
			if (delta_time_us(pre  cur) > 1000000)
				printf("\n\r");
			pre = cur;
			/*使用三目运算符来判断pol是高电平还是低电平*/
			printf("%s %d us | "  event.pol? "hight" : "low"  event.duration);
		}
	}
}
    
irda_raw.h定义极性和脉冲宽度结构体
#ifndef _IRDA_RAW_H
#define _IRDA_RAW_H
typedef struct irda_raw_event {
	int pol; /* 极性 */
	int duration;  /* 脉冲宽度  us */
}irda_raw_event  *p_irda_raw_event;
#endif /* _IRDA_RAW_H */
    
测试代码 修改main.c 在main主函数中增加
irda_rae_test();
    
修改Makefile 增加
objs  = sensors/irda/irda_raw.o
    
编译执行

一开始时间很长是因为一上电的时候高电平,值打印的特别大,说明有问题
irda中断函数中没有更新上一次的时间
/*更新时间*/
g_last_time = cur;
    
再次更新

时间和数据格式符合时序要求
「新品首发」STM32MP157开发板火爆预售!首批仅300套




