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

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

?? rfmodem_cc1020.c

?? CC1020的源代碼,詳細介紹CC1020的配置和開發,
?? C
字號:
/****************************************************************************/
/* Reference design : CC1020 RF Modem                                       */
/*                                                                          */
/* File:    rfmodem_cc1020.c                                                */
/*                                                                          */
/* Microcontroller:                                                         */
/*          Microchip PIC16F876                                             */
/*                                                                          */
/* Author:  Karl H. Torvmark, Field Applications Engineer, Chipcon          */
/*          Torgeir Sundet, FAE - Software                                  */
/*                                                                          */
/* Contact: Chipcon AS +47 22 95 85 44                                      */
/*          support@chipcon.com                                            */
/****************************************************************************/


/****************************************************************************/
/* Description:                                                             */
/*                                                                          */
/* This application note presents a software and hardware reference design  */
/* for the CC1020. This software can serve as a starting point for          */
/* developing custom software. A full protocol is implemented, with         */
/* provisions for addressing, error checking etc.                           */
/*                                                                          */
/* This software contains routines for detecting the preamble, searching    */
/* for the start-of-frame (SOF) marker and doing byte synchronisation,      */
/* and reading and handling header data such as the packet length.          */
/*                                                                          */
/* The software also contains all necessary routines to configure the       */
/* CC1020, and demonstrates how to read and write data to the data          */
/* interface. Configuration data is stored in non-volatile EEPROM memory,   */
/* so that changes are preserved even when power is removed. Easy           */
/* modification of parameters such as RF frequency and data rate is         */
/* supported through a configuration menu.                                  */
/*                                                                          */
/****************************************************************************/

/*                                                                           *
 * Revision history:                                                         *
 *                                                                           *
 * $Log: rfmodem_cc1020.c,v $
 * Revision 1.2  2003/09/17 15:03:07  tos
 * Mod's:
 *   - introduced new menu option ('J'): access (w/r) CC1020 register.
 *   - update EEPROM variable+table upon register write access ('J').
 *   - introduced new configuration option ('I'): preamble length.
 *   - moved TX buffer initialisation after configuration.
 *   - corrected inconsistent number conversion funtion.
 *
 * Revision 1.1  2003/07/31 13:17:30  tos
 * Initial version in CVS.
 *
 *
 *                                                                           *
 ****************************************************************************/

#include "io16f876.h"
#include "inpic.h"
#include "CC1020.h"
#include "modemhw.h"
#include "configure.h"
#include "main.h"
#include "simpleio.h"
#include <stdio.h>

#define INTERRUPT_VECTOR 0x04

// The wrap-around functionality has been optimised by ANDing with a bit mask. 
// Please note that if RX_BUFFER_SIZE is to be changed, the lines of code which
// do this must also be changed.

// Variables

// Unit address is not used
extern __eeprom char UnitAddress;

// Union for shifting bits in or out of the CC1020
union {
  char ShiftReg;
  struct {
    unsigned char ShiftRegLSB :1;
    unsigned char :1;
    unsigned char :1;
    unsigned char :1;
    unsigned char :1;
    unsigned char :1;
    unsigned char :1;
    unsigned char ShiftRegMSB :1;
  };
};
                                 
// Buffers for transmitted and received data
// These are put into different banks so that they can be as large as possible
// The TX buffer is filled up with data to be sent in the next data packet
// The RX buffer is a ring buffer in which received data is stored waiting to be
// sent to the UART

volatile __bank1 char TXBuffer[TX_BUFFER_SIZE];
volatile __bank2 char RXBuffer[RX_BUFFER_SIZE];

// Index pointers for use with buffers 
volatile char TXBufferIndex;
char RXBufferReadIndex;
volatile char RXBufferWriteIndex;

// Counter variables
char PreambleCount;
char PreambleError;
char ByteCounter;
char BitCounter;

// Contains the total number of bytes to send in TX, including preamble and header
char BytesToSend;
// The number of bytes of data to receive in RX
char BytesToReceive;

// State variable stores the current state of the state machine
volatile enum StateType State;

// This variable stores the state to switch to
// It is updated by the interrupt routine, while the main program
// does the actual state switch
volatile enum StateType NextState;

// This struct stores various flags in a space-efficient manner
volatile struct
{
  unsigned char PreambleFound:1;
  unsigned char UI1Found:1;
  unsigned char LastPreambleBit:1;
  unsigned char FreezeAGCLevel:1;
  unsigned char ReleaseAGCLevel:1;
  unsigned char LastDataBit:1;
};


// This routine initialises the TX buffer at startup
void InitializeTXBuffer(void)
{
  char i;

  // Put preamble into buffer
  for(i=0;i<PreambleLength;i++){
    TXBuffer[i]=PREAMBLE_BYTE;
  }

  TXBuffer[PreambleLength+0]=UI1;            // First byte of unique identifier
  TXBuffer[PreambleLength+1]=UI2;            // Second byte of unique identifier
  TXBuffer[PreambleLength+2]=UnitAddress;    // Unit address
  TXBuffer[PreambleLength+3]=0x00;           // Data length, default : no data
}


// This routine handles setup needed when changing states
void ChangeState(void)
{
  switch(NextState){
    case RX_STATE:
      if(State==TX_STATE){
        OPTION=0xC0;        // INT on rising edge
        TRISC|=0x02;        // Set DIO as input
        SetupCC1020RX(RXANALOG, PA_POWER);
      }

      State=RX_STATE;

      SET_RXLED(ON);
      SET_TXLED(OFF);
      READY=1;  // HW Handshake : Not Ready

      BitCounter=0;
      ByteCounter=0;
      break;

    case TX_STATE:
      if(State!=TX_STATE){
        OPTION=0x80;        // INT on falling edge
        TRISC&=~(0x02);     // Set DIO as output
        SetupCC1020TX(TXANALOG, PA_POWER);
      }

      State=TX_STATE;

      SET_RXLED(OFF);
      SET_TXLED(ON);
      READY=1;  // HW Handshake : Not Ready
      RCIE=0;   // Disable UART Interrupts

      BytesToSend=TXBufferIndex; // Number of bytes to send

      TXBuffer[PreambleLength+3]=BytesToSend-HEADER_SIZE-PreambleLength;

      LastDataBit = FALSE;
      TXBufferIndex=0;
      BitCounter=0;
      ShiftReg=TXBuffer[TXBufferIndex++];
      break;

    case IDLE_STATE:
      if(State==TX_STATE){
        OPTION=0xC0;        // INT on rising edge
        TRISC|=0x02;        // Set DIO as input
        SetupCC1020RX(RXANALOG, PA_POWER);
      }

      State=IDLE_STATE;

      SET_RXLED(OFF);
      SET_TXLED(OFF);
      READY=0;  // HW Handshake : Ready
      RCIE=1;   // Enable UART Interrupts

      TXBufferIndex=HEADER_SIZE+PreambleLength;
      PreambleCount=0;
      PreambleError=0;
      PreambleFound=FALSE;
      UI1Found=FALSE;
      break;
  }
}



// Main program
void main(void)
{
  char dummy;
  volatile int i;
  volatile char PacketCount = 0;

  PORTC=0x00;
  TRISC=0x92;

  PORTB=0x00;
  TRISB=0xFD;

  PORTA=0x00;
  TRISA=0x0B;

  ADCON0=0x89;  
  ADCON1=0x84;

  TXSTA=0x24;
  RCSTA=0x90;
  SPBRG=10;  // 10.0000MHz, 57600baud

  TMR1L=0x00;
  TMR1H=0x00;
  T1CON=0x31; // Enable timer 1

  #ifdef SPI
  // Configure SPI
  SetupCC1020ForSPI();
  #endif

  //PIE1=0x21; // UART and timer 1 enabled

  PIE1=0x00;

  // Timer 2 time-out value
  // Set to 10ms at 10MHz = 25000 instructions
  T2CON=0x4B;
  PR2=0xFF;

  PSEL=1;

  RXBufferReadIndex=0;
  RXBufferWriteIndex=0;

  SetupCC1020PD();
  ResetCC1020();

  SetupCC1020All();

  WakeUpCC1020ToTX(TXANALOG);
  OPTION=0x80;        // INT on falling edge
  TRISC&=~(0x02);     // Set DIO as output
  if (!CalibrateCC1020(PA_POWER))
    writeln("TX Calibration failed");
  // Calibration data is stored in the chip indexed by the selected frequency register 

  WakeUpCC1020ToRX(RXANALOG);
  OPTION=0xC0;        // INT on rising edge
  TRISC|=0x02;        // Set DIO as input
  if (!CalibrateCC1020(PA_POWER))
    writeln("RX Calibration failed");

  // Now the CC1020 is calibrated for both RX and TX, we do not need to recalibrate
  // unless the frequency is changed, the temperature changes by 40 degrees C
  // or if the supply voltage changes by more than 0.5V 

  // Force update
  State=TX_STATE;
  NextState=IDLE_STATE;

  // Set all buttons to light, if we want to turn them off, we set them as inputs to avoid
  // the output being shorted to VDD if a button is pressed
  CARRIER_LED=0;
  RD_LED=0;
  TD_LED=0;

  dummy=TRISA;
  TRISA|=0x24;
  if(BUTTON1==0){
  }
  if(BUTTON2==0){
    ConfigurationMode();
  }

  InitializeTXBuffer();

  TRISA=dummy;

  AWAKE=0;
  SYNC=0;

  ReleaseAGCLevel=FALSE;
  FreezeAGCLevel=FALSE;
  LastDataBit = FALSE;

  // Startup message
  writeln("RF Modem ready");
  writestr("Compiled ");
  writestr(__DATE__);
  writestr(" ");
  writestr(__TIME__);
  writeln("");

  if((ReadFromCC1020Register(CC1020_ANALOG)&0x80)==0x80){
    writestr("804-940 MHz band");
  }else{
    writestr("402-470 MHz band");
  }

  writestr(", 4.8 kbit/s");
  if((ReadFromCC1020Register(CC1020_MODEM)&0x03)==0x01){
    writestr(", Manchester mode");
  }else{
    writestr(", NRZ mode");
  }

  writeln("");

  INTCON=0x90;

  // Monitor input from UART+RF+BUTTONS and select corresponding state:
  while(1){    
    // If new state requested, enter requested state
    if(State!=NextState){
      ChangeState();
    }

    // If received RF data, send it to the serial port
    if(RXBufferReadIndex!=RXBufferWriteIndex){
      putchar(RXBuffer[RXBufferReadIndex]);
      //RXBufferReadIndex=(RXBufferReadIndex+1)%RX_BUFFER_SIZE;
      RXBufferReadIndex++;
      RXBufferReadIndex&=0x3F;
    }

    // If received UART data and RF in IDLE state, copy UART data into RF packet
    if(RCIF==1){
      if(State==IDLE_STATE){
        TMR2=0;   // Reset time-out timer
        TMR2ON=1; // Start time-out timer

        // TODO : Handle framing and overflow errors
        if(OERR){
          TXEN=0;
          TXEN=1;
          CREN=0;
          CREN=1;
        }
        if(FERR){
          dummy=RCREG;
          TXEN=0;
          TXEN=1;
        }

        TXBuffer[TXBufferIndex++]=RCREG;

        // IMPORTANT:
        // We may have another interrupt or two occur before we can change mode.
        // Therefore, leave safety margin!
        if(TXBufferIndex>=(TX_BUFFER_SIZE-3)){
          NextState=TX_STATE;
        }

        RCIF=0;
      }
    }

    // If Timer-2 timeout (since received last UART data)
    if(TMR2IF==1){
      // Request TX state to send last UART data via RF
      TMR2ON=0;
      TMR2IE=0;
      NextState=TX_STATE;
      TMR2IF=0;
    }

    // If Timer-1 timeout and buttons pressed
    if(TMR1IF==1){
      // Copy fixed character into RF packet and request TX state:
      dummy=TRISA;
      TRISA|=0x24;  // Set port to read button status 

      if(State==IDLE_STATE){
        if(BUTTON1==0){
          PacketCount = ((PacketCount+1 > 9) ? 0 : (PacketCount+1));
          TXBuffer[TXBufferIndex++]=Button1Char;
          TXBuffer[TXBufferIndex++]=PacketCount+'0';
          TXBuffer[TXBufferIndex++]=' ';
          NextState=TX_STATE;
        }
        if(BUTTON2==0){
          PacketCount = ((PacketCount+1 > 9) ? 0 : (PacketCount+1));
          TXBuffer[TXBufferIndex++]=Button2Char;
          TXBuffer[TXBufferIndex++]=PacketCount+'0';
          TXBuffer[TXBufferIndex++]=' ';
          NextState=TX_STATE;
        }
      }

      TRISA=dummy;  // Set port back to LED operation 
      TMR1IF=0;
    }

  }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区精品视频| 久久久久9999亚洲精品| 成人黄色在线看| 老司机精品视频导航| 五月婷婷综合网| 亚洲二区视频在线| 亚洲第一福利一区| 午夜久久久影院| 肉肉av福利一精品导航| 秋霞成人午夜伦在线观看| 奇米精品一区二区三区在线观看一| 亚洲成人资源在线| 日韩电影网1区2区| 国产综合久久久久影院| 国产精品一品视频| 91在线视频网址| 99精品热视频| 五月激情综合婷婷| 国产精品一区二区在线播放| 日韩一二在线观看| 男男成人高潮片免费网站| 日本aⅴ免费视频一区二区三区| 欧美aⅴ一区二区三区视频| 蜜桃视频免费观看一区| 国产乱人伦精品一区二区在线观看| 国产一区激情在线| caoporen国产精品视频| 欧美系列在线观看| 欧美一级精品在线| 国产精品久久网站| 亚洲观看高清完整版在线观看| 日本亚洲电影天堂| 国产91精品在线观看| 在线视频一区二区三| 久久综合精品国产一区二区三区 | 国产精品高潮呻吟久久| 亚洲成a人片在线观看中文| 麻豆极品一区二区三区| 91日韩在线专区| 7777精品久久久大香线蕉| 国产欧美一区二区精品性色超碰| 亚洲欧美乱综合| 国产在线视频一区二区三区| 97久久精品人人做人人爽50路| 欧美日韩一区精品| 欧美国产成人精品| 秋霞国产午夜精品免费视频| 一本久久精品一区二区| 久久综合色鬼综合色| 一区二区久久久久久| 国产盗摄精品一区二区三区在线| 欧美三片在线视频观看| 国产精品视频一二三| 亚洲国产精品久久人人爱蜜臀| 精品一区二区三区在线观看| 日本久久电影网| 国产日韩欧美精品电影三级在线| 一级日本不卡的影视| 成人自拍视频在线观看| 日韩欧美在线1卡| 亚洲va中文字幕| 91一区二区在线观看| 久久精品欧美日韩| 狠狠色丁香久久婷婷综合丁香| 色欧美乱欧美15图片| 国产精品嫩草久久久久| 国产在线播放一区二区三区| 这里只有精品99re| 亚洲成人精品影院| 欧美日韩五月天| 亚洲精品乱码久久久久| 99国产精品久久| 国产精品久久久久久久久免费樱桃 | 成人午夜视频在线观看| 精品国产乱码久久久久久老虎| 三级欧美在线一区| 91精品婷婷国产综合久久竹菊| 亚洲一区二区三区四区的| 欧美影片第一页| 亚洲一区二区黄色| 欧美性高清videossexo| 亚洲国产精品麻豆| 欧美一区二区在线不卡| 奇米色一区二区| 亚洲精品在线观看视频| 国产老女人精品毛片久久| 国产日韩欧美激情| 91在线国产福利| 亚洲欧美色综合| 91福利在线导航| 首页综合国产亚洲丝袜| 欧美videos中文字幕| 国产一区二区三区免费观看| 久久精品免视看| 91黄色免费观看| 日韩电影一二三区| 国产欧美一区二区精品久导航| 99久久精品国产毛片| 亚洲亚洲精品在线观看| 欧美一区二区三区人| 国产精品1024| 亚洲综合在线观看视频| 91精品国产全国免费观看| 国产一区二三区| 综合久久给合久久狠狠狠97色| 欧美天堂一区二区三区| 蜜臀久久99精品久久久久久9| 久久久不卡影院| 91国在线观看| 久久99在线观看| ㊣最新国产の精品bt伙计久久| 欧美午夜精品久久久久久孕妇| 久久国产日韩欧美精品| 亚洲视频一区二区在线观看| 综合激情成人伊人| 欧美肥妇毛茸茸| 国产91精品露脸国语对白| 一区二区三区欧美视频| 欧美一级一区二区| 成人av免费在线观看| 蜜臀av一级做a爰片久久| 国产精品成人免费精品自在线观看| 欧美日韩国产免费| 成人精品在线视频观看| 久久国产精品区| 国产麻豆91精品| 精品一区二区三区日韩| 亚洲精品乱码久久久久久日本蜜臀| 欧美午夜寂寞影院| 不卡区在线中文字幕| 蜜臀久久99精品久久久画质超高清| 国产精品理论在线观看| 日韩免费观看高清完整版 | 国产一区视频在线看| 午夜欧美在线一二页| 中文字幕亚洲欧美在线不卡| 欧美tickling网站挠脚心| 欧美自拍偷拍一区| 99久久99精品久久久久久| 国产九九视频一区二区三区| 无吗不卡中文字幕| 亚洲午夜视频在线观看| 亚洲欧美在线另类| 欧美—级在线免费片| 日韩久久久精品| 日韩一级二级三级| 欧美一区国产二区| 欧美日韩一区二区三区高清| 色婷婷精品大在线视频| 99久久精品情趣| 成人涩涩免费视频| 成人夜色视频网站在线观看| 久久电影网电视剧免费观看| 免费人成精品欧美精品| 日韩精品国产欧美| 青娱乐精品视频在线| 日韩av电影一区| 日本欧美一区二区三区乱码| 午夜一区二区三区在线观看| 一区二区三区在线视频免费观看| 国产精品久久久久久久午夜片| 国产精品麻豆久久久| 欧美国产日产图区| 中文一区一区三区高中清不卡| 中文字幕av一区二区三区| 国产欧美一二三区| 亚洲欧洲一区二区三区| 亚洲男女一区二区三区| 亚洲福利一区二区三区| 天天综合色天天综合| 蜜桃av一区二区在线观看 | 黑人巨大精品欧美一区| 国产v日产∨综合v精品视频| 波多野结衣欧美| 欧美在线观看视频一区二区| 在线播放日韩导航| 精品国产乱码久久久久久1区2区| 欧美精品一区二区精品网| 中文字幕在线一区二区三区| 亚洲综合网站在线观看| 视频一区二区三区入口| 国产一区啦啦啦在线观看| 99综合影院在线| 91精品国产福利| 亚洲国产精品国自产拍av| 一区二区三区资源| 免费观看成人av| av在线一区二区| 日韩美一区二区三区| 最好看的中文字幕久久| 美女视频一区在线观看| kk眼镜猥琐国模调教系列一区二区| 色噜噜狠狠成人网p站| 日韩精品一区二区三区在线播放| 久久影音资源网| 亚洲一区二区影院| 国产精品一区久久久久| 欧美午夜电影一区| 中文字幕+乱码+中文字幕一区| 五月开心婷婷久久|