CC2541非阻塞式红外驱动填坑指南(NEC格式)

NEC格式的红外编码

调制

NEC格式采用脉冲间隔调制技术,脉冲周期不变,改变逻辑‘1’和逻辑‘0’的脉冲占空比。
时序信息:
● 载波:38 kHz 1/3或1/4占空比
● 有效脉冲:560 uS
● 逻辑周期:
○ 逻辑 ‘1’:2.25ms
○ 逻辑 ‘0’:1.12ms
NEC格式-脉冲间隔调制

协议

NEC协议每次传输包含8-bit命令码和8-bit地址码。在发送命令码和地址码之前,会先发送前导码(同步码),周期13.5ms,有效脉冲周期9ms。为了提高可靠性,每个命令码和地址码后面都会跟它自己的反码。低位在前高位在后。

NEC协议

重复序列

命令码和地址码协议帧只发送一次,之后开始发送重复序列,重复周期108ms。重复序列包含一个前导码和一个停止位,前导码周期11.25ms,其中有效脉冲周期9ms,重复帧前导码比数据地址帧的前导码要短。
NEC重复序列
重复序列示意图

填坑

基本思路

BLE协议栈跑在CC2541上,有很多广播、通知和连接间隔需要时不时去处理一下,所以红外接收必然不能占用太多时间,如果采用阻塞接收的话,最快也得接收个40+ms的样子,很容易就把GAP给搞失联了。
因此,为了避免踩坑,采用中断捕获的方式来采集红外信号,osal是事件驱动的一个任务调度系统,为了使软件更好的分层,同时防止中断占用太多时间,在采集到完整红外数据后给硬件事件处理任务发送一个红外接收完成事件,HAL_TaskID的事件处理函数中对接收到的红外数据进行解码检验,之后是否需要封装成红外消息发送到用户的任务进行更进一步处理,就看个人需求了。

需求分析

红外测序必然需要用到一个定时器,CC2541用户能用的就三个定时器:Timer1(16bit)、Timer3和Timer4(8bit)。还有一个Timer2被协议栈吃了,Ti也没打算给我们用,甚至用户手册里都没写Timer2的详细说明。Timer1功能强大,总不能为了驱动一个红外把它牺牲了,T3和T4一样那就随便选一个好了,我选择T4。
在预先软件设计中,打算利用T4的双边沿捕获功能得到高电平脉宽,测得前导码(4.5ms),逻辑‘1’(1.69ms),逻辑‘0’(560us)和重复序列,由于这几个特性信号的周期跨度很大,随便比较一下就能快速获得32bit命令码和地址码。
理想的世界里处理任何事情总是一帆风顺的,但现实是,T4只有8bit计数器,时钟频率32M,最大分频128,就算溢出也只有1024us,不说前导码4.5ms,连逻辑‘1’都捕获不到,此刻我内心一片凄凉,难道如此

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值