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

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

?? spp.c

?? zigbee 2430 演示 就是個演示程序么 說這么多干嘛 暈
?? C
字號:
/******************************************************************************
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.
//-----------------------------------------------------------------------------
void sppSetRxCallBackFunction(FUNCTION* callBackFunction)
{
   rxCallBackFunction = callBackFunction;
} // Ends sppSetRxCallBackFunction()




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())
//
//  Arguments:
//      void
//
//  Return value:
//      void
//-----------------------------------------------------------------------------
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)
      {
         if(receivedPacket->flags == ACK)
         {
            res = ackReceived(receivedPacket->srcAddress);
         }
         else
         {
            sppRxStatus = PACKET_RECEIVED;
            res = TRUE;
            if(receivedPacket->flags & DO_ACK)
            {
               sendAck(receivedPacket);
            }
            sppRxStatus = RX_COMPLETE;
            if(rxCallBackFunction)
            {
               rxCallBackFunction();
            }
         }
      }
   }

   if(res == FALSE)
   {
      ISFLUSHRX;
      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
//-----------------------------------------------------------------------------
void ackTimeout(void){
   culTimer4AdmClear(ackTimerNumber);

   if(pAckData != NULL)
   {
      if(retransmissionCounter < ACK_RETRIES)
      {
         // Resending the message.
         pAckData->flags |= RETRANSMISSION;

         TIMER4_RUN(FALSE);

         sppSend(pAckData);

         T4CNT = 0;
         TIMER4_RUN(TRUE);

         retransmissionCounter++;
      }
      else
      {
         // The packet has been resent too many times. Assuming that the node is unreacheble.
         pAckData = 0;
         retransmissionCounter = 0;
         sppTxStatus = DEST_UNREACHABLE;
         RFIM &= ~IRQ_FIFOP;
      }
   }
   return;
} // ends ackTimeout




//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
BOOL sppInit(UINT32 frequency, BYTE address){
   BYTE res = 0;
   BOOL status = TRUE;

   sppSetAddress(address);

   // Clearing the states of the spp.
   sppTxStatus = TX_IDLE;
   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);
   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.
   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)){
      status = FALSE;
   }
   culDmaFromRadio(dmaRx, 0, TRUE);

   // Making sure that none of the channels are armed.
   DMA_ABORT_CHANNEL(dmaNumberRx);
   DMA_ABORT_CHANNEL(dmaNumberTx);
   INT_ENABLE(INUM_DMA, INT_ON);

   return status;
} // ends sppInit




//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
void sppSetAddress(BYTE address){
   myAddress = address;
} // Ends sppSetAddress()




// Internal function which enables the timeout when waiting for an ACK.
void waitForAck(void)
{
   ackTimerNumber = culTimer4AdmSet(ACK_TIMEOUT, &ackTimeout);
   SET_DMA_DEST(dmaRx,pAckBuffer);
   SET_DMA_LENGTH(dmaRx,7);

}   // Ends waitForAck()




//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
BYTE sppSend(SPP_TX_STRUCT* pPacketPointer){
   BYTE res = TRUE;

   // If data is to be transmitted, the DMA is set up.
   if(pPacketPointer->payloadLength)
   {
      if (pPacketPointer->payloadLength > SPP_MAX_PAYLOAD_LENGTH)
      {
         res = TOO_LONG;
         sppTxStatus = TX_IDLE;
      }
      else
      {
         // Setting up the DMA
         DMA_ABORT_CHANNEL(dmaNumberTx);
         SET_DMA_SOURCE(dmaTx,pPacketPointer->payload);
         SET_DMA_LENGTH(dmaTx,pPacketPointer->payloadLength);
      }
   }

   // Proceed if the packet length is OK.
   if (res == TRUE)
   {
      // Flipping the sequence bit if the transfer is not a retransmission.
      if(!(pPacketPointer->flags & RETRANSMISSION))
      {
         pPacketPointer->flags ^= SEQUENCE_BIT;
      }

      // Clearing RF interrupt flags and enabling RF interrupts.
      if(FSMSTATE == 6 && RXFIFOCNT > 0)
      {
         ISFLUSHRX;
         ISFLUSHRX;
      }

      RFIF &= ~IRQ_TXDONE;
      RFIM &= ~IRQ_SFD;
      INT_SETFLAG(INUM_RF, INT_CLR);

      // Writing the total packet length, addresses and flags to Tx FiFo.
      // Transferring the payload if any.
      RFD = (pPacketPointer->payloadLength + SPP_HEADER_AND_FOOTER_LENGTH);
      RFD = pPacketPointer->destAddress;
      RFD = myAddress;
      RFD = pPacketPointer->flags;
      if(pPacketPointer->payloadLength)
      {
         DMA_ARM_CHANNEL(dmaNumberTx);
         DMA_START_CHANNEL(dmaNumberTx);
      }

      // If the RSSI value is not valid, enable receiver
      if(RSSIL == 0x80)
      {
         ISRXON;
         // Turning on Rx and waiting 320u-sec to make the RSSI value become valid.
         halWait(1);
      }

      //Transmitting
      ISTXONCCA;
      //if(TX_ACTIVE)
      if(FSMSTATE > 30)
      {
         // Asserting the status flag and enabling ACK reception if expected.
         sppTxStatus = TX_IN_PROGRESS;

         if(pPacketPointer->flags & DO_ACK)
         {
            pAckData = pPacketPointer;
            DMA_ABORT_CHANNEL(dmaNumberRx);
            waitForAck();
         }
         else
         {
            pAckData = NULL;
         }
         RFIM |= IRQ_TXDONE;
      }
      else
      {
         ISFLUSHTX;
         res = CHANNEL_BUSY;
         RFIM &= ~IRQ_TXDONE;
         // De-flipping the sequence bit.
         if(!(pPacketPointer->flags & RETRANSMISSION))
         {
            pPacketPointer->flags ^= SEQUENCE_BIT;
         }
      }
   }
   return res;
} // ends sppSend




// Internal function which is called when an ack is received.
// If the ACK is from the expected node, the retransmission of the packet is cancelled.
BOOL ackReceived(BYTE sourceAddress)
{
   BOOL res = FALSE;
   if(sourceAddress == pAckData->destAddress)
   {
      res = TRUE;
      culTimer4AdmClear(ackTimerNumber);
      sppTxStatus = TX_SUCCESSFUL;
      retransmissionCounter = 0;
      pAckData = 0;
   }

   return res;
}  //Ends ackReceived()



//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
#pragma vector=RF_VECTOR
__interrupt void spp_rf_IRQ(void)
{
   BYTE enabledAndActiveInterrupt;

   INT_GLOBAL_ENABLE(INT_OFF);
   enabledAndActiveInterrupt = RFIF;
   RFIF = 0x00;                        // Clear all interrupt flags
   INT_SETFLAG(INUM_RF, INT_CLR);    // Clear MCU interrupt flag
   enabledAndActiveInterrupt &= RFIM;

   // Start of frame delimiter (SFD)
   if(enabledAndActiveInterrupt & IRQ_SFD)
   {
      if(sppRxStatus == RX_WAIT)
      {
         sppRxStatus = RX_IN_PROGRESS;
         RFIM &= ~IRQ_SFD;
      }
   }

   // Transmission of a packet is finished. Enabling reception of ACK if required.
   if(enabledAndActiveInterrupt & IRQ_TXDONE)
   {
      if(sppTxStatus == TX_IN_PROGRESS)
      {
         if(pAckData == NULL)
         {
            sppTxStatus = TX_SUCCESSFUL;
         }
         else
         {
            DMA_ARM_CHANNEL(dmaNumberRx);
         }
      }

      // Clearing the tx done interrupt enable
      RFIM &= ~IRQ_TXDONE;

   }
   INT_GLOBAL_ENABLE(INT_ON);
}





//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
void sppReceive(SPP_RX_STRUCT* pReceiveData){

   sppRxStatus = RX_WAIT;

   DMA_ABORT_CHANNEL(dmaNumberRx);
   // Setting the address to where the received data are to be written.
   SET_DMA_DEST(dmaRx,pReceiveData);
   SET_DMA_LENGTH(dmaRx,255);

   // Arming the DMA channel. The receiver will initate the transfer when a packet is received.
   DMA_ARM_CHANNEL(dmaNumberRx);

   if(FSMSTATE == 6 && RXFIFOCNT > 0)
   {
      ISFLUSHRX;
      ISFLUSHRX;
   }

   // Turning on the receiver
   ISRXON;

   return;
}



//-----------------------------------------------------------------------------
// See cul.h for a description of this function.
//-----------------------------------------------------------------------------
#pragma vector=RFERR_VECTOR
__interrupt static void rf_error_IRQ(void)
{
   INT_GLOBAL_ENABLE(INT_OFF);

   // If Rx overflow occurs, the Rx FiFo is reset.
   // The Rx DMA is reset and reception is started over.
   if(FSMSTATE == 17)
   {
      STOP_RADIO();
      ISFLUSHRX;
      ISFLUSHRX;
      DMA_ABORT_CHANNEL(dmaNumberRx);
      DMA_ARM_CHANNEL(dmaNumberRx);
      ISRXON;
   }
   else if(FSMSTATE == 56)
   {
      ISFLUSHTX;
   }

   INT_SETFLAG(INUM_RFERR,INT_CLR);

   INT_GLOBAL_ENABLE(INT_ON);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产拍揄自揄精品视频麻豆| 日韩视频免费观看高清在线视频| 国产三级精品三级在线专区| 国产精品亚洲人在线观看| 精品粉嫩超白一线天av| 国产成人亚洲综合a∨婷婷| 国产欧美一区二区精品忘忧草| 岛国精品在线观看| 亚洲欧美二区三区| 欧美偷拍一区二区| 美女诱惑一区二区| 国产日韩亚洲欧美综合| 色综合天天做天天爱| 亚洲福利国产精品| 欧美大度的电影原声| 粉嫩av一区二区三区| 亚洲综合视频在线观看| 日韩一区二区三区在线视频| 国产精品一区在线观看你懂的| 一区二区中文视频| 7777女厕盗摄久久久| 国产一区二区免费看| 亚洲欧美成人一区二区三区| 欧美精品一二三四| 国产一区在线不卡| 亚洲黄色av一区| 精品国产三级a在线观看| av一区二区三区黑人| 婷婷国产v国产偷v亚洲高清| 久久久久久**毛片大全| 欧美影视一区在线| 国产精选一区二区三区| 一区二区不卡在线播放| 久久久久久久久久久久久久久99 | 成人国产免费视频| 亚洲一区二区三区美女| 久久精品网站免费观看| 欧美日韩久久久| 成人国产精品视频| 久草在线在线精品观看| 一区二区三区国产| 国产精品网站在线| 日韩一区二区中文字幕| 91福利区一区二区三区| 国产精品综合二区| 免费久久99精品国产| 一区二区在线观看免费| 国产欧美精品一区二区色综合| 欧美男人的天堂一二区| 色综合久久天天| 国产成人aaa| 国内精品伊人久久久久av一坑| 亚洲一二三区不卡| 亚洲欧美日韩久久| 中文字幕va一区二区三区| 欧美成人精精品一区二区频| 欧美色精品在线视频| 99久久综合国产精品| 国产激情偷乱视频一区二区三区| 日韩av中文字幕一区二区| 亚洲资源在线观看| 一区二区激情视频| 亚洲视频综合在线| 国产精品成人网| 欧美激情综合在线| 亚洲国产精品av| 国产午夜精品福利| 国产色产综合色产在线视频| 日韩三级中文字幕| 91精品国产福利在线观看| 欧美日韩视频在线第一区 | 精品一区二区三区免费毛片爱| 亚洲小少妇裸体bbw| 一区二区三区在线免费| 亚洲人一二三区| 亚洲欧美日韩国产另类专区| 亚洲三级免费电影| 亚洲精品视频观看| 亚洲码国产岛国毛片在线| 日韩美女视频19| 亚洲精品自拍动漫在线| 一区二区三区在线播| 亚洲国产成人高清精品| 亚洲一区二区在线免费观看视频| 亚洲精品菠萝久久久久久久| 一区二区国产视频| 日韩精品一级中文字幕精品视频免费观看 | 另类欧美日韩国产在线| 久久精品国产免费| 国产精品99久| 国产成人三级在线观看| 成人免费视频一区二区| 99久久er热在这里只有精品15 | av一二三不卡影片| 欧美性猛交xxxxxx富婆| 制服丝袜中文字幕亚洲| 欧美精品一区二区三区蜜桃视频 | 色94色欧美sute亚洲线路一ni| 91麻豆高清视频| 欧美性一二三区| 欧美一区二区三区思思人| 久久综合久久99| 亚洲免费观看高清| 日本成人在线看| 成人黄页毛片网站| 欧美精品丝袜中出| 国产亚洲精品bt天堂精选| 亚洲色图20p| 久久精品国产999大香线蕉| 丁香啪啪综合成人亚洲小说 | 91精品国产欧美一区二区18| 26uuu国产电影一区二区| 一区二区中文视频| 秋霞午夜av一区二区三区| 成人免费黄色大片| 在线播放欧美女士性生活| 久久女同性恋中文字幕| 亚洲综合激情网| 国产精品乡下勾搭老头1| 91视视频在线直接观看在线看网页在线看 | 欧美人牲a欧美精品| 26uuu亚洲婷婷狠狠天堂| 一区二区日韩电影| 国产美女精品人人做人人爽 | 欧美精品久久99| 国产精品久久久爽爽爽麻豆色哟哟 | 成人精品电影在线观看| 欧美美女直播网站| 国产精品三级电影| 蜜桃视频在线一区| 欧美丝袜丝交足nylons图片| 久久久电影一区二区三区| 日韩国产在线观看| 99国产精品久久久久久久久久久| 欧美一级搡bbbb搡bbbb| 亚洲欧洲综合另类| 国产黄色91视频| 日韩午夜电影av| 亚洲国产一区二区三区| 成人福利视频网站| 久久免费偷拍视频| 久久er99精品| 91精品国产综合久久国产大片| 亚洲人成电影网站色mp4| 国产大陆精品国产| 精品国产网站在线观看| 日韩成人一级片| 欧美色窝79yyyycom| 一区二区在线观看免费视频播放| 成人免费福利片| 国产女主播一区| 国产精品一品视频| 精品国产成人在线影院| 日韩电影在线观看网站| 欧美喷水一区二区| 亚洲第一搞黄网站| 欧美视频在线不卡| 亚洲综合激情网| 欧美四级电影在线观看| 亚洲一区中文日韩| 欧美伊人精品成人久久综合97| 亚洲免费观看高清完整版在线| 91亚洲男人天堂| 亚洲精品日日夜夜| 欧美日韩一级片在线观看| 亚洲国产精品一区二区久久| 在线视频你懂得一区二区三区| 亚洲欧美另类久久久精品2019| 91女神在线视频| 一区二区三区成人在线视频| 欧美中文字幕一二三区视频| 一区二区三区在线影院| 欧美性猛片aaaaaaa做受| 偷拍与自拍一区| 日韩一区二区免费在线观看| 蜜臀av性久久久久av蜜臀妖精| 精品欧美乱码久久久久久1区2区| 激情五月婷婷综合| 欧美激情中文字幕| av一区二区三区| 亚洲一区电影777| 91精品国产91久久久久久一区二区 | 国产一区亚洲一区| 中文字幕av一区二区三区高| av在线不卡免费看| 亚洲第一综合色| 欧美成人a在线| av资源站一区| 亚洲二区在线视频| 欧美成人福利视频| 成人av免费在线观看| 一区二区三区欧美日| 91精品国产欧美一区二区成人| 国产真实乱子伦精品视频| 国产精品无人区| 欧美性大战久久久| 国模冰冰炮一区二区| 国产精品福利影院| 7777精品伊人久久久大香线蕉 | 欧美日韩视频不卡|