前言

调试的过程中碰到的问题基本都是以前没有遇到过的,而且需要对整个协议栈及射频方面的工作流程较熟悉才能找到问题的原因,需要多读SX1276的数据手册以及与射频芯片的物理层通信例程和MAC层通信例程进行对比相结合。

正文

发送失败

LoRa 模块在进行 模式切换时,比如TX 切换到RX模式,需要先将设备切换到standby模式

CRC 校验失败,然后程序陷入死循环

按逻辑来讲,CRC校验失败,应该进行的操作是吧校验失败的这个数据包丢弃,然后重启接收机(芯片每次接收完成都应该重启SX1276)

但是,程序一旦接收CRC校验失败就陷入循环,通过调试发现,原来是开启了一个定时器,定时时间为0,然后定时器的处理函数中又开启了此定时器,定时时间依旧没0,所以陷入了死循环。

这个定时器就是:

  1. TimerStart( &RxTimeoutSyncWord );

在接收处理函数void SX1276OnDio0Irq( void ) 中的CRC校验失败分支的处理代码中,以及定时器对应的处理函数void SX1276OnTimeoutIrq( void )中都开启了这个定时器。

如果是单个接收模式下,开启这个定时器并没有什么问题,但是在我调试的代码中,我开始的是连续接收模式,此模式根本没有同步字接收超时继续开着接收模式就可以了,并不需要特别的处理,可以不需要处理,

而官方SDK中:

  1. void SX1276OnDio0Irq( void )
  2. {
  3. .........
  4. if( SX1276.Settings.Fsk.CrcOn == true )
  5. {
  6. irqFlags = SX1276Read( REG_IRQFLAGS2 );
  7. if( ( irqFlags & RF_IRQFLAGS2_CRCOK ) != RF_IRQFLAGS2_CRCOK )
  8. {
  9. // Clear Irqs
  10. SX1276Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
  11. RF_IRQFLAGS1_PREAMBLEDETECT |
  12. RF_IRQFLAGS1_SYNCADDRESSMATCH );
  13. SX1276Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
  14. TimerStop( &RxTimeoutTimer );
  15. if( SX1276.Settings.Fsk.RxContinuous == false )
  16. {
  17. TimerStop( &RxTimeoutSyncWord );
  18. SX1276.Settings.State = RF_IDLE;
  19. }
  20. else
  21. {
  22. // Continuous mode restart Rx chain
  23. SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  24. }
  25. if( ( RadioEvents != NULL ) && ( RadioEvents->RxError != NULL ) )
  26. {
  27. RadioEvents->RxError( );
  28. }
  29. SX1276.Settings.FskPacketHandler.PreambleDetected = false;
  30. SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
  31. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  32. SX1276.Settings.FskPacketHandler.Size = 0;
  33. break;
  34. }
  35. }
  36. ..........
  37. }
  38. void SX1276OnTimeoutIrq( void )
  39. {
  40. switch( SX1276.Settings.State )
  41. {
  42. case RF_RX_RUNNING:
  43. if( SX1276.Settings.Modem == MODEM_FSK )
  44. {
  45. SX1276.Settings.FskPacketHandler.PreambleDetected = false;
  46. SX1276.Settings.FskPacketHandler.SyncWordDetected = false;
  47. SX1276.Settings.FskPacketHandler.NbBytes = 0;
  48. SX1276.Settings.FskPacketHandler.Size = 0;
  49. // Clear Irqs
  50. SX1276Write( REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
  51. RF_IRQFLAGS1_PREAMBLEDETECT |
  52. RF_IRQFLAGS1_SYNCADDRESSMATCH );
  53. SX1276Write( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN );
  54. if( SX1276.Settings.Fsk.RxContinuous == true )
  55. {
  56. // Continuous mode restart Rx chain
  57. SX1276Write( REG_RXCONFIG, SX1276Read( REG_RXCONFIG ) | RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK );
  58. TimerStart( &RxTimeoutSyncWord );
  59. }
  60. else
  61. {
  62. SX1276.Settings.State = RF_IDLE;
  63. TimerStop( &RxTimeoutSyncWord );
  64. }
  65. }
  66. if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
  67. {
  68. RadioEvents->RxTimeout( );
  69. }
  70. break;
  71. ................
  72. }
  73. }

这两处代码有着类似的才做,但是RxTimeoutSyncWord这个定时器会进入void SX1276OnTimeoutIrq( void )这个函数,而这个函数中又会重新开启RxTimeoutSyncWord这个定时器,导致死循环,所以在这里,应该讲两处的开启定时器的操作去掉(TimerStart( &RxTimeoutSyncWord );),这样程序逻辑才正常。

CRC 校验失败,然后在单步模式下,CRC一直失败

这个问题不是程序的问题,原因是因为我在单步模式下看CRC做接收,然后我的单步调试打断了射频芯片的正常工作。嗯、、就是这样,这个故事告诉我们,不要手贱。

LoRaWAN stack移植笔记(六)_调试2的更多相关文章

  1. LoRaWAN stack移植笔记(五)__调试1

    先废话一小段 在将LoRaWAN的程序移植的过程中,调试发现了很多的问题. 做好记录工作,防止以后再踩坑 移植使用的是LoRaMac-node库,使用的是STM32L151CBT6 MCU,需要要移植 ...

  2. 从0移植uboot(六) _实现网络功能

    为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于网卡功能的移植,我们依然在在一遍又一遍的实践这个uboot改造的套路. 找运行逻辑,即插入代码的位置. 根据运行逻 ...

  3. (转)从0移植uboot(六) _实现网络功能

    ref:https://www.cnblogs.com/xiaojiang1025/p/6500532.html 为uboot添加网卡功能可以让uboot通过tftp下载内核, 方便我们的开发, 对于 ...

  4. LoRaWAN_stack移植笔记(七)_数据包的接收发送

    以下的代码适用于LoRa sx1276点对点的通讯,纯粹的考虑在非发射模式下即为接收模式 配置sx1276的射频参数,并且切换到接收模式 //bandwidth [0:125 1:250 2:500] ...

  5. Python笔记(六)_函数

    函数一般是从第一行代码开始执行,结束于return语句.异常.或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在局部变量中的数据都将丢失.再次调用这 ...

  6. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

  7. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  8. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...

  9. C#_02.15_基础六_.NET类

    C#_02.15_基础六_.NET类 一.类继承是一个类在另一个类的基础上进行的扩展. 继承的子类拥有父类的全部成员.索引子类拥有本身的全部成员以及父类的全部成员. 可以对基类成员进行隐藏,如果必须的 ...

随机推荐

  1. form 利用BeginCollectionItem提交集合List<T>数据 以及提交的集合中含有集合的数据类型 如List<List<T>> 数据的解决方案

    例子: public class IssArgs { public List<IssTabArgs> Tabs { get; set; } } public class IssTabArg ...

  2. Excel催化剂100+大主题功能梳理导读

    Excel催化剂历经1年4个月的开发时间,终于荣登100+个大主题功能,完成数据领域的功能大矩阵,可以说在日常的数据处理及分析上,绝大部分的共性场景已经囊括其中,是数据工作者难得一遇的优秀作品之一.因 ...

  3. TCP概述\三次握手四次挥手\报文首部,常用熟知端口号

    06.26自我总结 1.TCP概述 TCP把连接作为最基本的对象,每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字,例如,若IP地址为 ...

  4. C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法

    连载目录    [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET ...

  5. AppBoxFuture: 二级索引及索引扫描查询数据

      数据库索引对于数据查询的重要性不可言喻,因此作者在存储层实现了二级索引,以及利用索引进行扫描的功能.目前仅实现了分区表与非分区表的本地索引(数据与索引共用一个Raft组管理),全局索引及反向索引待 ...

  6. junit的Test不能使用,报错信息:Test is not an annotation type

    在使用junit的Test做测试时,注解@Test报错”Test is not an annotation type”,发现是因为测试类的类名命名为了Test,所以导致错误. 测试类类名不能直接命名为 ...

  7. MYSQL 时间轴数据 获取同一天数据的前3条

    创建表数据 CREATE TABLE `praise_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `pic_id` va ...

  8. 模块购物商城和ATM机代码:

    http://outofmemory.cn/python/video/let-us-python/ python为程序员服务  快来加入群[python爬虫交流群](群号570070796),发现精彩 ...

  9. 【Android】java.lang.StackOverflowError: stack size 8MB

    最近遇到的问题,报了两个错误,如下: java.lang.StackOverflowError: stack size 8MB android.os.TransactionTooLargeExcept ...

  10. 【iOS】PLA 3.3.12

    发件人 Apple Program License Agreement PLA We found that your app uses the Advertising Identifier but d ...