首页 理论教育 GHz无线通信实验|物联网实验教程

GHz无线通信实验|物联网实验教程

时间:2023-10-21 理论教育 版权反馈
【摘要】:通过实验,使读者理解和掌握如何使用CC2420进行点到点无线通信以及ATmega128单片机SPI口的使用。CC2420在接收到数据包之后触发单片机的FIFOP中断,单片机在该中断处理函数中读入CC2420的RXFIFO缓存区中的数据。以确保SFD无效,不再继续接收数据。

GHz无线通信实验|物联网实验教程

1.实验目的

本实验介绍了使用ATmega128单片机控制CC2420实现的2.4GHz点到点无线通信技术。通过实验,使读者理解和掌握如何使用CC2420进行点到点无线通信以及ATmega128单片机SPI口的使用。

2.实验设备

(1)硬件

● 单片机实验母板(IOT-SCMMB)1套。

● IOT-NODE241个。

● JTAG编程器1个。

● PC(含串口)1台。

(2)软件

● WinAVR20050214。

● AVRStudio4.18。

● 串口调试助手。

3.实验原理

本实验需要两个节点,2.4GHz无线传感器网络节点(IOT-NODE24)作为发送节点,单片机实验母板(IOT-SCMMB)作为接收节点。开始时两个节点将CC2420的状态设置为接收状态,发送节点通过延时函数,定期地将CC2420的状态设置为发送状态,并立即发送一个预定义的数据包(数据包的格式在project.h中定义)。CC2420和ATmega128通过SPI总线连接,其连接图如图4-4所示。

978-7-111-34147-5-Chapter04-13.jpg

图4-4 CC2420和ATmega128的连接

如图4-4所示,单片机可以通过4线SPI总线(CSn、SI、SO、SCLK)设置芯片的工作模式,并实现读/写缓存数据,读/写状态寄存器等。CC2420的CCA、SFD、FIFO和FIFOP这4个引脚向单片机返回收发数据的状态。FIFO和FIFOP引脚标识接收FIFO缓存区的状态,如果接收FIFO缓存区有数据,则FIFO引脚为高,相反则低;FIFOP引脚在接收FIFO缓存区的数据超过某一个临界值时或CC2420收到一个完整的帧时输出高电平,临界值可通过CC2420的寄存器设置。CCA引脚在信道有信号时输出高电平,其仅在接收状态下有效,并且在CC2420进入接收状态至少8个符号周期后,才会在CCA引脚上输出有效的信道状态信息。SFD引脚状态的表示是否可以控制时钟/定时信息的输入,CC2420收到SFD字段后,会在SFD引脚输出高电平,直到接收完为止;如果启用了地址辨识,地址辨识失败,SFD引脚会立即输出低电平。单片机将与该4个引脚相连的端口配置为输入。

要使用CC2420进行数据收发,首先需要对其进行配置和初始化。初始化过程包括CC2420初始化以及发送和接收模式的设置,下面分别进行介绍。

1)CC2420初始化包括ATmega128单片机SPI的初始化、打开电压调节器、重新启动芯片、打开晶振、初始化寄存器值、设置寄存器值等。相关代码如下:

978-7-111-34147-5-Chapter04-14.jpg

其中:

SPI_init为SPI初始化函数,具体过程请参考ATmega128数据手册;

cc2420_oscon为CC2420晶振开启函数,其主要是通过cc2420_sendcmd函数访问CC2420的SXOSCON命令寄存器;

cc2420_reginit为寄存器初始化值设置函数,其主要完成CC2420寄存器的预设参数(具体请参见CC2420数据手册),再通过cc2420_setreg函数调用cc2420_writereg函数把这些参数预设值写入对应的寄存器。

cc2420_writereg的实现代码如下:

978-7-111-34147-5-Chapter04-15.jpg

978-7-111-34147-5-Chapter04-16.jpg

该函数的参数addr表示单片机要向CC2420写入数据的寄存器的地址;data表示要写入寄存器的数据。单片机通过SPI总线写CC2420寄存器,若SPSR中的最高位置位,则写SPDR寄存器会启动数据传输。需要注意的是,写SPDR寄存器时要保持SPI的CS信号线为低电平,先将addr写入SPI的SPDR寄存器输出给CC2420,CC2420收到地址的每一位都会同时向单片机返回CC2420的状态位。然后按照上述方式,再将data写入SPDR寄存器输出给CC2420。

2)设置发送和接收模式。发送模式和接收模式的设置是通过cc2420_sendcmd函数分别访问CC2420的STXON和SRXON这两个命令寄存器完成的。相关代码如下:(www.xing528.com)

978-7-111-34147-5-Chapter04-17.jpg

CC2420初始化之后,即可以进行数据的发送了。在实验中,使用一个for循环进行发送,每发送完毕一个数据包之后,插入255ms的延时,之后调用cc2420_writetxfifo函数进行无线发送。发送的相关代码如下:

978-7-111-34147-5-Chapter04-18.jpg

无线发送的启动是通过调用cc2420_writetxfifo向CC2420的发送寄存器TXFIFO写数据实现的,cc2420_writetxfifo函数向CC2420发送寄存器TXFIFO写入要发送数据包,该数据包的长度为(demopacket->length)-1,数据包的存放首地址为demopacket的首地址,*demopacket为指向结构体的指针变量,该结构体的内容为要发送的数据帧的内容(数据帧格式请参见CC2420数据手册)。其中,写TXFIFO的方法请参考CC2420初始化过程中的写寄存器方法。

CC2420在接收到数据包之后触发单片机的FIFOP中断,单片机在该中断处理函数中读入CC2420的RXFIFO缓存区中的数据。FIFOP中断处理程序如下:

978-7-111-34147-5-Chapter04-19.jpg

在FIFOP中断处理程序中,FIFOP引脚在RXFIFO缓存区的数据超过某一个临界值(RXFIFO缓存区在一次接收中,只可以保存128字节,只要数据小于128字节,它可以是多帧数据,如果大于该字节,则发生溢出FIFOP引脚为高,FIFO引脚为低)时或CC2420收到一个完整的帧时,输出高电平。通过FIFO引脚可以获得该中断的类型,如果FIFO引脚为低,则FIFOP中断是由RXFIFO缓存区的数据超过临界值而引起的,此时已接收到的数据仍可以读出。继续接收数据,则必须使用SFLUSHRX命令清空接收区,并且SFLUSHRX需发送两次。以确保SFD无效,不再继续接收数据。如果FIFO引脚为高,则证明RXFIFO缓存区有数据。该FIFOP中断是由CC2420收到一个完整的帧引起的,此时要使用cc2420_rxbufuse变量判断是否有可用的RAM空间:如果有可用的存储空间,则启动读RXFIFO任务进行数据包的接收;如果没有可用的存储空间,则等待。读RXFIFO的相关代码如下:

978-7-111-34147-5-Chapter04-20.jpg

978-7-111-34147-5-Chapter04-21.jpg

单片机通过SPI总线接收CC2420的RXFIFO寄存器中的数据并保存到SPDR寄存器中。读RXFIFO寄存器时要保持SPI的CS信号线为低电平,先将RXFIFO寄存器的地址写入SPI的SPDR寄存器,若SPSR中的最高位置位,单片机就会将SPDR寄存器的值发送给CC2420,CC2420会返回给单片机状态位,接下来再逐字节的读入RXFIFO寄存器的值到SPDR,并将SPDR寄存器的值存入所开辟的缓存区。通过cc2420.c中的demo_handlepacket函数将接收到的数据处理并通过串口发送到上位机上进行显示。

4.实验内容

阅读CC2420数据手册,能够根据数据手册进行CC2420的配置并掌握CC2420初始化以及数据收发方法。

阅读ATmega128数据手册,能够根据数据手册并结合CC2420数据收发使用AVR单片机的SPI端口。

5.实验步骤

1)启动WinAVR,建立一个接收节点工程,编写代码,建立Makefile文件,并编译得到接收节点的.hex文件。

2)建立一个发送节点工程,编写代码,建立Makefile文件,并编译得到发送节点的.hex文件。

3)将接收和发送节点的.hex文件分别下载到开发板和IOT-NODE24节点上。

4)将接收节点和计算机通过串口连接起来,打开接收节点和发送节点。发送节点上电之后3个LED同时点亮,当有数据发送时会同时闪烁红色和绿色LED;接收节点上电后所有LED均熄灭,当收到数据时黄色LED闪烁。通过串口调试助手可观察到类似如下格式的数据包:

7E 42 21 02 03 01 01 E3 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 01 01 7E

该数据包内容按顺序如下:

7E 42 21 02 03为包头,01为数据包源地址,01为规定串口输出,E3为数据包序列号,00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00为发送节点发送的有效载荷数据,0101为CRC校验值,7E为包尾。

6.思考题

1)CC2420无线发送原理与前文CC1000有何区别?

2)在本实验中调用了AVR-GCC库中的延时函数,如果使用定时器以每640ms发一个帧的速度来发送,则需要如何修改程序?(提示:使用定时来控制发送,注意每次发送一个帧时dsn要加1)

7.补充阅读

[1]徐勇军,安竹林,等.无线传感器网络实验教程[M].北京:北京理工大学出版社,2007.

[2]ATmega128/L Datasheet.http://www.atmel.com/.Atmel,2010.

[3]CC2420Datasheet.http://www.ti.com/.Texas Instruments,2010.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈