zoukankan      html  css  js  c++  java
  • 无线路灯项目——SX1278调试

    问题描述:
      msp430能与msp430通信,STM32能与STM32通信,但它们之间就无法通信,进入不了RxDone中断,但可以进入FHSSChangeChannel中断,说明能收到信号,但信号不对。于是我怀疑430的无线参数跟我的STM32参数不匹配,怀疑他们给的程序不是芯片里正在跑的。我下载了CCS,用430的LaunchPad上自带的仿真器去调试,用这个仿真器,我们只需要接2根线即可,分别是SBW RST和SBW TST。烧进程序,发现他们的程序是最新的,这个怀疑打消。
      STM32的程序是从msp430那边复制过来的,按理说无线参数是一模一样的,那为什么就不能通信呢?学长在上午说用频谱仪测一下,但我没有特别放心上,下午用CCS调试了下430,清楚了程序中的一些流程和收发的一些东西,到了晚上,还是没有进展,收发不通这个问题已经调试了两天了,有点抓狂了。之前发的数据是帧数据,比较复杂,那么收端收到的数据跟发端有点像,但又不一样,比如发0xF5,收到的数据有时是0xF5,有时又是0xB5,第一个字节错的比较少,到了后面几个字节就错得很离谱了,我是把CRC校验关闭了才看数据的,若打开了CRC校验,收端就收不到复杂数据了。我无心地修改了发送数据,只发送4byte:0x01,0x02,0x03,0x04,竟然可以被正确接收,但不是每次可以,有时是可以进入RxDone中断,但CRC检测不通过,导致放弃这帧数据。但我再多发送几个byte又不行,这时心中有一个判断:可能是RF频率不对,导致接收端判决时刻不对,只能接收少量简单数据,可以进入RxDone,但CRC不一定通过。数据一多,判决时刻的错误就累积,累积到一定量时,就接收不到,连RxDone都进入不了。晚上身旁刚好有一个频谱仪,就试着用频谱仪测了一下,更清楚地定位到了问题,测试了多次,给出下面结果:

    • MSP430板子的频点在471.89~472.12MHz之间,功率17dBm
    • STM32板子的频点在472.11~472.25MHz之间,功率12dBm

    解决方法:
      两者的频点相差100+KHz,我们设置的带宽是250KHz
      在SX1278的DataSheet中的4.1.5. Frequency Error Indication这一节讲到如何补偿Frequency Error(频率偏差),有两个步骤:
      1. SX1278中的0x28,0x29,0x2A这三个寄存器RegFei是频率偏差寄存器,用下面的公式可以计算出接收到的信号频率与本机所设置频率的Frequency Error。
    这里写图片描述
    计算出Ferror后,我们需要从当前设置的RF频率中减去Ferror,然后重新设置RF频率,这个过程需要在线完成,由于计算量比较大,可以使用查找表的方法。
      2.得到Ferror绝对误差之后,我们再计算相对误差,得到以百万分之一(PPM)为单位的相对误差,然后由下面的公式计算出PpmOffset,并将这个值写入0x27寄存器PpmCorrection,用以补偿数据速率,该寄存器是8bit的补码。
    这里写图片描述
      这里要注意两点:
      1. Frequency Error应该在SX1278带宽的±25%之内,不然将得不到准确的偏差,但寄存器RegFei还是会有值,只不过这个值是错误的。
      2.计算出的Ferror是20bit的补码,填入0x27寄存器的8bit也是补码。
    回到我们的项目,由于偏差达到了100+KHz,超过了带宽250KHz的25%,于是我先修改RF频率,然后再计算0x27寄存器所需填入的值。

  • 相关阅读:
    爬虫开发9.scrapy框架之递归解析和post请求
    爬虫开发7.scrapy框架简介和基础应用
    爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取
    爬虫开发4.三种数据解析方式
    Gym–101061A Cards(有待更新)
    GYM 101061 I. Playing with strings(有待更新)
    HDU2072 单词数
    HDU2057 A + B Again(十六进制加法运算)
    HDU2056 Rectangles
    CodeForces 992C Nastya and a Wardrobe
  • 原文地址:https://www.cnblogs.com/season-peng/p/6713506.html
Copyright © 2011-2022 走看看