分享

Zigbee 点对点通信

 乘舟泛海赏雨 2016-10-09

搞了整整一天,参考了很多大侠的学习记录,才完成这个点对点通信实验,结果却是因为我串口TX\RX接错引脚了,所以串口才一直没有显示,还是自己太马虎,下面记录下我的学习过程:

1、实验设备:

  CC2430 模块两块,一个做RX模块,一个做TX模块

2、实现功能:

  TX模块向RX模块发送固定字符串“Hello World”,RX模块与PC机串口相连,收到数据后,送到PC机上显示。

3、实验中有关射频收发的重要函数:

    1)射频初始化函数

       BOOL sppInit(UINT32 frequency, BYTE address)

      功能描述:初始化简单的数据包装协议Simple Packet Protocol (SPP),从 DMA 管理器申请两个 DMA 通道,用于分别从 Rx FIFO Tx FIFO 传输数据。定时器4 管理器同样被设置,这个单元用于在数据包发送后接收器在一定时间内没有返回应答时产生中断。无线部分配置为发送,工作在特定的频率,在发送时自动计算和插入和检查CRC 值。

     参数描述:

     UINT32 frequencyRF 的频率(kHz.);

     BYTE address:节点地址

     返回:配置成功返回TRUE,失败返回FALSE

   2)发送数据包函数

     BYTE sppSend(SPP_TX_STRUCT* pPacketPointer)

     功能描述:发送length 字节的数据(最多122),标志,目的地址,源地址在Tx DMA 通道传送有效载荷到Tx FIFO 前插入,如果期望应当,设置相应的标志。

    参数:SPP_TX_STRUCT* pPacketPointer:发送数据包头指针

    返回:发送成功返回TRUE,失败返回FALSE

   3)接收数据函数

     void sppReceive(SPP_RX_STRUCT *pReceiveData)

     功能描述:这个函数使能接收128 字节,包括头和尾。接收数据通过DMA 传输到pReceiveDataDMA 装备同时接收开启。接收数据将触发DMA,当所有的数据包接收并且移走,DMA 产生一个中断同时运行以前定义的函数rxCallBack

     参数:SPP_TX_STRUCT* pPacketPointer:接收数据包头指针

     返回:无

   4)射频初始化应用函数

      void initRfTest(void)

    {

  UINT32 frequency = 2405000;

      INIT_GLED();

      INIT_YLED();

      radioInit(frequency, myAddr);

     }

 这个函数实际上还是通过radioInit(frequency, myAddr调用了sppInit(frequency,localAddress)初始化了射频。

  5)发送状态函数

     void contionuousMode(void)

   {

      BOOL res;

      BYTE sendBuffer[] = "Hello World";   //要发送的固定字符串

      while(1)

     {

       GLED = LED_OFF;

       YLED = LED_ON;

       res = radioSend(sendBuffer, sizeof(sendBuffer), remoteAddr, DO_NOT_ACK ); 

//radioSend函数中调用了sppSend 函数     

       halWait(200);

       YLED = LED_OFF;

       halWait(200);

      if(res == TRUE)

     {

       GLED = LED_ON;

       halWait(200);

     }

     else

    {

     GLED = LED_OFF;

     halWait(200);

    }

  }

}

  6)接收数据状态函数

void receiveMode(void)

{

   BYTE* receiveBuffer;

   BYTE length;

   BYTE res;

   BYTE sender;

   while(1)

   {

      YLED = LED_ON;      

      res = radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender);  

 //radioReceive函数中调用了sppReceive函数

      YLED = LED_OFF;    

      if(res == TRUE)      //res为是否收到数据包状态字

      {

         GLED = LED_ON;   

         halWait(200);

         UartTX_Send_String(receiveBuffer,length);  //实现PC机串口显示

      }

      else

      {

         GLED = LED_OFF;

         halWait(200);

      }

      GLED = LED_OFF;

   }

}

4、实现RX模块与串口通信需要添加修改的几个函数

  串口初始化函数

void initUART(void)

{

   // Setup for UART0

   IO_PER_LOC_UART0_AT_PORT0_PIN2345();

   SET_MAIN_CLOCK_SOURCE(CRYSTAL);

   UART_SETUP(0, 57600, HIGH_STOP);   

   UTX0IF = 0;     //UART0 TX中断标志初始置位0   TX

}

  串口发送函数

void UartTX_Send_String(BYTE *Data,int len)

{

  int j;

  for(j=0;j

  {

    U0DBUF = *Data++;

    while(UTX0IF == 0);

    UTX0IF = 0;

  }

}

5、烧写64位物理地址

  刚开始不知道为啥还要烧写位物理地址,也不知道该怎么填写自己设备的物理地址,后来看了程序代码中有这么一段:

void rf_test_main(void)

 {

   INT_GLOBAL_ENABLE(INT_ON);

   #ifdef RX

   {

      myAddr = ADDRESS_0;      //0x01    接收模块地址0x01

      remoteAddr = ADDRESS_1;  //0x02    远程模块地址0x02

      initRfTest();           //射频初始化应用函数

      receiveMode();          //接收状态函数

   }

   #else

   {

      myAddr = ADDRESS_1;    //0x02   发送模块地址0x02

      remoteAddr = ADDRESS_0;//0X01   远程模块地址0x01

      initRfTest();

      contionuousMode();    //发送状态函数

   }

   #endif

}

于是按照烧写物理地址的步骤,将RX模块的物理地址写为00 00 00 00 00 00 00 01,将TX模块的物理地址写为00 00 00 00 00 00 00 02

6、下载运行后结果

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多