BK2425和BK2423都是2.4G射频芯片,使用起来差不多。我没有试过用BK2425和BK2423进行通信,但是同一份代码两芯片都能用。而且2.4G的射频芯片协议是差不多的,我比较nrf24l01的数据手册和BK2425数据手册很多内容(包括寄存器库)完全相同,不同的大概是nrf24l01的datasheet更详细。所以,以下内容通用。
两个通信模块通过SPI接口,分别接到两个单片机上,芯片不断发射电磁波,然后两个单片机之间就能通信了,蛮神奇的。
感性上,我把通过两个模块建立起来的通信,想象成两个人通过一根塑料管子通话,声音在管道里传来传去。通信芯片发射电磁波的波特率不同,使用的管子就不同。若有一堆的通信芯片,两两建立通信,只要使用不同的塑料管子,彼此就不会受到干扰。这个塑料管子,就是datasheet里的“channel”:信道,信息的通道。当然,实际上芯片是向四面八方发射电磁波的。模块长得有点像这样(这是个2.4G模块,但芯片可能不是BK2425)。
若侵权,联系我删图
为什么要有信道呢?因为相同频率波段的电磁波会彼此干扰。你占了这波段,别人就没法用了。所以各国都立法规定电磁波的使用。2.4G频段作为民间极少数可以自由使用,不需要申请的频段之一,所以出现了一堆的2.4G射频芯片,WiFi,蓝牙也使用这频段。因为都挤在这波段,数据偶尔的丢失也就好理解了。这么一想,空无一物的空气也变得拥挤和吵杂了。
BK2425在2400-2483.5兆赫的ISM频段工作,这里有83.5MHz频率范围,1MHz一条的话,2401,2402,2403…可以划出八十多条信道。这样就好多了,不容易撞车。
我写的比较空泛,主要是大佬们已经把这个东西讲透了,我再车轮子也没意思,主要是为了总结,方便以后回忆。大家也可以去看看技术达人怎么讲述。
链接: https://www.arduino.cn/thread-86275-1-1.html
上面这个链接,就是大佬讲解2.4G,很透彻。我是为了做个无线游戏手柄,用的比较简单(会的也不多)。我会把数据手册简略解读,说下单向通信(似乎也没什么内容好说的)。
**
数据手册简读
**
Low Power High Performance 2.4 GHz GFSK Transceiver,这个是芯片数据手册的标题,低功耗高新性能2.4G 高斯频移键控发接受机。
低功耗,芯片支持1.9v~3.6v,超过3.6v瞬间烧毁。我在这遇到个电源的问题。是在单片机的USB公头松了,我换了一个公头出现供电问题。表现出来的是,对通信芯片初始化时,寄存器值读写都不成功。单片机的vcc引脚,经测量是3.3V,就是读写不了。后来我用另一个单片机的vcc引脚同时供两个芯片(我只是学习),了事。如果大家发现初始化时,寄存器写不进去,可以检测下电源。
GFSK(高斯频移键控),就是把输入数据经高斯低通滤波器预调制滤波后,再进行FSK调制的数字调制方式。
芯片之间通信,发送、接收数据,本质上都是传输一串0和1数字。芯片以某个频率为基础(载波),发射电磁波,在这个基础上可以发射的快一些(电磁波频率高些),也可以慢一些(电磁波频率低些)。FSK调制把某一段固定时间内电磁波频率较高的认为是0,电磁波频率低的是1。原理见下图。
图中把时间等分,这个固定的时间,假设它为T,T时间可以发送一个bit,那1/T不就是波特率吗。 前面我们说过,相同频道(也就是电磁波频率或者说波特率)的电磁波会彼此干扰,那自然要错开彼此的波特率。你用2.4G,我用2.4001G,行不行呢?不行的。bk2425芯片对电磁波的分辨率为1MHz。这段时间波特率f1,要比另一段时间波特率f2,大或者小1MHz,芯片才能比较出大小来。
芯片发射电磁波的频率可以由使用者设置,被叫做射频信道频率(RF channel frequency),公式:射频信道频率 F0= 2400 + RF_CH (MHz),RF_CH是使用者设置的信道。射频信道频率是BK2425所使用的信道的中心。例如,我们使用信道0x01,F0=2401,用2400.5MHz的频率表示电平1,用2401.5MHz的频率表示电平0,它们之间相差1MHz,就能分辨出来了。所以你用2.400G,我用2.401G倒是可以的。
射频信道频率射频信道频率决定了两个单片机交换数据的快慢。一方快,一方慢,就不能通信了。所以,MCU的晶振频率可以不一样,spi的读写速度可以不一样。但每时每刻,MCU对通信芯片设置的信道都必须一样。
为什么我说每时每刻呢,因为变频(不断变换电磁波频率)。若使用单个信道,如果旁边有个设备,信道重叠了,就会通信失败。若使用几十个信道,每十毫秒变一次,就不容易受其他设备干扰。
芯片引脚
bk2425和bk2423都是9个引脚(QFP封装):GND、IRQ、MISO、MOSI、SCK、CSN、CE、VDD、GND。
GND引脚有两个,把其中一个连接MCU的GND就行。
VDD连接MCU的vcc引脚,在1.9V~3.6V之间就行。
IRQ引脚表示中断,有3种中断情况。当BK2425数据发送成功,或成功接收到数据,或数据重发送到最大次数,就会把这个引脚拉低。拉低的同时,芯片会对状态寄存器的对应标志位写1。清除标志位也很有意思,只需要使用者对状态寄存器写1。bit4,bit5,bit6分别对应最大重发中断标志,最大发送中断标志,最大接收中断标志,只需对这个寄存器写0x70,就可以清除这三个可能存在的中断标志(为“1”时清除,为“0”时也不会写入)。
CSN引脚就是SPI需要的四个引线(MISO、MOSI、SCK、CSN)之一,也就是我们常说的SS或者说CS。CSN拉低代表芯片被选中。对芯片的寄存器读写数据,都需要把CSN拉低,操作完后,再把CSN拉高。
就像这样:
CSN = 0;
SPI_RW(reg);
SPI_RW(value);
CSN = 1;
MOSI,MISO,SCK是SPI需要的的四根引线,若是硬件SPI,就连接到MCU对应引脚,SPI模式选择模式0(空闲时SCK为低电平,上升沿采样)。模拟SPI就随便找几个引脚。SPI向芯片写入数据也是需要时间的,不能太快,不要超过8MHz.
CE引脚则和芯片的所处的模式有关。芯片有5个模式。见下图。
CE=0时,Power Down(掉电模式)和Standby-I(待机l模式)。CE=1时,Standby-II(待机II模式),TX(发送模式),RX(接受模式)。这个是发送方(PTX)的。接收方(PRX)也是一样的。
由使用者根据自身需要,决定芯片是PTX还是PRX,或者PTX、PRX身份不断切换。PTX和PRX都能发送数据。一个发的时候,另外一个就收,收完再发,发的那个这时候就转变为收,这里存在一个协议,等下再细讲。芯片难用,个人认为,时序是一个难点,手里若有一份波形图就方便了。
未完待续。