找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5356|回复: 3
收起左侧

发现nRF24L01P与SI24R1竟然完美兼容替换

[复制链接]
ID:364163 发表于 2018-9-10 11:27 | 显示全部楼层 |阅读模式
近期有空找出时间把nRF24L01P的数据手册全部看完了。

总的说来,发现一个新一代nRF24L01P与上一代nRF24L01相比寄存器没有太大的变化,但是有几个关于通信管道和ACK的寄存器的配置还是与上一代不同的。另外,个人理解shockburst和enhanced shockburst的区别就在于enhanced shockburst可以在接收机回复ACK时挂上1到32字节的数据包,这样就实现了所谓的“全双工”通信。然而实际探查这项功能发现它的作用其实有限,因为是ACK附加数据包,因此它的传输可靠性无法由射频芯片的校验重发机制保证,只能在接收机软件上做改进,而这有时还不如让接收发送机依照发送次序轮流进入发送/接收状态来的方便。只适合回传一些实时性要求高,对传输可靠性要求不严格的数据。


所谓知易行难,在着手做最基础的SPI通信时就接连遇到了问题。首先是AVR的硬SPI无输出。经过查找,最终问题是SPI设定为主机时,SS口要么设置为输出,要么设置为输入时接上拉,否则当SS为输入又悬空或者低电平就会进入从机模式,自然没有输出。这个问题解决了,接下来遇到了一个更基本的问题,SPI的通信机制。一般说来另外两种常见的通信方式中,UART是有收、发两个数据寄存器,I2C则是通过数据包头来区分接收和发送的数据。而SPI只有一个SPDR寄存器,而且只有写入的时候启动SPI产生SCK信号,怎么去读MISO的数据?要自己做外部中断读取吗?后来才明白,SPI的主机和从机各自的一个SPDR通过MOSI和MISO串联成一个类似环形的大移位寄存器。主机的SPDR中的数据从MOSI每移除一位,从机就在相同的SCK上升沿或下降沿通过MISO将一位数据发送给主机。这样,当SCK八个周期后,主机中的SPDR的数据全部移出了而被从机发送来的数据填充,从机则反之,这样,在一字节的通信结束后再读取SPDR,所返回的数据也就是从机发送来的数据。


解决了这个问题后与nRF24L01P的通信也就变得简单了,先将SS拉低,告知nRF24L01P即将启动SPI通信,当通过MOSI第一次向射频芯片写入任何字节时,MISO上都会有一个字节传送给主机,这个就是芯片默认的0X07状态寄存器里的数据,如果我们在第一次写入读取0X01寄存器的数据,那么0X01寄存器的数据只有在下一字节的通信中才会通过MISO回传给主机,而发起下一轮字节通信就需要主机继续发送数据,那么问题来了,读命令已经发送了,那么接下来我该发送什么。在nRF24L01P的数据手册中给出的建议是发送0XFF,这个命令对射频芯片没有任何意义,其实也可以再随便发送其他任意一个数,只是为了避免产生不必要的麻烦而发送0XFF.发送0X00也可以,而且网上的绝大多数例程都是这样用的,但是这实际上是读0X00寄存器指令。读取完毕后,将SS拉高,本轮通信结束。当下一次SS再次拉低时,一切又重新开始。也就是如果上一轮通信的最后MOSI上发送的是0X00,在这一轮第一次发送指令时MISO上移入的并不是0X00寄存器的状态,而依旧是默认的0X07状态寄存器的状态。


有些绕,但是仔细看手册就会发现原来规则很简单。学习就是一个先将书本学厚,再将书本学薄的过程。


此外,MISO和IRQ信号虽然理论上和实际试验都可以达到AVR的0.7VDD的高电平检测电压,但是在实际应用时必须要做3.3V到5V的电平转换,否则极容易被干扰。而且对芯片的初始化也要等到开机后500毫秒在进行,以免因为芯片上电后还未稳定工作而配置不正常,事实也的确证明,芯片从上电到稳定的确存在一个比较长的时间。
但近年来国产芯片的替代品出来后,有理由项目国产芯片在支持产品本身需求的前提下,的却能降低成本。nRF24L01P的国产替代SI24R1也是有一同测试,确实是还可以 。

评分

参与人数 1黑币 +15 收起 理由
凌净清河 + 15 经验之谈,弥足珍贵!

查看全部评分

回复

使用道具 举报

ID:243366 发表于 2018-12-18 10:30 | 显示全部楼层
好贴啊,受益匪浅,多谢楼主~~!!!
回复

使用道具 举报

ID:243366 发表于 2018-12-18 13:24 | 显示全部楼层
但是我觉得楼主帖子中可能有个地方说的不太准确。
原帖里“而且网上的绝大多数例程都是这样用的,但是这实际上是读0X00寄存器指令”
我觉得这里0x00并不是读取0x00寄存器指令,因为此轮通讯还没有结束,也就是说SS还没有拉高。从机不会认为是读取0x00寄存器指令,而会认为是无用的数据,只是为了让MISO产生数据传输。只有当SS被拉高后,结束此轮通讯。当再次拉低SS,下一轮通讯开始,首个字节为0x00时,从机才会认为是要读取0x00寄存器数据。
手册上说:Every new instruction must be started by a high to low transition on CSN. (CSN就是楼主帖子中所说的SS)

评分

参与人数 1黑币 +15 收起 理由
凌净清河 + 15 有理

查看全部评分

回复

使用道具 举报

ID:478263 发表于 2019-4-12 10:29 | 显示全部楼层
感谢楼主,讲的非常细
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表