1.实验目的
本实验介绍了基于ATmega128和CC1000实现433MHz传感网节点的点到点无线通信方法。通过实验,使读者理解和掌握如何使用ATmega128控制CC1000进行点对点无线通信,并进一步了解如何实现自己的无线通信协议。
2.实验设备
(1)硬件
● 单片机实验母板(IOT-SCMMB)1套。
● IOT-NODE4331个。
● JTAG编程器1个。
● PC(含串口)1台。
(2)软件
● WinAVR20050214。
● AVRStudio4.18。
● 串口调试助手。
3.实验原理
433MHz无线通信实验是以在无线传感器网络中常用的CC1000芯片为基础完成的。该芯片具有良好的可配置性,非常适合于在实验环境下展示无线通信的原理。CC1000是根据Chipcon公司的SmartRF技术,在0.35μm CMOS工艺下制造的一种理想的超高频单片收发通信芯片。它的工作频带在315MHz、433MHz、868MHz及915MHz,但也很容易通过编程使其工作在300~1000MHz范围内。它具有低电压(2.3~3.6V),极低的功耗,可编程输出功率(-20~10dBm),高灵敏度(一般为-109dBm),小尺寸(TSSOP-28封装),集成了位同步器等特点。其FSK数据传输率可达72.8kbit/s,具有250Hz步长可编程频率能力,适用于跳频协议;主要工作参数能通过串行总线接口编程改变,使用非常灵活。
当调制数据时,CC1000能被设置成3种不同的数据形式,分别为同步NRZ模式、同步曼彻斯特码模式、异步传输(UART)模式。为了满足电池供电情况下严格的电源损耗要求,CC1000提供了十分方便的电源管理方法。通过MAIN寄存器控制低电平模式,有单独的位控制接收部分、发射部分、频率合成以及晶振。这种独立控制可用来优化在某个应用中最低可能达到的电流损耗。CC1000优良的性能使它应用于工业、科学及医疗等各个行业。
实验需要两个节点,433MHz无线传感器网络节点(IOT-NODE433)作为发送节点,开发套件作为接收节点。开始时两个节点将CC1000的状态设置为接收状态,发送节点通过时钟中断,定期地将CC1000的状态设置为发送状态,同时发送一个预定义的数据包(包括包头、包尾、有效载荷,有效载荷为main.c中定义的buff[4]),发送完毕转换为接收状态。
通信的初始化以及参数设置在CC1000.c中实现,主要包括:
1)通过CC1000HPLInit函数配置ATmega128单片机和CC1000交互的引脚方向和状态。
2)CC1000的主要工作参数的配置。图4-1为CC1000与ATmega128的连接方式。其中,单片机使用3个输出端与CC1000的3线串行接口(PDATA、PALE和PCLK)相连,配置CC1000的工作参数;使用SPI接口与CC1000进行数据发送和接收;另外,单片机能从引脚CHP_OUT监视频率的锁定状态,从引脚RSSI获取信号强度的输出。其中CC1000的主要工作参数配置过程为:当芯片供电时,首先进行复位(通过清零MAIN寄存器的RESET_N位);然后对需要配置的寄存器进行编程。程序中各个寄存器的设置方法请参见CC1000的数据手册。本实验中写寄存器是通过函数CC1000HPLWrite实现的。其参数addr为要写入数据的寄存器的地址;data为要写入寄存器的数据。该函数先通过CC1000的PDATA引脚写入地址和读/写位,在此期间,PALE必须保持低电平,然后PALE置高,通过PDATA逐位地写入数据,PDATA在PCLK下降沿有效。
图4-1 CC1000与ATmega128的连接方式
函数实现代码如下:
3)CC1000发送或接收模式的设置也是通过向CC1000的相关寄存器写入所要求的值而实现的,如何设置请参见CC1000数据手册。
发送部分主要使用定时器来定时,并调用physical.c中提供的接口进行数据的发送,其主要流程如图4-2所示。
图4-2 CC1000数据发送的主要流程
当定时器溢出时,在其回调函数中调用物理层的physical.c模块进行数据发送。回调函数的代码如下:(www.xing528.com)
回调函数中调用的physical.c中的PhysicalTxPkt函数参数packet为要发送的数据包的地址,length为物理层要发送的字节数。该函数使物理层变为传送状态,调用radiocontrol.c的RadiocontrolStartTx()函数进行数据包发送。其实现代码如下:
RadiocontrolStartTx()函数首先关闭SPI中断,再判断CC1000的状态,若为睡眠则将其唤醒;然后将待发送的数据(包括导频字节和两个同步字节以及负载)写入SPI的SPDR寄存器;再打开SPI中断,通过SPI中断处理程序__attribute((signal))__vector_17()把SPDR寄存器的数据传入CC1000;最后CC1000在发送模式下将要发送的数据发送出去。该函数的代码如下:
CC1000接收到数据之后,触发单片机的中断进行数据的接收。接收部分的主要流程如图4-3所示。
图4-3 CC1000接收部分的主要流程
CC1000接收到数据就会产生由CC1000的时钟信号引发的SPI中断,使得单片机与CC1000同步,再根据CC1000状态进行相应的数据的发送和接收。SPI中断处理函数__attribute((signal))__vector_17()在检测到起始符号且同步完成之后,使射频控制进入接收状态,通过调用PhysicalStartSymDetected函数判断如果物理层处于空闲状态,则使物理层也转为接收状态。接下来根据偏移量取出字节,并调用PhysicalRxByteDone函数通知物理层处理接收到的字节。
4.实验内容
阅读CC1000数据手册,能够根据数据手册进行CC1000的配置并掌握CC1000数据收发程序的编写方法。
阅读ATmega128数据手册,学习ATmega128单片机SPI接口的使用方法,并能够使用ATmega128控制CC1000进行数据的收发。
5.实验步骤
1)启动WinAVR,建立一个base节点工程,编写代码,建立Makefile文件,并编译得到接收节点的.hex文件。
2)建立一个发送节点工程,编写代码,建立Makefile文件,并编译得到发送节点的.hex文件。
3)将接收和发送节点的.hex文件分别下载到开发板上和IOT-NODE433节点上。
4)将接收节点通过串口线和PC主机连接起来,PC主机运行串口调试助手(波特率设为57600bit/s),打开接收节点和发送节点,这时可以看到发送节点红色LED闪烁表示正在进行数据发送,接收节点蓝色LED闪烁表示正在进行数据接收。串口调试助手显示收到的类似“8E 04 FF EE DD 7E”格式的数据包。其中,8E为包头,7E为包尾,04FFEEDD为main.c中定义的负载数据uint8_tbuff[4]。
6.思考题
1)如何实现CRC-16校验?
2)简述使用AVR单片机SPI的步骤。
7.补充阅读
[1]徐勇军,安竹林,等.无线传感器网络实验教程[M].北京:北京理工大学出版社,2007.[2]ATmega128/LDatasheet.http://www.atmel.com/.Atmel,2010.
[3]CC1000Datasheet.http://www.ti.com/.Texas Instruments,2009.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。