前天驱动了一下Nrf2401无线模块。这模块去年就看到过,现在才有机会拿来试试。
模块尺寸不大,不需要外接天线。
这款芯片支持双通道通信,不过我只试了单通道。双通道的插针都没有焊上。外接的引脚从左到右一次为,电源(1.9V~3.6V供电),POWER_UP,CE,CS(这三个管脚用来控制芯片的工作状态),DR1(通道1的中断输出),CLK1(通道一的时钟),DATA(通道1的数据口),紧接着2个是空管脚,最后一个管脚是地。
上面就是我用来芯片的红牛开发板。可怜我的电脑一共就4个USB端口,一个用来插鼠标,一个用来USB转串口通信,还剩下两个USB端口,可是2块红牛板加一个JLINK要三个USB端口,于是我在调试时就不断的插拔插拔,一百遍啊一百遍。
芯片对外传送每帧数据不能大于256Bit,也就是说每帧数据最多只能是32字节。每帧数据由地址+数据+CRC构成。CRC可以选择8为或者16位。地址位最多可以5字节。在减去地址位和CRC校验位后,每帧发送的数据只有不到30字节。我测试时选择了1字节的CRC和4字节的地址,所以我每帧实际发送的数据只有27字节。
在编程的过程中我犯了2个大错误。一个是看Datasheet时太粗心,把控制位DATAx_W看成仅仅是32-地址-CRC后得到的最大值,以为只要我每次发的字节数小于DATAx_w就可以了。事实上是要求我每次发的数据字节=DATAx_w,而DATAx_w的值必须不大于32-地址-CRC。第二个错误是犯在管脚上,因为我用的是STM32的硬件SPI来驱动芯片的。而芯片的DATA管脚就一个(插句话,用硬件SPI因为管脚的原因只能进行单向通讯,要做到双向通讯还是只能用软件模拟SPI),在发送端我把DATA管脚接在了MOSI上,在接收端也接在了MOSI上,那时脑袋接晕了,于是乎出现的现象就是(我把DR1设成了中断脚)单片机进入了中断,但串口发回的数显示接收的数据是0,我当时那个费解呀,这是为毛啊。然后习惯性的用示波器去看波形信号,亏得那时脑筋正常,知道去测MISO那管脚,表笔点到那根空空的插针我才想起我把2输出管脚接一起了。在换回管脚发生了更稀奇的事情,接收端直接接收不到信号了。在我闲极无聊随便又把信号线接到MOSI上并复位后,丫的又能接收信号,更奇迹的事等我再把线插到接收管脚上时,我竟然收到正确数据了,奇迹啊。我深深的被震惊了,心想这芯片这芯片这么智能,非要我先从MOSI给点强输出刺激刺激,我一测电平,果然是输出高电平的。(芯片也有受虐心理???)当然后来问题找到了,还是用硬件SPI的原因,Nrf2401上电后是需要15字节的配置数据的,我当时直接把DATA端接到MISO上,芯片没被配置自然接收不到数据,而我强插到MOSI上复位后芯片就被配置了,然后再插回MISO上自然歪打正着接收数据了。最后的解决方案是先把MISO设成推挽来对芯片进行配置,等配置完了在改用硬件SPI接收数据。
在数据正常发送接收后,我先是对单帧数据进行测试,从发送1~27这个27个数字,发送后延伸1秒,接收端接收到数据后通过串口传到电脑上,持续发送没有出错。
进行完单帧测试后就是连续发送测试稳定性,每次我是发送300帧就是27*300=8100字节的数据,然后延时一秒,因为我估算了一下我的串口波特率是115200,这样向计算机发送8100字节,大约是0.7秒,不会和接收数据冲突。只要我连续发8100字节不出错的话那么连续高速通讯就不会有问题。
根据pdf手册,芯片时钟的最快速度是1MHz,数据准备需要195us,然后高频发送需要300us左右,在实际运用中,我从单片机发往芯片花时间不到300us,然后等待发送完毕花了500us,加起来发一帧数据不到800us,而我一帧数据是27字节,这样每秒就发送33.75Kb数据(如果减少地址位的话每秒发送的数据量还会更多点大概在37.5kb左右)。
2401的缺点是发送玩每帧数据后没有标志位,必须要自己估算延时时间。
在试玩硬件SPI后我还试了软件模拟SPI把GPIO管脚设成开漏后就能双向通讯了。只要修改最后一个配置字节就可以完成发送和接收模式的转换。总体来说Nrf2401用来进行短距离的无线通信还是可以的。和无线串口比起来,虽然程序略微复杂,但是模块体积和发送速度都优于普通的无线串口。但是如果需要高速传送,2401每秒30多kb的速度就满足不了要求了。