Zigbee实战

来源:互联网 发布:淘宝违法判刑大全 编辑:程序博客网 时间:2024/06/05 04:35
第一讲
1.Zigbee是什么?
     zigbee是无线设备之间的一种通信方式。zigbee、zigbee通信方式、zigbee协议,说的同一个东西。cc2530是一种zigbee无线模块,在无线局域网中是一个无线节点。zigbee是用来构建无线局域网的。
2.zigbee和无线传感器网络之间的关系?
     如果一个无线局域网用于传感器的数据收集和监控,那么这个网络就叫无线传感器网络。无线传感器网络是无线局域网的具体应用。
3.zigbee优点:可以组建大规模网络;功耗低,(Tl炒菜530 正常工作电流8mA,最低到几个uA)
     缺点:传输数据少。
4.手机不可以直接与zigbee模块进行无线通信的。实现都是通过计算机上的程序来转的,计算机相当于一个串口转wifi的工具。
5.cc2530是TI公司推出的支持zigbee底层协议的一种芯片
6.iar软件
     每一个工程必须在一个工作空间下边,一个工作空间可以有多个工程
第二讲
1。控制所有的口子输入输出
     普通IO口,还是片上外设通过P0SEL、P1SEL、P2SEL设置。让P1_0处于普通IO状态,非片上外设模式,P!SEL的第0位  位0。
    决定P1_0输入出入状态通过P0DIR、P1DIR、P2DIR设置。让P1_0输入出入状态,而非输入状态,找到P1DIR的第0位 让他为1
2.输入配置
     让pP0_6处于普通IO口,非片上外设模式
     让P0_6处于输出状态,非输出状态
     让P0_6处于上拉,下拉或者三态中的一种状态
     
if(1 == P0_6)
{//检测到是高电平

}else
{//检测到P0_6外部是低电平
}
3.P0IINP、P1IINP、P2IINP控制三态。为0表示上拉或是下拉。为1是三态。是上拉还是下拉由P2INP的高三位决定

//配置P0_4的输入状态
  P0SEL &= 0xEF;
  P0DIR &= 0x10;

  //配置P0_6的状态
  P0SEL &= 0xBF;//1011 1111
  P0DIR |= 0xBF;

  P0INP &= 0xBF;//让P0_6处于上下拉的模式
  P2INP &= 0xDF;// 1101 1111 让P0组处于上拉模式
  //以上默认是0

  while(1)
  {
    if(1 == P0_6)
    {//检测到是高电平

      P0_4 = 0;
    }
    else
    {//检测到P0_6外部是低电平
    }
  }
第四讲
1.此次530在正常运行的时候需要一个高频的时钟信号和一个低频的始终信号。高频时钟信号主要供给cpu保证程序的运行;低频时钟信号主要供给看门狗,睡眠,定时器等片上外设。
2.高频时钟的来源有两个,自带一个16MRC电路,也可以外接一个32M石英晶振;低频时钟也有两个来源,内部32KRC电路,外接一个32.768K石英晶振。
3.炒菜530默认上电的时候,内部默认的两个RC电路,作为高频和低频的时钟来源。
4.如果在用串口,特别是wifi通信的时候,必须要用32M的石英晶振作为高频时钟的来源。
5.高频时钟源的特点: 可以同时起震;低频,某一个时刻只可以有一个起震。
6.高频时钟源切换
     1.让SLEEPCMD的第2位为0
     2.SLEEPSTA寄存器的第6位为1表示32M时钟源稳定
     3.超过63微秒延时
     4.把寄存器deCLKCONCMD的低3位设置为000,表示不分频输出
     5.把寄存器CLKCONCMD的第6位清零,设置32M作为系统主时钟
     6.CLKCONSTA判断这个时候时钟频率,如果CLKCONSTA的第6位为0,表示当前应用的时钟是32M时钟。
7。cc2530有两个串口
8.串口配置流程
     1.指定串口外置
     2.相应IO配置成片上外设模式
     3.8个数据位,1个停止位,无流控,无校验确立
     4.波特率
     5.开cpu中断,对应串口接收中断
//串口发送信息
#include <iocc2530.h>

//初始化32M时钟,使其成为系统时钟
void Cfg32M()
{
  SLEEPCMD &= 0xFB;//让两个晶振起震
  while(0 == (SLEEPSTA & 0x40));
  CLKCONCMD &= 0xFB;//1111 1000不分频输出

  CLKCONCMD &= 0xBF;//1011 1111让32M作为时钟供给cpu
  while(1 == (CLKCONSTA & 0x40));//如果32M时钟供给cpu工作,继续往下执行
  SLEEPCMD |= 0x40;//0000 0100
}
//初始化串口
void UartCfg()
{//串口0的备用位置1 配置成波特率115200
  PERCFG &= 0xFE;//1111 1110 选中串口0的备用位置1,P0_2 P0_3
  P0SEL |= 0x0C;//P0_2 P0_3  0000 1100 要把他们设置为片上外设模式

  U0CSR &= 0xC0;

  //波特率
  U0GCR = 11;
  U0BAUD = 216;

  //打开两个中断
  URX0IE = 1;//串口0接收中断打开
  EA = 1;

}

//中断函数
#pragma vector=URX0_VECTOR
__interrupt void sdfs(void)
{
  char ch;
  URX0IF = 0;//清中断
  ch = U0DBUF;//从接收寄存器取字节,存入ch

  U0DBUF = ch;//把ch中的值,赋给发送寄存器

  while(UTX0IF = 0);//如果为0就在这里
  UTX0IF = 0;//发送完成,修改为0
}

void main()
{
  Cfg32M();
  UartCfg();
  while(1);
}

第六讲
1.Zigbee无线通信,需要高频载波来提供发射效率,zigbee模块之间要可以正常通信,必须把接收频率和发射模块的频率设置一致。
2.zugbee有27个载波可以进行通信,载波叫做信道(无线通信的通道),这些载波的频率落在某些频率区段,这些区段叫做频段。
     2.4G频段 16个信道在这个频段
     915M频段 896M频段  11个信道
     TI的所有支持zigbee底层协议的芯片只能在2.4G频段的16个信道里进行通信
     11信道     2045M---->信道与频段的对应关系,每变化5个频段,信道变1
     12信道     2410M
     13信道     2415M
3.网络地址
     在zigbee无线局域网里,每一个模块都有一个唯一的2字节的地址,这个地址叫做网络地址
4.PANID
     这个是2字节编码,用来区别不同的zigbee无线局域网,叫做个域网ID。
5.zigbee发送数据模块
#include <iocc2530.h>
char SendPacket[] = {0x0C, 0x61, 0x88, 0x00, 0x07, 0x20, 0xEF, 0xBF, 0x20, 0x50, 1};
/*
第一个字节:表示从第一个之后还有12个字节要发送,其中有两个是硬件默认追加的校验码
第五六个字节:表示PANID
第七八个字节:是接收模块的网络地址 0xBEEF
第九十个字节:是发送设备的网络地址 ox2050
第十一个字节:是发送的数据
第十二三个字节:是CRC码,校验码。硬件自动追加
*/

void Delay()
{
  int y, x;
  for(y = 1000; y > 0; y--)
    for(x = 30; x > 0; x--);
}

void Init32M()
{
  SLEEPCMD &= 0xFB; //1111 1011开启两个高频时钟
  while(0 == (SLEEPSTA & 0x40));//0100 0000 等待32M时钟稳定
  Delay();
  CLKCONCMD &= 0xF8; // 1111 1000 不分频输出
  CLKCONCMD &= 0xBF; // 1011 1111 设置32M时钟为主时钟
  while(CLKCONSTA & 0x40); //0100 0000 瞪大32M时钟成功成为当前主时钟
}

void KeysIntCfg()
{
  IEN2 |= 0x10;//开P1IE组中断
  P1IEN |= 0x02;//开Key3组内中断
  PICTL |= 0x02;//设置P1_1为下降沿
  EA = 1; //开中断
}

//射频初始化
void halRfInit()
{

  EA = 0;
  FRMCTRL0 |= 0x60;
  //设置寄存器
  TXFILTCFG = 0x09;
  AGCCTRL1 = 0x15;
  FSCAL1 = 0x00;

  RFIRQM0 |= 0x40;//打开射频接收中断

  IEN2 |= 0x01;//打开射频通用中断

  FREQCTRL = (11 + (25-11)*5);//指定25信道,设置载波为2475M

  PAN_ID0 = 0x07;
  PAN_ID1 = 0x20;//设置个域网ID  0x2007

  RFST = 0xEC;//清空接收缓冲区
  RFST = 0xE3;//开启接收使能,让其可以接收
  EA = 1;
}

void RFSend(char *pstr, char len)
{
  char i;
  RFST = 0xEC;//确保接收是空的
  RFST = 0xE3;//清空接收标志位
  while(FSMSTAT1 & 0x22);//等待射频发送准备好
  RFST = 0xEE;//确保发送队列是空的
  RFIRQF1 &= -0x02;
//为发送数据做准备
  for(i = 0; i < len; i++)
  {
    RFD = pstr[i];//把发送数据存到RFD
  }
  RFST = 0xE9;//数据发送出去
  while(!(RFIRQF1 & 0x02));
  RFIRQF1 = -0x02;//清空数据标志位
}

void main()
{
  //LS164_Cfg();//数码管初始化

  P1DIR |= 0x01;
  P1_0 ^= 1;//灯的状态取反

  Init32M();//切换到32M
  KeysIntCfg();//按钮中断初始化
  halRfInit();//射频通信的初始化,配置工作信道和PANID
  SHORT_ADDR0 = 0x50;
  SHORT_ADDR1 = 0x20;//设置本模块网络地址 0x2050

  //LS164_BYTE(1);
  while(1);
}

#pragma vector = P1INT_VECTOR
__interrupt void Keys_ISR()
{
  if(0x20 & P1IFG)
  {
    Delay();
    if(0 == P1_1)
    {
      P1DIR |= 0x01;
      P1_0 ^= 1;//灯的状态取反
      RFSend(SendPacket, 11);
    }
  }
  P1IFG = 0;
  P1IF = 0;
}

#pragma vector = RF_VECTOR
__interrupt void RF_IRQ(void)
{//射频中断函数
  EA = 0;
  if(RFIRQF0 & 0x40)
  {
    RFIRQF0 &= -0x40;
  }
  S1CON = 0;
  RFST = 0xEC;
  RFST = 0xE3;
  EA = 1;
}
6.zigbee接收数据模块
#include <iocc2530.h>

void Delay()
{
  int y, x;
  for(y = 1000; y > 0; y--)
    for(x = 30; x > 0; x--);
}

void Init32M()
{
  SLEEPCMD &= 0xFB; //1111 1011开启两个高频时钟
  while(0 == (SLEEPSTA & 0x40));//0100 0000 等待32M时钟稳定
  Delay();
  CLKCONCMD &= 0xF8; // 1111 1000 不分频输出
  CLKCONCMD &= 0xBF; // 1011 1111 设置32M时钟为主时钟
  while(CLKCONSTA & 0x40); //0100 0000 瞪大32M时钟成功成为当前主时钟
}

//射频初始化
void halRfInit()
{

  EA = 0;
  FRMCTRL0 |= 0x60;
  //设置寄存器
  TXFILTCFG = 0x09;
  AGCCTRL1 = 0x15;
  FSCAL1 = 0x00;

  RFIRQM0 |= 0x40;//打开射频接收中断

  IEN2 |= 0x01;//打开射频通用中断

  FREQCTRL = (11 + (25-11)*5);//指定25信道,设置载波为2475M

  PAN_ID0 = 0x07;
  PAN_ID1 = 0x20;//设置个域网ID  0x2007,要和发送方一样

  RFST = 0xEC;
  RFST = 0xE3;//开启接收使能,让其可以接收
  EA = 1;

}


void RevRFProc()
{
  static char len;
  static char ch;

  len = 0;
  ch = 0;
  RFIRQM0 &= -0x40;
  IEN2 &= -0x01;
  EA = 1;

  len = RFD;
  while(len>0)
  {
    ch = RFD;//ch 保存数据
    if(3 == len)//读到倒数第三个字节
    {//读取到发送的字符串,进行操作

    }
    len--;
  }

  EA = 0;
  RFIRQM0 |= 0x40;
  IEN2 |= 0x10;
}

void main()
{
  //LS164_Cfg();
  Init32M();
  halRfInit();

  SHORT_ADDR0 = 0xEF;
  SHORT_ADDR1 = 0xBE;//设置本模块的网络地址  0xBEEF

  //LS164_BYTE(2);
  while(1);
}


#pragma vector = RF_VECTOR
__interrupt void RF_IRQ(void)
{//射频中断函数
  EA = 0;
  if(RFIRQF0 & 0x40)
  {
    RevRFProc();

    RFIRQF0 &= -0x40;
  }
  S1CON = 0;
  RFST = 0xEC;
  RFST = 0xE3;
  EA = 1;
}

7.抓包工具USBDongle-----可以检测一个模块发送出去什么东西。信道要配置一样
0 0
原创粉丝点击