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

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

?? spp.c

?? reference about wireless design which is helpful to everyone
?? C
字號:
/******************************************************************************
*                                                                             *
*        **********                                                           *
*       ************                                                          *
*      ***        ***                                                         *
*     ***    ++    ***                                                        *
*     ***   +  +   ***                      CHIPCON                           *
*     ***   +                                                                 *
*     ***   +  +   ***                                                        *
*     ***    ++    ***                                                        *
*      ***        ***                                                         *
*       ************                                                          *
*        **********                                                           *
*                                                                             *
*******************************************************************************

Filename:     spp.c
Target:       cc2510
Author:       EFU
Revised:      20/6-2006
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_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[6];
static SPP_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_STRUCT* receivedPacket)
{
   SIDLE();
   // Debug:
   halWait(1);
   DMA_ABORT_CHANNEL(dmaNumberTx);

   RFTXRXIF = 0;
   STX();
   RFIF &= ~IRQ_DONE;
   while(RFTXRXIF == 0);
   RFD = SPP_HEADER_AND_FOOTER_LENGTH + SPP_ACK_LENGTH;
   RFTXRXIF = 0;
   while(RFTXRXIF == 0);
   RFTXRXIF = 0;
   RFD = receivedPacket->srcAddress;
   while(RFTXRXIF == 0);
   RFTXRXIF = 0;
   RFD = myAddress;
   while(RFTXRXIF == 0);
   RFTXRXIF = 0;
   RFD = ACK;
   while(!(RFIF & IRQ_DONE));
   RFIF &= ~IRQ_DONE;

   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_STRUCT __xdata* receivedPacket;
   BYTE res = FALSE;


   // 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_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)
   {

      // 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_SFD;
      }
   }
   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;
   }

   // Always in RX unless sending.

   //debug:
   MCSM1 = 0x2F;
//   MCSM1 = 0x3F;

   SRX();


   // 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, SPP_MAX_PAYLOAD_LENGTH + SPP_HEADER_AND_FOOTER_LENGTH, 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,6);

}   // Ends waitForAck()




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

   // Checking that length is not too long
   if (pPacketPointer->payloadLength > SPP_MAX_PAYLOAD_LENGTH)
   {
      res = TOO_LONG;
      sppTxStatus = TX_IDLE;
   }

   // Flipping the sequence bit, writing  total packet length and address if the transfer is not a retransmission.
   // If it is a retransmission, the fields are correct
   if(!(pPacketPointer->flags & RETRANSMISSION))
   {
      pPacketPointer->flags ^= SEQUENCE_BIT;
      pPacketPointer->payloadLength += SPP_HEADER_AND_FOOTER_LENGTH;
      pPacketPointer->srcAddress = myAddress;
   }


   // Setting up the DMA
   DMA_ABORT_CHANNEL(dmaNumberTx);
   SET_DMA_SOURCE(dmaTx,pPacketPointer);


   // Proceed if the packet length is OK.
   if (res == TRUE)
   {
      // Clearing RF interrupt flags and enabling RF interrupts.
      RFIF &= ~IRQ_DONE;
      RFIM &= ~IRQ_SFD;
      INT_SETFLAG(INUM_RF, INT_CLR);

      if(!CCA)
      {
         SRX();
         // Turning on Rx and waiting to make the RSSI value become valid.
         halWait(1);
      }

      if(CCA)
      {  // Setting up radio
         DMA_ABORT_CHANNEL(dmaNumberRx);
         SIDLE();
         RFTXRXIF = 0;
         INT_GLOBAL_ENABLE(FALSE);
         DMA_ARM_CHANNEL(dmaNumberTx);
         STX();
         INT_GLOBAL_ENABLE(TRUE);
         sppTxStatus = TX_IN_PROGRESS;

         if(pPacketPointer->flags & DO_ACK)
         {
            pAckData = pPacketPointer;
            waitForAck();
         }
         else
         {
            pAckData = NULL;
         }
         RFIM |= IRQ_DONE;
      }
      // The "air" is busy
      else
      {
         res = CHANNEL_BUSY;
         RFIM &= ~IRQ_DONE;
         // 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_DONE)
   {
      if(sppTxStatus == TX_IN_PROGRESS)
      {
         if(pAckData == NULL)
         {
            sppTxStatus = TX_SUCCESSFUL;
         }
         else
         {
            DMA_ARM_CHANNEL(dmaNumberRx);
         }
      }

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

   }
   INT_GLOBAL_ENABLE(INT_ON);
}





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

   sppRxStatus = RX_WAIT;

   DMA_ABORT_CHANNEL(dmaNumberRx);
   // Setting the address to where the received data are to be written. // Setting max number of bytes to receive
   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);

   // Debug:
   SIDLE();

   RFIF &= ~IRQ_SFD;
   RFIM |= IRQ_SFD;
   // Turning on the receiver
   SRX();

   return;
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩女同互慰一区二区| 精品视频一区二区三区免费| 蜜桃一区二区三区在线观看| 亚洲视频小说图片| 亚洲欧洲中文日韩久久av乱码| 久久久久亚洲蜜桃| 精品国产免费一区二区三区香蕉| 欧美日韩国产片| 欧美日韩国产欧美日美国产精品| 在线成人午夜影院| 欧美一级在线视频| 久久久久国产成人精品亚洲午夜| 久久蜜桃一区二区| 中文字幕成人在线观看| 日本一区二区高清| 亚洲码国产岛国毛片在线| 一区二区三区鲁丝不卡| 亚洲国产一区二区a毛片| 午夜精品一区二区三区免费视频| 午夜精品久久久久影视| 蜜桃视频在线一区| 国产福利一区二区三区视频在线| 国产馆精品极品| 91麻豆高清视频| 欧美男同性恋视频网站| 精品电影一区二区三区| 中文字幕免费一区| 亚洲国产一区视频| 国产综合一区二区| 99久久精品国产精品久久| 在线观看亚洲一区| 精品毛片乱码1区2区3区| 国产欧美一区二区精品久导航 | 久久精品国产一区二区三| 久久精品国产77777蜜臀| 高清视频一区二区| 欧美三级在线看| 久久色在线视频| 尤物在线观看一区| 韩国理伦片一区二区三区在线播放| 成人动漫中文字幕| 91麻豆精品国产| 国产精品久久午夜| 天堂av在线一区| 不卡一区二区中文字幕| 6080国产精品一区二区| 国产精品久久久久影院老司| 日韩成人精品在线| 色先锋aa成人| 精品国产一区二区三区久久久蜜月| 专区另类欧美日韩| 国产一区91精品张津瑜| 6080国产精品一区二区| 一区二区三区欧美久久| 粉嫩aⅴ一区二区三区四区五区| 欧美精品日韩一本| 亚洲人成电影网站色mp4| 国产裸体歌舞团一区二区| 欧美酷刑日本凌虐凌虐| 亚洲男人的天堂在线aⅴ视频| 黄页网站大全一区二区| 欧美精品丝袜久久久中文字幕| 亚洲视频中文字幕| 本田岬高潮一区二区三区| 欧美精品一区二区三区一线天视频| 香港成人在线视频| 色婷婷久久久亚洲一区二区三区| 中文字幕免费在线观看视频一区| 激情久久久久久久久久久久久久久久| 欧美色大人视频| 亚洲欧美日韩国产一区二区三区 | 日本高清视频一区二区| 国产丝袜美腿一区二区三区| 美女视频一区在线观看| 欧美精品v国产精品v日韩精品| 一区二区三区中文在线观看| 99久久婷婷国产| 国产精品久久久久7777按摩| 国产91精品一区二区麻豆网站 | 色婷婷av一区二区三区之一色屋| 国产精品高潮呻吟久久| 成人av电影在线播放| 中文字幕一区二区三区精华液 | 欧美肥大bbwbbw高潮| 亚洲精品写真福利| 欧美丝袜第三区| 亚洲成人免费在线观看| 亚洲精品在线免费观看视频| 不卡av免费在线观看| 欧美日韩第一区日日骚| 亚洲成人动漫在线免费观看| 欧美丰满美乳xxx高潮www| 蜜臀av国产精品久久久久| 日韩欧美视频一区| 丰满亚洲少妇av| 亚洲视频一区二区在线| 欧美体内she精视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美精品一区二区三区四区| 青青草精品视频| 久久久www成人免费无遮挡大片| 成人精品国产一区二区4080| 亚洲免费观看高清完整版在线观看熊| 欧洲精品视频在线观看| 免费一区二区视频| 中文字幕免费不卡| 欧美日韩中文字幕一区二区| 精品亚洲欧美一区| 国产精品蜜臀在线观看| 欧美日韩另类一区| 精品一区二区三区影院在线午夜| 国产精品国产三级国产普通话蜜臀| 91黄视频在线| 国产精品中文字幕欧美| 亚洲激情图片小说视频| 日韩精品一区在线观看| 91美女蜜桃在线| 六月丁香综合在线视频| 亚洲免费高清视频在线| 欧美tk—视频vk| 在线日韩av片| 国产精品中文字幕日韩精品 | 欧美视频一区在线观看| 极品尤物av久久免费看| 国产精品进线69影院| 日韩一区二区在线播放| 成人毛片老司机大片| 蜜臀av一区二区在线免费观看| 国产精品久久久久久妇女6080| 91精品国产色综合久久不卡蜜臀 | 欧美精品一区二区三区蜜臀| 91国偷自产一区二区开放时间| 国产伦精品一区二区三区在线观看| 一区二区三区在线观看网站| 国产欧美视频一区二区三区| 欧美视频在线播放| 91亚洲国产成人精品一区二区三| 久久91精品国产91久久小草 | 精品福利一二区| 欧美日韩午夜在线视频| 91在线精品一区二区三区| 国产一区二区三区蝌蚪| 秋霞国产午夜精品免费视频| 亚洲国产一区二区在线播放| 1024国产精品| 国产精品国产a| 中文字幕av在线一区二区三区| 精品国产sm最大网站| 日韩免费视频线观看| 欧美精品乱码久久久久久| 欧美私人免费视频| 欧美日韩在线播| 欧美日韩精品福利| 欧美日韩国产另类一区| 欧美性猛交xxxxxx富婆| 色婷婷亚洲婷婷| 精品视频一区 二区 三区| 欧美亚洲高清一区| 欧美三级日韩在线| 在线播放日韩导航| 日韩天堂在线观看| 精品久久久久一区二区国产| 精品国产一区二区三区久久影院| 日韩欧美三级在线| 久久久欧美精品sm网站| 久久婷婷久久一区二区三区| 久久色在线观看| 日韩一区欧美一区| 亚洲午夜一二三区视频| 婷婷综合五月天| 日韩成人精品在线| 国产精品18久久久久久久久久久久 | 高清av一区二区| 国产aⅴ综合色| av中文字幕一区| 欧洲生活片亚洲生活在线观看| 色婷婷久久久综合中文字幕 | 精品久久人人做人人爽| 久久女同精品一区二区| 亚洲女与黑人做爰| 亚洲123区在线观看| 国产一区二三区| 91香蕉国产在线观看软件| 欧美手机在线视频| xnxx国产精品| 一区二区三区中文字幕在线观看| 日韩国产一区二| 99视频精品全部免费在线| 精品视频一区二区不卡| 国产三级精品三级在线专区| 亚洲欧美一区二区三区国产精品 | 青椒成人免费视频| 成人av小说网| 4438成人网| 亚洲欧美中日韩| 精品一区中文字幕| 欧美综合一区二区| 国产欧美精品在线观看| 性做久久久久久免费观看欧美| 国产盗摄女厕一区二区三区|