采用hxd019d传输数据相关

到手一个项目,要求使用hxd019d传输数据,由于这个红外传感器主要用于遥控器,限制颇多,用于自由传输数据较为麻烦,耗时也挺久的,在这里作为博客第一天,做下记录





一、项目简介:
1.1、项目要求
在密码器原有红能上添加红外数据传输红能,要求,a设备按下发送按键,b设备按下接收按键,b能正确无误将数据接收。
1.2、开发环境
硬件:以N78E366A为主控mcu的密码器、hxd019d红外传输模块、usb转串口模块。
软件:Keil.C51.V905、Nuvoton ISP-ICP Utility,v7.15
二、硬件相关:
主控mcu采用新唐N78E366A,红外传输模块采用宏芯达hxd019d,通过I2C数据通信,由于MCU不支持硬件I2C,采用软件模拟实现通信功能。硬件连接P2.7=SDA,P2.6=SCK,P4.6=BUSY,BUSY相关功能后面续说。
             
       
三、软件相关
1、通信原理:主控MCU将需要发送的数据处理后通过I2C写入hxd019d(红外模块),接收方则在进入学习状态后,在busy状态发生变化后通过I2C读取数据,处理后为我们需要的数据。
2、数据组成:


如上图所示,发送时必须为232个字节数据,接收时将接收到230个字节,此为红外模块硬性规定,FF-F0之间数据可更改,且传输过程不会发生变化,FF之前百分之十五误差为正常范围,F0之后为数据保留段,因此,本次项目数据传输过程只能将数据存放于FF之后,F0可以适当后移。根据FF的数量,数据组成不同,当前为类似4进制,即最大不得超过4!!!
3、传输协议:由于数据传输限制,只能传输4进制数据,因此,发送时,两个字节表示一个数据,通过如下表格,数据转换:


(1)按字节发送时,8位字节拆分成高低4位,高四位放一个字节,低四位同样放入一个字节,如:发送一个字节时,假设它的ASCII码值为FE(实际我们发送时不可能有,但FE都能发送,其它更不用说了),则高四位为F,查表,hxddar[F]=0x33为实际发送的值,占一个字节,低八位为E,hxddar[E]=0x32为实际发送的值,占一个字节,由此解决进制限制问题。
(2)接收时,查表进行数据对比,如收到的是0x12,0x01(随意写的,方便理解),轮询数据处理表,查询收到的数据在表中位置,0x12为表中第6位,0x01为第2位,组合61,则说明发送方发送的是a。
(3)注意:在硬件,包括工作电流供给正常,数据收发可以保证一致,但由于贴片电流,工作几乎接近极限状态,加上发送时要保证对方处于学习状态,两者之间也没有同步机制,实际产品发射灯之间距离也并不理想,因此有一定几率发生传输错误,一般错误代码中已进行纠正,建议连续发送100次后,手动按键重新发送。
4、红外工作流程
(1)发送方:将需要发送的数据按上文协议转换后,放入数据缓存段,由于资源问题,红外要求发送230字节分段发送,第一段为红外随机有误差数据,即FF段放于代码段,如下:


第二段为数据缓存段即我们自己的数据,放于xdata中,事先定义固定大小数组即可,还是资源限制,该次项目最大允许发送63字节,因此数组最小为126,实际定义132,如下:


0-3字节总共4字节用于接收方纠错,中间2个字节留空为0,其余数据可用。
第三段数据为F0之后数据,稳定考虑,F0之前4个字节保留,资源充足时,F0包括前4字节可继续后移,多出字节给以第二段数据缓存段,如下:


最后一个字节为校验码,检验码为前229字节和,取低8位放于230位。
发送时,通过I2C写函数,三段数据依次写发送,检验和最后发送,至此,发送数据完成。
注意:连续调用I2C写函数,中间必须间隔1.2S以上,中间有红外模块数据处理时间,也有红外传输时间,接收方接收处理时间以及下次继续接收等待时间,因此,实际写间隔1.8S,经大量数据实测,该延迟时间更为稳定,但测试未加入纠错机制,因此,实际需要可适当减少延迟等待时间,高于1.2S即可
(2)接收方:接收时,理论需准备232字节用于存放接收数据,由于资源限制以及实际产品并不需要,因此在I2C读函数将自己需要的数据读取存放其余读了丢弃即可节省内存空间。该项目数据交换采用对码实现,类似万能遥控器学习原遥控器功能,因此,接收时,调用使红外模块进入学习状态,延迟50MS等待硬件稳定后可读取BUSY口状态(BUSY初始为高电平,调用学习状态函数,将会拉低BUSY口电平,此时红外处于学习(接收)外面数据状态,当BUSY口由低变高,说明学习完成),再次为高电平时调用I2C读函数,读取红外模块数据,将读来的数据进行进制转换即得发送放发送的数据。
5、代码组成
1、代码分为红外发射函数,红外接收函数,软件模拟I2C时序函数,初始化硬件相关,掉电唤醒函数用于接收发送过程延迟等待,串口调试打印函数
2、发送接收函数参数说明:


发送:buf为需要发送的数据,len为长度,长度最大63
接收:buf为接收到并处理后的数据,返回值为1正确接收,为0发生错误
四、操作说明
1、按下电源键开机
2、按一下Enter键进入接收数据状态
3、按键输入需要发送的数据,然后按一下Edit键进入发送数据状态
注意:1、必须先按接收,等待1或2S后才能按发送键,由于数据采用对码传输,两者红外发射等距离不得超过20mm,传输时,贴紧两块板即可
      2、最长发送数据长度为63个字节,多发无效

附上代码链接:http://download.csdn.net/download/qq_38150742/10184638

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值