亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? spp.c

?? zigbee無線網絡源碼包
?? C
?? 第 1 頁 / 共 2 頁
字號:
/******************************************************************************
Filename:     spp.c
Target:       cc2430
Revised:      16/12-2005
Revision:     1.0
******************************************************************************/
#include <string.h>
#include "cul.h"
#include <stdio.h>

// protos
void rxCallBack(void);
void ackTimeout(void);
BOOL ackReceived(BYTE sourceAddress);
void sendAck(SPP_RX_STRUCT* receivedPacket);
void waitForAck(void);


static DMA_DESC* dmaTx;          // pointer to the DMA descriptor for transmit.
static DMA_DESC* dmaRx;          // pointer to the DMA descriptor for receive.
static BYTE dmaNumberTx = 0;     // number indicating which DMA channel is used for transmit.
static BYTE dmaNumberRx = 0;     // number indicating which DMA channel is used for receive.
static BYTE myAddress;
volatile BYTE sppRxStatus = 0;
volatile BYTE  sppTxStatus = 0;
static BYTE pAckBuffer[7];
static SPP_TX_STRUCT* pAckData;
static volatile UINT8 retransmissionCounter;
static UINT8 ackTimerNumber;
static FUNCTION* rxCallBackFunction;


//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
//設置用戶指定的回調函數,在接收到一個正確的數據包死運行
//通過這個函數可以用程序來改變正確接收數據包后的動作。
//callBackFunction 用戶指定的函數
//rxCallBackFunction 指向 FUNCTION 的全局變量指針變量
void sppSetRxCallBackFunction(FUNCTION* callBackFunction)
{
   rxCallBackFunction = callBackFunction;
} // Ends sppSetRxCallBackFunction()


//發送應答
//SPP_RX_STRUCT 定義在 cul.h
//SFR(  RFD       ,  0xD9  )   //  RF Data 定義在ioCC2430.h
// myAddress 全局變量
// ACK cul.h 中宏定義
// ISTXON hal.h 中宏定義
// srcAddress 源地址
void sendAck(SPP_RX_STRUCT* receivedPacket)
{
   RFD = SPP_HEADER_AND_FOOTER_LENGTH + SPP_ACK_LENGTH;
   RFD = receivedPacket->srcAddress;
   RFD = myAddress;
   RFD = ACK;
   RFD = 0;
   RFIF &= ~IRQ_TXDONE;
   ISTXON;
   while(!(RFIF & IRQ_TXDONE));

   return;
}

//------------------------------------------------------------------------------------------------------
// void rxCallBack(...)
//
//  Description:
//      This function is called by the interrupt routine when the Rx DMA channel
//      finishes the data transfer. The received packet's destination address
//      is checked. If not addressed to this node, or if the CRC value is not
//      correct, the packet is erased. An ACK is sent if the packet
//      tells to. A user defined callback function may is run if set (set
//      with setRxCallBackFunction())
//在Rx DAM  通道完成數據傳輸后由中斷程序調用。檢查接收包掉的目的地址,如果地址不是
//這個節點的,或CRC值是錯誤的,包裝將被擦除。如果數據包被告知將發送一個應答。一個用戶定義的回調函數可以運行如果定義了的話。
//  Arguments:
//      void
//
//  Return value:
//      void
//-----------------------------------------------------------------------------
//#define  RXFIFOCNT   XREG( 0xDF53 )  /*  Receive FIFO Count 定義在ioCC2430.h
// ISFLUSHRX 清 RX FIFO 命令濾波. hal.h 命令濾波中定義
// GET_DMA_DEST(dmaRx) hal.h 中的宏定義,取得一個 DMA 通道的目標地址
// static DMA_DESC* dmaRx 指向設備 DMA 描述符的指針,全局變量.DMA_DESC DMA 配置結構。
//
void rxCallBack(void)
{
   SPP_RX_STRUCT __xdata* receivedPacket;
   BYTE res = FALSE;

   if(RXFIFOCNT > 0)
   {
      ISFLUSHRX;
      ISFLUSHRX;
   }

   // Investigating the received packet.
   // Checking the destination address and that the CRC is OK.
   // The message is ACK'ed if it tells to.
   receivedPacket = (SPP_RX_STRUCT __xdata*) GET_DMA_DEST(dmaRx);
   receivedPacket->payloadLength = receivedPacket->payloadLength-SPP_HEADER_AND_FOOTER_LENGTH; //減去頭和尾長度

   if((receivedPacket->destAddress == myAddress) || (receivedPacket->destAddress == BROADCAST_ADDRESS)) //包目的地是本節點地址或廣播地址
   {
      if(receivedPacket->payload[receivedPacket->payloadLength+1] & 0x80)	//CRC正確
      {
         if(receivedPacket->flags == ACK)	//收到了應答包
         {
            res = ackReceived(receivedPacket->srcAddress);
         }
         else		//收到普通數據包
         {
            sppRxStatus = PACKET_RECEIVED;		//ssp接收狀態-收到數據包
            res = TRUE;
            if(receivedPacket->flags & DO_ACK)	//要求收到后發應答
            {
               sendAck(receivedPacket); 		//發應答
            }
            sppRxStatus = RX_COMPLETE;			//ssp接收狀態-接收完成
            if(rxCallBackFunction)
            {
               rxCallBackFunction();			//調用用戶指定回調函數
            }
         }
      }
   }

   if(res == FALSE)
   {
      ISFLUSHRX;	//清RX FIFO
      ISFLUSHRX;

      // rearming DMA channel
      DMA_ARM_CHANNEL(dmaNumberRx);
      RFIM |= IRQ_SFD;
      sppRxStatus = RX_WAIT;
   }
   return;
}   // ends rxCallBack




//-----------------------------------------------------------------------------
// void ackTimeout(...)
//
//  Description:
//      This function resends a packet if it is not ACK'ed by the recipient
//      within _ACK_TIMEOUT_ m-seconds. The message is resent _ACK_RETRIES_ times.
//      If the message remains un-ACK'ed, transmission is aborted and spp TX
//      status is set to DEST_UNREACHABLE.
//如果沒有收到接收器返回的應答,將重新發送數據包
//  Arguments:
//      void
//
//  Return value:
//      void
//-----------------------------------------------------------------------------
// TIMER4_RUN() 宏函數在 hal.h 中定義
// #define ACK_RETRIES  3 在 hal.h 中的宏定義常數
void ackTimeout(void){
   culTimer4AdmClear(ackTimerNumber);

   if(pAckData != NULL)
   {
      if(retransmissionCounter < ACK_RETRIES)	//重發次數小于嘗試接收應答次數
      {
         // Resending the message.
         pAckData->flags |= RETRANSMISSION;		//數據包標志-重發

         TIMER4_RUN(FALSE);						//停止定時器4

         sppSend(pAckData);						//發送數據包

         T4CNT = 0;								//定時器4計數清零
         TIMER4_RUN(TRUE);						//定時器4開始運行

         retransmissionCounter++;
      }
      else
      {
         // The packet has been resent too many times. Assuming that the node is unreacheble.
         pAckData = 0;
         retransmissionCounter = 0;
         sppTxStatus = DEST_UNREACHABLE;		//ssp發送狀態-不能完成
         RFIM &= ~IRQ_FIFOP;
      }
   }
   return;
} // ends ackTimeout




//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
// 初始化簡單的數據包裝協議Simple Packet Protocol (SPP)
// 從 DMA 管理器申請兩個 DMA 通道,用于分別從 Rx FIFO 和 Tx FIFO 傳輸數據。定時器4
// 管理器同樣被設置,這個單元用于在數據包發送后接收器在一定時間內沒有返回應答時
// 產生中斷。無線部分配置為發送,工作在特定的頻率,在發送時自動計算和插入和檢查CRC值。
//-----------------------------------------------------------------------------
BOOL sppInit(UINT32 frequency, BYTE address){
   BYTE res = 0;
   BOOL status = TRUE;

   sppSetAddress(address);

   // Clearing the states of the spp.
   sppTxStatus = TX_IDLE;	//在 cul.h TX 和 RX 狀態標志部分宏定義
   sppRxStatus = RX_IDLE;	//同上
   retransmissionCounter = 0;
   ackTimerNumber = 0;
   pAckData = 0;

   // Clearing the RF interrupt flags and enable mask and enabling RF interrupts
   RFIF = 0;
   RFIM = 0;
   INT_SETFLAG(INUM_RF,INT_CLR);
   INT_ENABLE(INUM_RF,INT_ON);

   // Setting the frequency and initialising the radio
   res = halRfConfig(frequency); //在rfconfig.c
   if(res == FALSE){
      status = FALSE;
   }

   // Setting the number of bytes to assert the FIFOP flag
   IOCFG0 = 7;

   INT_SETFLAG(INUM_RFERR, INT_CLR);
   INT_ENABLE(INUM_RFERR, INT_ON);

   // Flushing both Tx and Rx FiFo. The flush-Rx is issued twice to reset the SFD.
   // Calibrating the radio and turning on Rx to evaluate the CCA.
   // SFD 開始幀定界符
   SRXON;
   SFLUSHTX;
   SFLUSHRX;
   SFLUSHRX;
   STXCALN;
   ISSTART;


   // Using the timer 4 administrator to generate interrupt to check if a message is unacked...
   culTimer4AdmInit();

   // Initialising the DMA administrator
   culDmaInit();

   // Requesting a DMA channel for transmit data. No callback function is used. Instead the TX_DONE
   // interrupt is used to determine when a transfer is finished. Configuring the DMA channel for
   // transmit. The data address and length will be set prior to each specific transmission.
   dmaTx = culDmaAllocChannel(&dmaNumberTx, 0);
   if((dmaNumberTx == 0) || (dmaNumberTx > 4)){
      status = FALSE;
   }

   culDmaToRadio(dmaTx, 0, 0, FALSE);

   // Requesting a DMA channel for receiving data. Giving the address of the callback function.
   // Configuring the DMA channel for receive. The data address will be set prior to each specific
   // reception.
   dmaRx = culDmaAllocChannel(&dmaNumberRx, &rxCallBack);
   if((dmaNumberRx == 0) || (dmaNumberRx > 4)){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲最大色网站| 日韩免费一区二区三区在线播放| 国产精品每日更新| 成人av在线资源| 国产精品色哟哟| 色香蕉成人二区免费| 亚洲成av人在线观看| 欧美一区二区啪啪| 国产一区二区在线观看视频| 国产情人综合久久777777| 91亚洲精品久久久蜜桃| 视频一区视频二区中文字幕| 精品少妇一区二区三区在线视频| 国产成人日日夜夜| 亚洲伦理在线精品| 日韩欧美亚洲另类制服综合在线| 国产一区二区伦理片| 中文字幕日韩一区| 欧美日韩国产首页| 国产麻豆精品theporn| 亚洲欧美日韩国产手机在线| 欧美日韩亚洲综合在线 | 亚洲精品乱码久久久久| 欧美日韩亚洲综合| 成人深夜福利app| 亚洲成年人影院| 欧美国产乱子伦| 欧美日韩免费一区二区三区视频| 九九九久久久精品| 亚洲综合视频在线| 国产农村妇女毛片精品久久麻豆| 欧美在线制服丝袜| 国产91精品一区二区| 日日摸夜夜添夜夜添国产精品| 亚洲国产精品99久久久久久久久| 欧美日本一区二区| www.66久久| 九色综合狠狠综合久久| 亚洲午夜精品17c| 中文乱码免费一区二区| 欧美一区二区三区视频免费 | 色悠久久久久综合欧美99| 亚洲一区二区视频在线观看| 日韩一级精品视频在线观看| 岛国av在线一区| 亚洲成a人v欧美综合天堂| 久久久久久一二三区| 日本韩国精品一区二区在线观看| 日日摸夜夜添夜夜添精品视频| 国产欧美日本一区二区三区| 欧美日韩1区2区| 国产成人精品影视| 亚洲国产视频一区二区| 欧美va天堂va视频va在线| 91蜜桃传媒精品久久久一区二区| 琪琪久久久久日韩精品| 亚洲精品日产精品乱码不卡| 欧美精品一区二区三区在线| 国产精品一区2区| 亚洲精品视频在线观看免费 | 国产乱淫av一区二区三区 | 欧美日韩国产综合久久| 国产精品一区三区| 五月婷婷久久综合| 亚洲激情图片一区| 久久久久99精品一区| 欧美日韩国产另类不卡| 91在线一区二区| 国产一区二区网址| 日韩avvvv在线播放| 一区二区欧美视频| 亚洲欧洲日韩在线| 国产精品三级久久久久三级| 精品人在线二区三区| 欧美精品乱码久久久久久按摩| 99麻豆久久久国产精品免费优播| 国产一区二区在线免费观看| 蜜臀91精品一区二区三区| 一区二区三区欧美久久| 国产精品久久久久久久久免费桃花 | 欧美三级在线视频| 色综合久久综合| www.成人网.com| 91精品国产91综合久久蜜臀| 中文字幕精品一区| 91国产免费观看| eeuss鲁一区二区三区| 国内成人免费视频| 另类综合日韩欧美亚洲| 日本网站在线观看一区二区三区 | 欧美日韩国产首页| 欧美日韩一区二区在线观看视频| 99久久精品国产麻豆演员表| 成年人国产精品| 成人h版在线观看| 99精品偷自拍| 欧美亚洲图片小说| 91视频观看免费| 色狠狠色狠狠综合| 在线观看亚洲专区| 欧美日韩视频在线一区二区| 国产成人综合亚洲网站| 国模娜娜一区二区三区| 国产精品亚洲一区二区三区在线| 国产成人在线视频免费播放| 国产成人在线视频播放| 99久久久精品| 欧美午夜一区二区三区免费大片| 欧美综合欧美视频| 这里只有精品免费| 亚洲精品在线观| 久久久不卡网国产精品一区| 国产精品美女久久久久久久| 国产精品你懂的在线欣赏| 亚洲图片有声小说| 老司机精品视频线观看86| 国产精品综合久久| 不卡一区二区中文字幕| 91久久久免费一区二区| 777亚洲妇女| 国产人伦精品一区二区| 伊人夜夜躁av伊人久久| 视频一区二区国产| 国产成人av电影| 欧日韩精品视频| 欧美一区二区视频在线观看 | 91精品国产综合久久久久久 | 蜜臀av性久久久久蜜臀aⅴ| 国产成人综合精品三级| 91搞黄在线观看| 精品奇米国产一区二区三区| 国产精品国产三级国产aⅴ原创| 亚洲欧美视频在线观看视频| 丝袜国产日韩另类美女| 国产成人综合亚洲网站| 欧美日韩亚洲不卡| 日本一区二区三区视频视频| 午夜视频在线观看一区| 另类专区欧美蜜桃臀第一页| 色综合久久六月婷婷中文字幕| 日韩欧美国产电影| 亚洲色欲色欲www| 青青草国产精品97视觉盛宴 | 中文字幕第一区二区| 亚洲伊人色欲综合网| 国产成人在线影院| 欧美精品久久久久久久多人混战 | 中文字幕亚洲不卡| 看国产成人h片视频| 一本大道久久a久久精二百| 2021久久国产精品不只是精品| 一区二区三区中文在线观看| 国产九色精品成人porny| 欧美久久一区二区| 国产精品电影一区二区| 久久99最新地址| 欧美系列日韩一区| 亚洲免费观看高清完整版在线观看熊| 午夜国产不卡在线观看视频| 色老头久久综合| 中文字幕中文字幕在线一区| 国内精品免费在线观看| 欧美一级午夜免费电影| 一区二区日韩电影| 91美女片黄在线观看91美女| 精品免费国产二区三区| 午夜精品久久久久久久| 色综合夜色一区| 国产精品久久久久久久浪潮网站| 国产另类ts人妖一区二区| 精品精品国产高清a毛片牛牛| 亚洲sss视频在线视频| 色8久久人人97超碰香蕉987| 国产精品久久久久久久久久久免费看 | 国产不卡视频在线观看| 精品人在线二区三区| 日本视频免费一区| 欧美一区二区三区日韩视频| 亚洲黄色在线视频| 91精品国产91综合久久蜜臀| 午夜影院在线观看欧美| 欧美日韩三级在线| 亚洲一级在线观看| 欧美精品一二三区| 日本欧美一区二区| 欧美亚洲综合网| 亚洲国产三级在线| 欧美另类高清zo欧美| 亚洲v精品v日韩v欧美v专区| 欧美日本视频在线| 免费看欧美美女黄的网站| 51精品秘密在线观看| 免费成人在线播放| 久久久99免费| 国产米奇在线777精品观看| 国产精品成人午夜| 欧美综合视频在线观看| 日韩不卡在线观看日韩不卡视频| 日韩欧美国产电影| 成人一区二区三区视频|