NRF20l41使用调试收发数据
最近入手了一对无线模块,NRF20L41,想做一个远程收发数据的可移动无线测试数据发送接收模块,之前买到的时候看到反正都有厂家的例程,到时候参考做就行了,应该很简单
但是真到了自己调的时候就发现自己想的太简单了。
整体写底层驱动的时候都还比较顺利,不过自己也能想到,写完了第一时间一般都是有问题功能实现不了的,关键的是还是找问题,能不能解决功能实现不了的关键问题才是能不能调试成功的最关键的地方
一,通信SPI问题
于是底层铺好之后我遇到了第一个问题,那就是运行的时候根本接收不到数据,发送端读取的STATUS寄存器数据读出来一直都是0,也就是说,SPI底层的通信出现了问题。
首先把它配置成不用自动应答进行调试,先看发送端
通过设置之前读取各个寄存器的初始值去判断是不是读取时序存在问题,读出来的数据和初始值对比发现,设置发送之前读的数据没有问题,发送端在设置发送之后寄存器的内容读取下来就都是0了

我还以为读取和CE有关系,于是改了CE的电平再读也一样,和发送状态没有关系,CE拉高之前就这样了
在写了第一个寄存器之后后面的所有寄存器读取都是0了
也就是说问题是出在配置寄存器的函数中
于是我就一个一个的按照顺序去读,发现在第一个写寄存器的函数的时候读取就出问题了
进一步对函数进行查看,发现是因为我一个地方CS片选拉低之后拉高语句写错了,写完之后本来应该是拉高,但是我写成了保持低。
本来SPI片选应该一直保持低也没问题的,所以我不报太大希望,但是还是重新读取寄存器试了一下,。。。。。在调整CS值之后,数据寄存器就对了。。。。。
我去,真是这个原因导致的!?

为什么CS保持低就不能正常接收数据?
这次在写入寄存器的时候读取就没有问题了,但是还是接收不到数据,这个是为什么?
发现在用printf之前和之后读取的值会发生变化?
确实出现了不一样,不过和printf没有什么关系,是CS高读取的数据和低读取的数据不一样。,是不是读取数据的时钟线存在什么问题?

检查了读取的时钟线,也没有看到什么明显的区别
突然我感觉是不是这个芯片片选和CS的跳变沿有什么关系,于是我又看了下说明书里面的时序说明。。终于找到了答案

(掩面)
但是数据接收端还是没有收到数据
单独调整发送端发现,自动应答下,收到0x1e的中断状态,代表发送次数达到上限,但是并没有接受到反馈信号,从这个状态来看,应该是数据发送出去了
把寄存器调整到非自动应答看下返回值为十进制的46,也就是0x2e,也就是说数据已经正常发送出去了,现在我们看下数据接收端

二。接收问题(数据不稳定)
接收端也同样存在这个问题,(因为我的底层接收端是直接复制过去的),改好后首先还是看下寄存器读取是否存在问题,没问题
然后重新进行发送尝试,果然OK收到数据了!

但是还是存在一个问题,就是接收数据并不稳定
发现在串口函数取消之后,就收不到数据了。
然后再把函数打开,在几次发送之后就能收到了

从厂家给的函数可以看出,之前的配置和接收时放在一起的,像这样。

为什么接收模式要重复配置?,会不会是重复配置的时候导致了数据来的时候我还在配置寄存器导致没有收到?
于是我把这个配置放到了初始化那里,让它只执行一次,
但是就出现了收到第一个数据之后就再也收不到数据。
查询配置的寄存器发现,寄存器的值其实都和原来配置一样的,完全没有必要重新写一次。

难道是因为CE出发的缘故?只是每次接收的时候要激活接收码?
于是我在接收里面最后一行增加了重新将CE拉高的操作,
再进行测试就OK了。
本文记录了在使用NRF20L41无线模块进行SPI通信时遇到的问题及调试过程。首先,由于SPI片选CS拉低后拉高语句错误导致无法正常接收数据,修正后解决了通信问题。接着,发现数据发送成功但接收端数据不稳定,经过分析和调整接收配置,最终解决了数据接收不稳的问题。
2601

被折叠的 条评论
为什么被折叠?



