仔细检查单片机上电初始化程序,第一时间置nrf24l01的CE(1脚)为低电平,使nrf24l01处于待机状态,看看问题能否解决,不行就用硬件解决,CE端加一个逻辑门,从单片机上电复位电路引出一个复位信号给CE,使nrf24l01在单片机复位期间处于待机状态,或者单独用一个上电复位芯片。
SPI协议中接收和发送数据是一体的,数据传输的线路为一个循环链路(loop)如果主机发送数据给从机,则必须从从机读取数据(即从机也发送数据到主机)同理,如果主机读取从机发来的数据,也必须同时发送数据给从机总之,同一个时钟周期内,读和写2个 *** 作都必须执行
不是的
,spi_rw(reg)返回的值不是a的值,这里返回的值没有意义是被丢弃掉了的,紧接着下一次spi_rw(0)返回的才是。
一次spi *** 作一般在cs(片选)的一个周期进行,
在读取寄存器值时一般需要调用2次以上的spi_rw,
比如读取寄存器reg,
首先
拉低cs线(片选)->调用spi_rw(reg),这里的reg实际上是01111按位与上reg,因为reg这个地址没有用到最高位,最高位为0代表读地址 *** 作,1代表写地址 *** 作。->再次调用spi_rw(0)
,这里为0是因为读 *** 作,如果是写那么就是写地址reg的值,即spi_rw(val)
->拉高cs线结束spi *** 作。
spi读写时是先写地址与 *** 作或命令的一个byte,再读写值的一个byte,也就是clk周期是2个byte也就是2
8bit
=
16个周期的。
地址与 *** 作的一个byte:这个字节的最高位是控制读写的,读写分别为
0b0xxxxxxx或0b1xxxxxxx
的形式,
xxxxxxx中的最后几位是地址。中间几位是spi命令。
值的一个byte:
如果是读,那么全为0,如果是写,那么就是要写的值。如果是命令就看命令的定义了。
在时钟线电平的上升yuan写1位,的在时钟下降yuan读1位的,当这8个时钟周期完结那么就得到了8位正好一个字节。当然如果寄存器的数据宽度是2个字节时,相应的这里就要是16个时钟周期2个字节。
没用过nrf24l01模块,但一般spi的过程就是这样,关键要看你要访问的模块的spec文档,里面都描述了这些读写,控制的时序图。
花了几个月的时间,写了个跳频算法,目前用msp430+nrf24l01做载体测试成功,基本性能:1000跳每秒,80个信道,跳频信道间隔大于10,自相关不大于2,互相关不大于3,跳频序列长度是210的9次方,23天左右。跳频序列长度可以更长。初始同步时间小于300毫秒,看干扰能力很强,定频干扰、其他24g设备的干扰、其他算法跳频干扰、同设备的互相干扰都能很好的抑制。现在在优化代码,跳频搞起来确实很麻烦,我写的算法不能共享,但很愿意交流下经验,有兴趣的朋友可以讨论讨论。
首先试试读寄存器的配置值,看看能得到正确的值不。
如果不能,就说明根本没写进去配置值,可能是NRF模块坏了,可能是端口定义或者接线有问题。
有任何疑问请回复。
希望我的回答能帮助到你。
以上就是关于单片机上电的瞬间,nrf24l01无线模块会错误的发射一下信号。怎么解决全部的内容,包括:单片机上电的瞬间,nrf24l01无线模块会错误的发射一下信号。怎么解决、根据SPI协议,写一字节数据到从机,为什么还要读出一字节的数据示例程序如下:、nrf24l01模块中c程序spi问题 reg_val = SPI_RW(0);等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)