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

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

?? spp.c

?? zigbee通信系統中使用芯片cc2430實現點對點通信的源碼
?? 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一区二区在线免费观看| 国产成人精品综合在线观看| 884aa四虎影成人精品一区| 国产精品视频看| 精品在线一区二区三区| 777色狠狠一区二区三区| 亚洲欧美精品午睡沙发| 国产91清纯白嫩初高中在线观看| 91精品婷婷国产综合久久性色| 亚洲视频一二三| 成人免费av资源| 欧美成人vr18sexvr| 亚洲图片欧美一区| 在线观看一区二区视频| 亚洲欧美激情插| 色综合天天综合| 亚洲天堂成人在线观看| av福利精品导航| 国产精品久久久久久户外露出| 国产乱码一区二区三区| 久久夜色精品一区| 看片的网站亚洲| 日韩免费福利电影在线观看| 日韩国产精品久久久| 911国产精品| 裸体一区二区三区| 精品人在线二区三区| 捆绑紧缚一区二区三区视频| 欧美电影免费观看高清完整版在| 麻豆精品国产传媒mv男同| 日韩美女视频一区二区在线观看| 精一区二区三区| 国产日韩欧美精品电影三级在线| 国产精品 欧美精品| 中文字幕 久热精品 视频在线 | 国产精品国产三级国产有无不卡| 成人综合日日夜夜| 一区二区三区国产| 欧美一级欧美三级在线观看| 精品一区二区三区av| 欧美国产精品专区| 91蝌蚪国产九色| 亚洲电影一级黄| 日韩视频在线一区二区| 国产高清不卡一区| 亚洲丝袜自拍清纯另类| 欧美三级在线播放| 国产在线国偷精品产拍免费yy| 国产婷婷精品av在线| 色哟哟日韩精品| 久久精品国产亚洲5555| 欧美国产成人精品| 欧美日韩精品一区二区天天拍小说| 日韩经典中文字幕一区| 国产三级精品三级在线专区| 在线免费观看日本欧美| 日韩不卡一区二区| 中文字幕成人在线观看| 欧美三级日韩三级国产三级| 国产成人亚洲综合a∨婷婷图片| 日韩毛片精品高清免费| 91精品国产品国语在线不卡| 国产成人日日夜夜| 午夜激情一区二区三区| 国产精品狼人久久影院观看方式| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲综合免费观看高清在线观看| 日韩无一区二区| 色综合久久久久综合99| 免费高清在线一区| 日韩久久一区二区| 亚洲精品在线网站| 欧美视频日韩视频在线观看| 国产精品一区专区| 日韩黄色免费电影| 成人免费在线视频观看| 精品少妇一区二区三区在线播放| 91香蕉国产在线观看软件| 精品一区二区影视| 亚洲国产毛片aaaaa无费看 | 欧美私人免费视频| 成人午夜伦理影院| 捆绑调教美女网站视频一区| 亚洲成人综合视频| 亚洲日本成人在线观看| 国产色爱av资源综合区| 91精品国产综合久久精品app | 丝袜美腿高跟呻吟高潮一区| 亚洲精品日日夜夜| 国产精品入口麻豆九色| 精品卡一卡二卡三卡四在线| 51精品秘密在线观看| 欧美性色综合网| 色综合久久中文字幕综合网| 99精品一区二区三区| 成人一区二区视频| 国产精品一二三区在线| 国产一区二区视频在线播放| 美国毛片一区二区三区| 日本美女视频一区二区| 午夜欧美一区二区三区在线播放| 一区二区不卡在线播放| 一区二区三区中文字幕电影| 一区二区三区美女视频| 亚洲色图视频免费播放| 1区2区3区精品视频| 国产精品国产三级国产普通话99 | 欧美色精品天天在线观看视频| 99精品久久99久久久久| 色偷偷久久人人79超碰人人澡| 99久久久久久99| 在线欧美日韩国产| 欧美在线一区二区| 7878成人国产在线观看| 日韩三级视频在线观看| 久久久夜色精品亚洲| 中文字幕精品综合| 亚洲色图都市小说| 亚洲成人1区2区| 美女被吸乳得到大胸91| 国产激情视频一区二区在线观看| 国产盗摄一区二区| 色综合久久久久综合体| 欧美色图在线观看| 日韩午夜在线观看视频| 久久婷婷国产综合国色天香 | 在线亚洲一区二区| 91精品国产综合久久香蕉麻豆| 精品免费国产二区三区| 中文字幕精品一区二区三区精品| 亚洲欧洲成人精品av97| 首页国产欧美久久| 国产综合色在线视频区| 成人性生交大片免费看中文 | 欧美精品一二三| 欧美一区二区三区四区五区| 久久综合网色—综合色88| 中文字幕一区二| 五月婷婷另类国产| 国产suv一区二区三区88区| 91久久奴性调教| 欧美xingq一区二区| 国产精品第13页| 美女免费视频一区| 99国产精品国产精品毛片| 91精品在线一区二区| 国产视频一区二区三区在线观看 | 亚洲国产高清不卡| 亚洲高清免费视频| 国产99久久久国产精品潘金| 欧美日韩在线不卡| 国产嫩草影院久久久久| 亚洲福利视频一区| 成人国产在线观看| 欧美一级片免费看| 夜夜精品浪潮av一区二区三区| 精彩视频一区二区三区| 欧美日韩高清一区二区| 国产精品青草综合久久久久99| 麻豆一区二区在线| 欧美影院一区二区三区| 中文字幕精品在线不卡| 久久99精品久久久久| 欧美剧情片在线观看| 自拍偷拍欧美精品| 国产不卡视频在线观看| 精品剧情v国产在线观看在线| 亚洲午夜私人影院| 91亚洲男人天堂| 国产肉丝袜一区二区| 久久91精品久久久久久秒播| 欧美日韩aaaaa| 一区二区三区成人| 99视频一区二区三区| 久久蜜臀中文字幕| 免费不卡在线观看| 欧美一级艳片视频免费观看| 亚洲一区二区精品视频| 91在线免费视频观看| 国产调教视频一区| 国产大陆精品国产| 久久精品夜色噜噜亚洲aⅴ| 日本在线不卡视频一二三区| 欧美日韩国产免费一区二区| 亚洲午夜久久久久久久久电影网 | 精品电影一区二区三区 | 国产亚洲精品超碰| 国产一本一道久久香蕉| 久久综合色婷婷| 国产精品综合二区| 久久女同性恋中文字幕| 国产一区二区精品久久91| 久久女同精品一区二区| 国产成人久久精品77777最新版本| 国产偷国产偷亚洲高清人白洁| 国产成人av一区二区三区在线 |