zigbee学习- radio.c

本文档详细介绍了无线电初始化函数radioInit和数据发送、接收函数radioSend、radioReceive的实现,涉及到cc2430芯片,SPP协议及数据处理流程。通过对射频系统配置、数据包构造及重传机制的描述,揭示了zigbee通信中的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /******************************************************************************
Filename:     radio.c
Target:       cc2430
Revised:      16/12-2005
Revision:     1.0
******************************************************************************/

#include "cul.h"

extern volatile BYTE sppRxStatus;
extern volatile BYTE sppTxStatus;
__no_init SPP_RX_STRUCT rxData @ "PM0_XDATA";
__no_init SPP_TX_STRUCT txData @ "PM0_XDATA";


//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
void radioInit(UINT32 frequency, BYTE localAddress)  //函數來初始化射頻系統,設置通信頻率和本節點位址
{
   sppInit(frequency,localAddress);

   return;
}


//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//初始化射频系统完成后即可函數來發送資料了
//-----------------------------------------------------------------------------
BOOL radioSend(BYTE* transmitData, WORD dataLength, BYTE remoteAddress, BYTE doAck)
{
   WORD sent = 0;      //发送字节数
   BOOL status = TRUE; //状态标志位
   WORD remaining;     //剩余字节
   BYTE retries;
   BYTE res;         
 
   txData.destAddress = remoteAddress;  //数据目的地址赋值
   txData.flags = doAck;                //标志位赋值


   while((sent < dataLength) && (status == TRUE)) // 如果数据长度大于0(有数据
   {
      retries = ACK_RETRIES;                //重试3次  #define ACK_RETRIES   3
      txData.payload = transmitData + sent;  //添加数据量
      remaining = dataLength-sent;           //剩余字节计算

      if(remaining > SPP_MAX_PAYLOAD_LENGTH) //#define SPP_MAX_PAYLOAD_LENGTH  122
      {
        txData.payloadLength = SPP_MAX_PAYLOAD_LENGTH;
        sent += SPP_MAX_PAYLOAD_LENGTH;
      }
      else
      {
         txData.payloadLength = dataLength;
         sent += dataLength;
      }

      while(retries)             //重发数据
      {
         res = sppSend(&txData); //重新发送数据,SPP(Simple Packet Protocol)
         if(res == CHANNEL_BUSY) // #define CHANNEL_BUSY   0x04
         {
            halWait(10);         //等待
            retries--;           //次数减少
            if(retries == 0)    
            {
               status = FALSE;   //所有重试进行完之后仍然忙,置状态为堵塞
            }
         }
         else
         {
            retries = 0;         //如果线路不忙则停止重试直接发送
         }
      }

      while(sppTxStatus == TX_IN_PROGRESS);// #define TX_IN_PROGRESS   0x80

      if(sppTxStatus == DEST_UNREACHABLE)  // #define DEST_UNREACHABLE 0x20
      {
         status = FALSE;
      }
   }

   return status;   //返回状态值
}
//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
// 初始化射频系统完成后即可函數來接收資料了,接收数据包
//功能介绍:这个函数使能接收 128字节,包括头和尾。接收数据通过 DMA传输到 pReceiveData。
//          DMA装备同时接收开启。接收数据将触发 DMA,当所有的数据包接收并且移走,DMA产
//         生一个中断同时运行以前定义的函数 rxCallBack。
//-----------------------------------------------------------------------------
BOOL radioReceive(BYTE** receiveData, BYTE* length, WORD timeout, BYTE* sender)
{
   BOOL status = TRUE;          //状态字      
   BOOL continueWaiting = TRUE; //是否连续等待状态字
   BOOL useTimeout = FALSE;     //是否使用超时状态字

   if(timeout)                  //接收超时
   {
     sppReceive(&rxData);       //接收数据
   }
   

   while((sppRxStatus != RX_COMPLETE) && (continueWaiting)) // #define RX_COMPLETE 0x10
   {
      if(useTimeout)           //使用超时状态字
      {
         halWait(0x01);        //等待
         timeout--;            //自减
         if(timeout == 0)      //不超时 
         {
            continueWaiting = FALSE; //停止继续接受
            status = FALSE;          //状态置0
            STOP_RADIO();            //停
         }              
      }     //                   
   }                                

   if(status == TRUE)                //状态正确
   {
      *receiveData = rxData.payload;; //接收数据          //
      *length = rxData.payloadLength; //接收数据长度      //
      *sender = rxData.srcAddress;    //接受数据的源地址  //
   }
   return status; //返回状态
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值