打印
[菜农助学交流]

关于短距离、低功耗的无线通信技术---Zigbee

[复制链接]
3321|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kyzb001|  楼主 | 2011-8-9 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kyzb001 于 2011-8-10 16:32 编辑

11楼:  
上传一个非常好的资料
超级棒
Zigbee技术在无线传感器网络中的应用.pdf (279.5 KB)

先把贴发出去, 在慢慢编辑。
首先讲讲Zigbee
       Zigbee是IEEE 802.15.4协议的代名词。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、自组织、低功耗、低数据速率、低成本。主要适合用于自动控制和远程控制领域,可以嵌入各种设备。简而言之,ZigBee就是一种便宜的,低功耗的近距离无线组网通讯技术。
       具体了解大家可以看百度百科:http://baike.baidu.com/view/117166.htm
       刚混进一家新公司(大概7月25号),试手了一个星期以后就接到这个玩意,之前都没听说过。不过古人说:不懂才有挑战性(不知道是不是古人说的)。所以拿着资料就看咯。
       废话不多说。根据大叔号召,开始写写我做了这么久得笔记。虽然这笔记芯片不是以M0的,不过如果大家需要, 我会把它转成M0的
硬件介绍:
      板子没什么资源,Zigbee芯片是CC2420,控制芯片是ATmega128(大家需要的话我可以考虑转成Nuc1xx的)。加上一个flash和外围电路就没了。说以说硬件很简单。
软件介绍:
      芯片初始化:
       1.打开VREG   
       2.使能复位
       3.关闭全局中断
       4.配置寄存器
       5.等待晶振起震
       代码部分我最后会贴出去。
       初始化完成,就可以进行接收和发送了。



继续编辑(2010年8月10日13点01分):先把资料弄上来





802.15.4协议规范(物理层).pdf (336.55 KB) CC2420(中文).pdf (1.16 MB)

引脚在接受时候的状态.jpg (79.46 KB )

引脚在接受时候的状态.jpg

CC2420.pdf

1.03 MB

相关帖子

沙发
kyzb001|  楼主 | 2011-8-9 16:58 | 只看该作者
本帖最后由 kyzb001 于 2011-8-9 17:00 编辑

2L贴代码
芯片初始化代码
//打开VREG 使能复位 关闭全局中断 配置寄存器 等待晶振起震
void CC2420Init()
{
unsigned char cc2420Mes[]="cc2420 init is success\n\0";
unsigned char i;

// Make sure that the voltage regulator is on, and that the reset pin is inactive
SET_VREG_ACTIVE(); //open cc2420 power
Delay5ms(2);
SET_RESET_ACTIVE(); //enable reset
Delay5ms(10);
SET_RESET_INACTIVE(); //disable reset
Delay5ms(2);

// Turn off all interrupts while we're accessing the CC2420 registers
DISABLE_GLOBAL_INT();// close all int

// Register modifications
WriteStrobeReg_spi(CC2420_SXOSCON); //turn on xtal
WriteConfigReg_spi(CC2420_MDMCTRL0, 0x0AE2); // Turn off automatic packet acknowledgment
WriteConfigReg_spi(CC2420_MDMCTRL1, 0x0500); // Set the correlation threshold = 20
WriteConfigReg_spi(CC2420_IOCFG0, 0x007F); // Set the FIFOP threshold to maximum
WriteConfigReg_spi(CC2420_SECCTRL0, 0x01C4); // Turn off "Security enable"

// Wait for the crystal oscillator to become stable
do
{
i = WriteStrobeReg_spi(CC2420_SXOSCON); // 开启晶体振荡
DelayXms(100);
}
while((i&0x40)==0);
Printf(cc2420Mes,23);
}

使用特权

评论回复
板凳
kyzb001|  楼主 | 2011-8-9 17:00 | 只看该作者
本帖最后由 kyzb001 于 2011-8-9 17:02 编辑

发送模式
发送:
       发送主要是按照IEEE802.15.4协议规范发送格式

       发送分三种,信标发送,数据发送和确认帧发送
       数据格式分别如下。



      按照数据格式打包发送数据。我们只需设置PHR+PSDU。



使用特权

评论回复
地板
kyzb001|  楼主 | 2011-8-9 17:03 | 只看该作者
发送代码
/******************************************************************************
* @fn cc2420Send
*
* @brief
* 设置Address函数
*
* Parameters:
*
* @param uint ShortAddress
*
* @return void
*
******************************************************************************/
void SetAddress(unsigned char Number,unsigned int PanID,unsigned int DestAddress,unsigned int MyAddress)
{
rfSettings.txSeqNumber=Number;
rfSettings.panId=PanID;
rfSettings.destAddr=DestAddress;
rfSettings.myAddr=MyAddress;
}
/******************************************************************************
* @fn cc2420Send
*
* @brief
* 发送数据
*
* Parameters:
*
* @param uint ShortAddress
*
* @return void
*
******************************************************************************/

void cc2420SendData(unsigned char ModeType)
{

unsigned char PackLenght,i;
unsigned int frameControlField;

// Wait until the transceiver is idle
while (FIFOP_IN|| SFD_IN);

// Turn off global interrupts to avoid interference on the SPI interface
DISABLE_GLOBAL_INT();

WriteStrobeReg_spi(CC2420_SFLUSHTX);
WriteStrobeReg_spi(CC2420_SFLUSHTX);

PackLenght=0;

switch(ModeType)
{
case 0x01:
{
DataTxFIFO[PackLenght++]=PackLenght; //第一字节为帧长度,不包括长度域本身的字节,但包含帧校验序列2字节

//帧控制域,无安全,确认要求,数据帧,包含16位的目标地址,源地址,目标PAN标识符,源PAN标识符

frameControlField = CC2420_FCF_FRAMETYPE_DATA;
frameControlField |= 0 ? CC2420_FCF_ACK_REQUEST : CC2420_FCF_NO_ACK_REQUEST;
frameControlField |= CC2420_FCF_INTRAPAN;
frameControlField |= CC2420_FCF_DESTADDR_16BIT;
frameControlField |= CC2420_FCF_SOURCEADDR_16BIT;

DataTxFIFO[PackLenght++]=frameControlField >> 8; ; //高字节
DataTxFIFO[PackLenght++]=frameControlField & 0x00FF; //低字节

DataTxFIFO[PackLenght++]=rfSettings.txSeqNumber;; //Sequence number

DataTxFIFO[PackLenght++]=rfSettings.panId >> 8;
DataTxFIFO[PackLenght++]=rfSettings.panId & 0x00FF; //目的PAN标识符

DataTxFIFO[PackLenght++]=rfSettings.destAddr >> 8;
DataTxFIFO[PackLenght++]=rfSettings.destAddr & 0x00FF; //目的地址

DataTxFIFO[PackLenght++]=rfSettings.myAddr >> 8;
DataTxFIFO[PackLenght++]=rfSettings.myAddr & 0x00FF; //源PAN标识符

for (; PackLenght < 20 ;PackLenght++) //有效负载
{
DataTxFIFO[PackLenght]=20;
}

PackLenght++; //CRC

DataTxFIFO[0]=PackLenght;
break;
}

case 0x02:
{
DataTxFIFO[PackLenght++]=PackLenght; //第一字节为帧长度,不包括长度域本身的字节,但包含帧校验序列2字节

//帧控制域,无安全,确认要求,数据帧,包含16位的目标地址,源地址,目标PAN标识符,源PAN标识符

frameControlField = CC2420_FCF_FRAMETYPE_DATA;
frameControlField |= 0 ? CC2420_FCF_ACK_REQUEST : CC2420_FCF_NO_ACK_REQUEST;
frameControlField |= CC2420_FCF_INTRAPAN;
frameControlField |= CC2420_FCF_DESTADDR_16BIT;
frameControlField |= CC2420_FCF_SOURCEADDR_64BIT;

DataTxFIFO[PackLenght++]=frameControlField >> 8; ; //高字节
DataTxFIFO[PackLenght++]=frameControlField & 0x00FF; //低字节

DataTxFIFO[PackLenght++]=rfSettings.txSeqNumber;; //Sequence number

DataTxFIFO[PackLenght++]=rfSettings.panId >> 8;
DataTxFIFO[PackLenght++]=rfSettings.panId & 0x00FF; //目的PAN标识符

DataTxFIFO[PackLenght++]=rfSettings.destAddr >> 8;
DataTxFIFO[PackLenght++]=rfSettings.destAddr & 0x00FF; //目的地址

for( ; PackLenght < PackLenght + 8 ;PackLenght++) // Source address
{
DataTxFIFO[PackLenght] = rfSettings.myIEEE[PackLenght-8];
}

for (; PackLenght < 20 ;PackLenght++) //有效负载
{
DataTxFIFO[PackLenght]=20;
}

PackLenght++; //CRC

DataTxFIFO[0]=PackLenght;
break;
}
case 0x03:
{
DataTxFIFO[PackLenght++]=PackLenght; //第一字节为帧长度,不包括长度域本身的字节,但包含帧校验序列2字节

//帧控制域,无安全,确认要求,数据帧,包含16位的目标地址,源地址,目标PAN标识符,源PAN标识符

frameControlField = CC2420_FCF_FRAMETYPE_DATA;
frameControlField |= 1 ? CC2420_FCF_ACK_REQUEST : CC2420_FCF_NO_ACK_REQUEST;
frameControlField |= CC2420_FCF_INTRAPAN;
frameControlField |= CC2420_FCF_DESTADDR_64BIT;
frameControlField |= CC2420_FCF_SOURCEADDR_16BIT;

DataTxFIFO[PackLenght++]=frameControlField >> 8; ; //高字节
DataTxFIFO[PackLenght++]=frameControlField & 0x00FF; //低字节

DataTxFIFO[PackLenght++]=rfSettings.txSeqNumber;; //Sequence number

DataTxFIFO[PackLenght++]=rfSettings.panId >> 8;
DataTxFIFO[PackLenght++]=rfSettings.panId & 0x00FF; //目的PAN标识符

for( ; PackLenght < PackLenght + 8 ;PackLenght++) //目的地址
{
DataTxFIFO[PackLenght] = rfSettings.destIEEE[PackLenght-8];
}

DataTxFIFO[PackLenght++]=rfSettings.myAddr >> 8;
DataTxFIFO[PackLenght++]=rfSettings.myAddr & 0x00FF; //源PAN标识符

for (; PackLenght < 20 ;PackLenght++) //有效负载
{
DataTxFIFO[PackLenght]=20;
}

PackLenght++; //CRC

DataTxFIFO[0]=PackLenght;
break;
}
}
Write_TXFIFO(DataTxFIFO,PackLenght);

WriteStrobeReg_spi(CC2420_STXON);

while (!SFD_IN);
while (SFD_IN);

// Turn interrupts back on
ENABLE_GLOBAL_INT();


}

使用特权

评论回复
5
kyzb001|  楼主 | 2011-8-9 17:04 | 只看该作者
实在是不知道怎么写笔记阿!郁闷+郁闷。现农到这里。

使用特权

评论回复
6
aihe| | 2011-8-10 06:26 | 只看该作者
顶一下楼主
正要研究这个东西呢

使用特权

评论回复
7
hotpower| | 2011-8-10 06:47 | 只看该作者
俺借用吴旭光教授的一对模块玩过一周时间,协议晕。

在家试了穿墙能力一般,感觉不如nrf905简单。

可能它组网方便吧。

使用特权

评论回复
8
kyzb001|  楼主 | 2011-8-10 12:50 | 只看该作者
貌似组网很方便。慢慢搞,总有一天搞死他。

使用特权

评论回复
9
cecwxf| | 2011-8-10 13:35 | 只看该作者
丫  关注楼主   今天开始弄老师的M0

使用特权

评论回复
10
sytu_chyq| | 2011-8-10 14:01 | 只看该作者
mark

使用特权

评论回复
11
kyzb001|  楼主 | 2011-8-10 16:30 | 只看该作者
上传一个非常好的资料
超级棒
Zigbee技术在无线传感器网络中的应用.pdf (279.5 KB)

使用特权

评论回复
12
WJWQH| | 2011-9-17 18:05 | 只看该作者
Mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Is this my life

15

主题

624

帖子

1

粉丝