Portapack应用开发教程(十七)nrf24l01发射 C

本文详细解读了Arduino项目send_simplified、send、recv和HackRF项目BTLE中的蓝牙包编码、底层通信以及调制过程,重点剖析了HackRF发射的GFSK调制技术,从编码到调制成熟的通信链路原理。

接下来看一下几个相关项目的代码。重点看看调制部分是如何实现的。

从难易程度排序,我认为最好先看send_simplified项目,然后再看send和recv项目,最后看BTLE项目(HackRF发射)。

send_simplified项目:

btle_nrf24l01/send_simpified.ino at main · jamesshao8/btle_nrf24l01 · GitHub

这个项目十分简单,里面只有一个ino文件,没有调用RF24库,而是直接完成了编码和底层调用。

开头的几个函数btLeCrc, swapbits, btLeWhitten, btLeWhitenStart, btLePacketEncode都是用于蓝牙包编码的。其中btLePacketEncode调用了其他几个函数,实现的功能类似上一篇提到的把info bit重新编码为phy bit,以便进一步调制。

另外spi_byte, nrf_cmd, nrf_simplebyte, nrf_manybytes,这些函数都是用于底层通信的,后面几个函数都在调用spi_byte,它是最终给SPI总线发数据的接口。

运行的主要流程是先在setup里完成一次性的工作,比如设置nrf24l01硬件模式,包括广播包的标志(类似mac地址)也是setup里做的。

另一个loop函数才是后面重复循环运行的主要内容。开头都在打包,把mac地址,显示名称,数据以及它们的包头、长度都打在buf中,相当于buf先存入了info bit,然后用btLePacketEncode把buf里的内容转换为phy bit,最终再用spi_byte发到SPI总线上去,之后的工作应该是调制,但是这部分没有在代码里实现,这是因为这部分工作完全由nrf24l01芯片负责,arduino单片机不用管这部分的工作。(除此之外,还有对CSN CE引脚的操作,但是这部分代码比较简单,直接用我的代码能跑起来就行,不用深入研究。)

这样send_simplified就看完了。另外两个send/recv项目虽然代码量更多,但其实也是类似原理,arduino只负责编码或者解码,不负责调制和解调,往SPI总线写入和从SPI总线读出的都是phy bit,而不是无线电通信里的sample。

接下来看一下send项目:

btle_nrf24l01/send at main · jamesshao8/btle_nrf24l01 · GitHub

这个项目功能与前面那个项目差不多,但是结构复杂很多。send.ino是主程序,它会调用BTLE.cpp(这是收发低功耗蓝牙数据包共用的库),它又调用了RF24库,对nrf24l01的底层驱动进行了封装,有了RF24就不需要手动往SPI总线上读写数据了。

send.ino里的工作也比较简单,首先初始化了RF24的radio,定义了CSN CE的引脚,还把radio传给了BTLE类,这个很重要,接下来有趣的硬件操作都是围绕着这个radio展开的,而这两个库的类就是在这里建立了联系。

然后setup函数里,btle.begin函数设定了要发送的名字SHARF。后面loop里btle.advertise就是用于循环重复发射数据包的函数。

btle中的begin,包含了先初始化radio也就是radio.begin(往下看的话,都是在RF24.cpp里,最终都是在往SPI总线发命令设置硬件模式)。然后是setAutoAck disableCRC等,这是因为nrf和btle数据包要求不一样,所以要禁用nrf硬件里的crc计算,改用单片机里的代码实现crc,另外也要考虑到半双工通信,所以得把ack关掉,要不然没法和hackrf通信。

然后看看btle里的advertise,它会调用prepare_packet和transmit_packet。前者是在设置发送端的mac地址和名称,后者负责调用whiten和swapbuf函数做编码,最终调用radio->write函数把output里的phy bit发出去。而radio->write,而这个write是在RF24库里的,它调用startFastWrite,startFastWr

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值