在调试LoRa模组时,经常遇到客户反馈问题说,代码已经调通了,可以正常通信,但是会存在概率性的问题说接收到的数据包错误,这种问题如何改善或者避免呢?首先应该是先避免掉接收不正确的数据,这种错误的数据发生概率很低,但是数据是错误的,不应进行接收处理,接收处理错误的数据可能会影响我们的应用,所以应该抛去。再接下来是分析数据错误的导致原因。 一、开启CRC检验功能 图1 图2 开启CRC功能后,通过查询判断CRC错误标志位去判断是否Payload有数据错误。当开启CRC,发现接收到的数据依旧是错误,即现象是CRC“不生效”。 图3 这时接下来就是要去找CRC“不生效”的原因。可以通过以下方式排除CRC是否生效; 在接收机端,当产生RxDone时,去读去0x1C寄存器值,判断CRC是否开启成功; 读寄存器: 图4 寄存器表: 图5 通过去监控CRC错误标志,是不是通信过程,一直都不会产生。有可能CRC实际上是生效的,看到的数据错误是其它原因,并不是CRC错误没有触发的原因,一般如果可以监控到一次有触发CRC,CRC功能就应该是正常的。 图6 CRC能确认是可以正常触发的,但是数据还是错误,这是就可以考虑发射机端发射数据的正确性及接收端是否有数据转换错误,或者接收机端SPI读取FIFO时导致数据错误(读取FIFO的位置不对,或者SPI异常,导致数据错误) 1)发射机端写数据数据正确性判断 在发射函数中,写完fifo后,再进行读fifo进行数据判断,看是否有数据写入fifo时就产生错误。 2)接收机读取fifo 位置不对,实际接收时fifo存储位置与读fifo时位置不一致,导致读取数据错误 比如,提供的例程代码中,使用的是持续接收的模式,即接收时每包写fifo指针都是顺序累加的,这时读取fifo也应该设置相应fifo指针。但是例程代码中,每次接收完成后会重新设置地址指针为0x00,这样的话每次接收读fifo时只要从0x00开始读取对应数据包长度即可,如果读取的地址指针一旦对不上,就会出现CRC是对的,但是读取的数据错误。(这个问题可查看下附件的问题分析报告) 3)接收机读fifo,SPI异常导致 可以在产生Rxdone时,通过多次读取fifo来判断是否SPI异常导致。 二、改善数据错误问题 1、数据错误,可能是通信环境干扰较大,可以通过改变频点或速率来验证; 2、硬件布局问题,导致接收性能受影响;可以对PCB或产品进行查找审核分析下; 三、案例分析 案例分析报告
|