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套