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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? spp.c

?? CC2430下基于ZigBee的綜合實(shí)力源碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/******************************************************************************
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.
//-----------------------------------------------------------------------------
//設(shè)置用戶(hù)指定的回調(diào)函數(shù),在接收到一個(gè)正確的數(shù)據(jù)包死運(yùn)行
//通過(guò)這個(gè)函數(shù)可以用程序來(lái)改變正確接收數(shù)據(jù)包后的動(dòng)作。
//callBackFunction 用戶(hù)指定的函數(shù)
//rxCallBackFunction 指向 FUNCTION 的全局變量指針變量
void sppSetRxCallBackFunction(FUNCTION* callBackFunction)
{
   rxCallBackFunction = callBackFunction;
} // Ends sppSetRxCallBackFunction()


//發(fā)送應(yīng)答
//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  通道完成數(shù)據(jù)傳輸后由中斷程序調(diào)用。檢查接收包掉的目的地址,如果地址不是
//這個(gè)節(jié)點(diǎn)的,或CRC值是錯(cuò)誤的,包裝將被擦除。如果數(shù)據(jù)包被告知將發(fā)送一個(gè)應(yīng)答。一個(gè)用戶(hù)定義的回調(diào)函數(shù)可以運(yùn)行如果定義了的話(huà)。
//  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 中的宏定義,取得一個(gè) DMA 通道的目標(biāo)地址
// static DMA_DESC* dmaRx 指向設(shè)備 DMA 描述符的指針,全局變量.DMA_DESC DMA 配置結(jié)構(gòu)。
//
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; //減去頭和尾長(zhǎng)度

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

   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.
//如果沒(méi)有收到接收器返回的應(yīng)答,將重新發(fā)送數(shù)據(jù)包
//  Arguments:
//      void
//
//  Return value:
//      void
//-----------------------------------------------------------------------------
// TIMER4_RUN() 宏函數(shù)在 hal.h 中定義
// #define ACK_RETRIES  3 在 hal.h 中的宏定義常數(shù)
void ackTimeout(void){
   culTimer4AdmClear(ackTimerNumber);

   if(pAckData != NULL)
   {
      if(retransmissionCounter < ACK_RETRIES)	//重發(fā)次數(shù)小于嘗試接收應(yīng)答次數(shù)
      {
         // Resending the message.
         pAckData->flags |= RETRANSMISSION;		//數(shù)據(jù)包標(biāo)志-重發(fā)

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

         sppSend(pAckData);						//發(fā)送數(shù)據(jù)包

         T4CNT = 0;								//定時(shí)器4計(jì)數(shù)清零
         TIMER4_RUN(TRUE);						//定時(shí)器4開(kāi)始運(yùn)行

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




//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
// 初始化簡(jiǎn)單的數(shù)據(jù)包裝協(xié)議Simple Packet Protocol (SPP)
// 從 DMA 管理器申請(qǐng)兩個(gè) DMA 通道,用于分別從 Rx FIFO 和 Tx FIFO 傳輸數(shù)據(jù)。定時(shí)器4
// 管理器同樣被設(shè)置,這個(gè)單元用于在數(shù)據(jù)包發(fā)送后接收器在一定時(shí)間內(nèi)沒(méi)有返回應(yīng)答時(shí)
// 產(chǎn)生中斷。無(wú)線(xiàn)部分配置為發(fā)送,工作在特定的頻率,在發(fā)送時(shí)自動(dòng)計(jì)算和插入和檢查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 狀態(tài)標(biāo)志部分宏定義
   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 開(kāi)始幀定界符
   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)){

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久高清一区二区三区| 欧美精品一区二区蜜臀亚洲| 成人午夜电影久久影院| 久久精品国产99久久6| 五月天激情综合网| 亚洲成人av电影| 亚洲综合激情另类小说区| 亚洲精品视频观看| 日韩一区在线播放| 亚洲美女视频在线| 艳妇臀荡乳欲伦亚洲一区| 亚洲自拍都市欧美小说| 亚洲福利视频一区| 五月天婷婷综合| 捆绑调教一区二区三区| 国产一区二区三区黄视频| 国产精品一卡二卡在线观看| 国产98色在线|日韩| 91久久精品一区二区| 亚洲国产精品天堂| 三级久久三级久久久| 久久国内精品自在自线400部| 欧美aaa在线| 国产剧情一区在线| 成人高清视频在线观看| 色综合久久综合| 欧美日韩成人在线| 精品1区2区在线观看| 久久亚洲精精品中文字幕早川悠里| 久久看人人爽人人| 一区二区三区高清在线| 日韩在线a电影| 国产剧情av麻豆香蕉精品| 99久久亚洲一区二区三区青草| 欧洲日韩一区二区三区| 欧美一区国产二区| 国产午夜精品久久久久久久 | 日韩精品一区二区三区蜜臀| 久久久高清一区二区三区| 亚洲日本va在线观看| 午夜精品影院在线观看| 国产主播一区二区| 99久久久免费精品国产一区二区 | 亚洲综合在线电影| 蜜桃av一区二区三区| 成人性生交大片免费看在线播放| 91福利资源站| xvideos.蜜桃一区二区| 亚洲精选免费视频| 韩国一区二区三区| 色综合激情五月| 精品剧情v国产在线观看在线| 中文字幕在线不卡| 免费在线成人网| 99久久er热在这里只有精品15| 欧美性欧美巨大黑白大战| 久久人人爽爽爽人久久久| 一区二区高清视频在线观看| 国产在线精品国自产拍免费| 欧美伊人久久大香线蕉综合69| 久久久久久久久久电影| 亚洲成av人综合在线观看| 丁香另类激情小说| 日韩欧美亚洲另类制服综合在线| 中文字幕一区二区三区在线播放| 毛片一区二区三区| 国产精品人成在线观看免费| 国产亚洲福利社区一区| 日韩国产精品久久久久久亚洲| 亚洲一级二级三级在线免费观看| 国产999精品久久| 日韩欧美一二三| 午夜精品久久久久久久蜜桃app| 99在线视频精品| 久久久久久久综合色一本| 亚洲超碰精品一区二区| 精品国产髙清在线看国产毛片| 国产精品福利av| 久久99精品国产麻豆不卡| 欧美私人免费视频| 亚洲欧美在线视频观看| 国产99久久久国产精品潘金| 精品国产三级a在线观看| 五月天国产精品| 欧美日韩国产另类一区| 亚洲精品久久久蜜桃| av毛片久久久久**hd| 在线亚洲一区观看| **性色生活片久久毛片| 懂色一区二区三区免费观看 | 亚洲视频中文字幕| 国产99久久久国产精品潘金| 久久免费偷拍视频| 国产主播一区二区| 久久女同精品一区二区| 麻豆视频观看网址久久| 欧美一级日韩免费不卡| 国产亚洲综合av| 国产乱码精品一区二区三区五月婷| 日韩一级欧美一级| 偷偷要91色婷婷| 欧美日韩精品高清| 亚洲成a人在线观看| 欧美日韩精品免费| 免费成人av在线| 日韩欧美国产三级| 韩国视频一区二区| 久久精品视频一区| 高清不卡一二三区| 中文字幕中文乱码欧美一区二区 | 久久久久久亚洲综合影院红桃| 久久99精品久久久| 国产午夜亚洲精品理论片色戒 | 91亚洲永久精品| 亚洲精品视频免费观看| 欧美性高清videossexo| 午夜视频在线观看一区| 欧美一区二区三区电影| 亚洲免费av网站| 欧美人xxxx| 久久成人综合网| 欧美国产亚洲另类动漫| 91原创在线视频| 五月婷婷综合激情| 2023国产精品视频| 成人激情开心网| 亚洲影视在线播放| 在线观看91av| 国产一区视频网站| 中文字幕在线一区| 欧美中文字幕不卡| 欧美激情在线一区二区三区| 99久久久无码国产精品| 亚洲成人高清在线| 26uuu亚洲综合色欧美| 成人黄色777网| 亚洲mv在线观看| 久久蜜桃一区二区| 一本到一区二区三区| 日本不卡免费在线视频| 国产视频一区二区三区在线观看| 91在线云播放| 日本最新不卡在线| 国产精品系列在线| 狠狠久久亚洲欧美| 亚洲精品一二三四区| 欧美一区二区久久久| 国产999精品久久| 午夜精品福利一区二区三区av| 久久色在线视频| 欧美性感一区二区三区| 国产精品99久久久久久久女警| 亚洲精品欧美二区三区中文字幕| 日韩色在线观看| 91浏览器在线视频| 久久国产精品99久久人人澡| 亚洲精品日日夜夜| 久久综合色之久久综合| 欧美偷拍一区二区| 亚洲激情在线激情| 久久色中文字幕| 3d成人h动漫网站入口| 盗摄精品av一区二区三区| 亚洲va欧美va天堂v国产综合| 国产丝袜在线精品| 日韩美女视频一区二区在线观看| 97国产一区二区| 国产一区免费电影| 亚洲丰满少妇videoshd| 国产精品五月天| 亚洲成人激情av| 欧美xxxxx牲另类人与| 在线中文字幕一区二区| 国产成人福利片| 蜜桃av一区二区在线观看| 亚洲综合丝袜美腿| 中文字幕一区在线观看视频| 久久婷婷成人综合色| 日韩精品专区在线影院重磅| 欧美日韩一区二区三区不卡| 成人免费高清视频在线观看| 精品在线亚洲视频| 婷婷综合另类小说色区| 一区二区三区四区五区视频在线观看| 国产日韩三级在线| 日韩一区二区在线观看视频 | 日韩无一区二区| 欧美四级电影网| 91福利精品视频| 国产成人h网站| 国产麻豆成人传媒免费观看| 免费成人在线影院| 婷婷综合另类小说色区| 亚洲高清不卡在线观看| 一区二区高清在线| 一区二区三区精品视频在线| 亚洲欧美视频在线观看视频| 综合色中文字幕| 亚洲日本va午夜在线影院| 国产精品第五页|