⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 configure.c

📁 无线射频收发芯片cc1020的校准程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
/*                                                                          */
/* Reference design : CC1020 RF Modem                                       */
/*                                                                          */
/* File:    configure.c                                                     */
/*                                                                          */
/* Microcontroller:                                                         */
/*          Microchip PIC16F876                                             */
/*                                                                          */
/* Author:  Karl H. Torvmark, Field Applications Engineer, Chipcon          */
/*          Torgeir Sundet, FAE - Software, Chipcon                         */
/*                                                                          */
/* Contact: Chipcon AS +47 22 95 85 44                                      */
/*          support@chipcon.com                                            */
/****************************************************************************/

/****************************************************************************/
/* This file contains routines for CC1020 configuration. The configuration  */
/* menu is implemented here.                                                */
/****************************************************************************/

/*                                                                           *
 * Revision history:                                                         *
 *                                                                           *
 * $Log: configure.c,v $
 * Revision 1.6  2005/04/21 13:02:57  tos
 * Synchronised register setting with latest SmartRF Studio version.
 *
 * Revision 1.5  2004/03/23 16:44:24  tos
 * Introduced RSSI measurement (based on algorithm in SmartRF Studio).
 *
 * Revision 1.4  2003/09/18 14:51:24  tos
 * Minor mod's:
 *  - Made AFC_CONTROL = 0x87 as default for 868/915 MHz band.
 *  - Made rf-packet extension as #define.
 *
 * Revision 1.3  2003/09/17 15:58:04  tos
 * Mod's:
 * - tuned AFC_CONTROL for optimum preamble performance.
 * - turn on TX before PA is increased.
 *
 * Revision 1.2  2003/09/17 15:03:05  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:18  tos
 * Initial version in CVS.
 *
 *
 *                                                                           *
 ****************************************************************************/
 

#include "configure.h"
#include "cc1020.h"
#include "simpleio.h"
#include "io16f876.h" // IAR-specific header file for the 16F876
#include "modemhw.h"
#include <stdio.h>    // ANSI standard header file
#include <stdlib.h>
#include <ctype.h>    // ANSI standard header file

// The configuration data for the CC1020 is stored in the EEPROM data memory
// This allows the configuration to persist even when power is shut off,
// and also prevents this data from cluttering up the SRAM data memory.

 __eeprom __no_init union {
     char EEPROMCC1020Config[32];
     struct {
      char EEPROM_INTERFACE;        // 0x01
      char EEPROM_RESET;            // 0x02
      char EEPROM_SEQUENCING;       // 0x03
      char EEPROM_FREQ_2A;          // 0x04
      char EEPROM_FREQ_1A;          // 0x05
      char EEPROM_FREQ_0A;          // 0x06
      char EEPROM_CLOCK_A;          // 0x07
      char EEPROM_FREQ_2B;          // 0x08
      char EEPROM_FREQ_1B;          // 0x09
      char EEPROM_FREQ_0B;          // 0x0A
      char EEPROM_CLOCK_B;          // 0x0B
      char EEPROM_VCO;              // 0x0C
      char EEPROM_MODEM;            // 0x0D
      char EEPROM_DEVIATION;        // 0x0E
      char EEPROM_AFC_CONTROL;      // 0x0F
      char EEPROM_FILTER;           // 0x10
      char EEPROM_VGA1;             // 0x11
      char EEPROM_VGA2;             // 0x12
      char EEPROM_VGA3;             // 0x13
      char EEPROM_VGA4;             // 0x14
      char EEPROM_LOCK;             // 0x15
      char EEPROM_FRONTEND;         // 0x16
      char EEPROM_ANALOG;           // 0x17
      char EEPROM_BUFF_SWING;       // 0x18
      char EEPROM_BUFF_CURRENT;     // 0x19
      char EEPROM_PLL_BW;           // 0x1A
      char EEPROM_CALIBRATE;        // 0x1B
      char EEPROM_PA_POWER;         // 0x1C
      char EEPROM_MATCH;            // 0x1D
      char EEPROM_PHASE_COMP;       // 0x1E
      char EEPROM_GAIN_COMP;        // 0x1F
      char EEPROM_POWERDOWN;        // 0x20
    };
};


// EEPROM variables for storing the characters sent when the buttons are pressed
__eeprom __no_init char EEPROMButton1Char;
__eeprom __no_init char EEPROMButton2Char;

// RAM variables that mirror the EEPROM variables above
__no_init char Button1Char, Button2Char;
 
// EEPROM unit address variable. Addressing is not yet implemented.
__eeprom __no_init char UnitAddress;

// EEPROM variables storing the value of the ANALOG registers in RX and TX
__eeprom __no_init char EEPROMTXANALOG;
__eeprom __no_init char EEPROMRXANALOG;
 
// RAM variables that mirror the EEPROM variables above
__no_init char TXANALOG;
__no_init char RXANALOG;

// EEPROM variables storing the PA value
__eeprom __no_init char EEPROMPA_POWER;

// RAM variables that mirror the EEPROM variables above
__no_init char PA_POWER;


// EEPROM variables storing the preamble length
__eeprom __no_init char EEPROMPreambleLength;

// RAM variables that mirror the EEPROM variables above
__no_init char PreambleLength;


// Default RF setups, stored in Flash
    
// SmartRF Studio v5.3.0.0

// Device: CC1020

// System parameters:
// X-tal frequency: 14.745600 MHz	Internal
// X-tal accuracy: +/-  5 ppm
// RF frequency A: 434.052500 MHz	Active  	Rx
// RF frequency B: 434.052500 MHz	Inactive	Tx
// Frequency separation: 4.950 kHz
// Data rate: 4.800 kBaud
// Data Format: Manchester		Accurate
// RF output power: +10 dBm
// Channel width: 25 kHz
// Modulation: GFSK		Dithering enabled
// Lock: Continuous
// Carrier sense offset:   0 dBm	DCLK squelch disabled
// Operator Mode: Rx

const char DefaultConfig433[32] =
{
  0x0F,  // 0x01, INTERFACE
  0xFF,  // 0x02, RESET
  0x8F,  // 0x03, SEQUENCING
  0x3A,  // 0x04, FREQ_2A
  0x14,  // 0x05, FREQ_1A
  0x99,  // 0x06, FREQ_0A
  0x3A,  // 0x07, CLOCK_A
  0x3A,  // 0x08, FREQ_2B
  0x1F,  // 0x09, FREQ_1B
  0x45,  // 0x0A, FREQ_0B
  0x3A,  // 0x0B, CLOCK_B
  0x44,  // 0x0C, VCO
  0x51,  // 0x0D, MODEM
  0x9B,  // 0x0E, DEVIATION
  0xC6,  // 0x0F, AFC_CONTROL
  0x2F,  // 0x10, FILTER
  0x61,  // 0x11, VGA1
  0x55,  // 0x12, VGA2
  0x2F,  // 0x13, VGA3
  0x2D,  // 0x14, VGA4
  0x20,  // 0x15, LOCK
  0x78,  // 0x16, FRONTEND
  0x47,  // 0x17, ANALOG, RX=47/TX=47
  0x14,  // 0x18, BUFF_SWING
  0x22,  // 0x19, BUFF_CURRENT
  0xAE,  // 0x1A, PLL_BW
  0x34,  // 0x1B, CALIBRATE
  0xF0,  // 0x1C, PA_POWER
  0x00,  // 0x1D, MATCH
  0x00,  // 0x1E, PHASE_COMP
  0x00,  // 0x1F, GAIN_COMP
  0x00   // 0x20, POWERDOWN
};

const char DefaultTXANALOG433 = 0x47;
const char DefaultRXANALOG433 = 0x47;


// SmartRF Studio v5.3.0.0

// Device: CC1020

// System parameters:
// X-tal frequency: 14.745600 MHz	Internal
// X-tal accuracy: +/-  8 ppm
// RF frequency A: 869.312500 MHz	Active  	Rx
// RF frequency B: 869.312500 MHz	Inactive	Tx
// Frequency separation: 4.950 kHz
// Data rate: 4.800 kBaud
// Data Format: Manchester		Accurate
// RF output power: +5 dBm
// Channel width: 25 kHz
// Modulation: GFSK		Dithering enabled
// Lock: Continuous
// Carrier sense offset:   0 dBm	DCLK squelch disabled
// Operator Mode: Rx

const char DefaultConfig868[32] =
{
  0x0F,  // 0x01, INTERFACE
  0xFF,  // 0x02, RESET
  0x8F,  // 0x03, SEQUENCING
  0x3A,  // 0x04, FREQ_2A
  0x2E,  // 0x05, FREQ_1A
  0xE5,  // 0x06, FREQ_0A
  0x3A,  // 0x07, CLOCK_A
  0x3A,  // 0x08, FREQ_2B
  0x34,  // 0x09, FREQ_1B
  0x3B,  // 0x0A, FREQ_0B
  0x3A,  // 0x0B, CLOCK_B
  0x44,  // 0x0C, VCO
  0x51,  // 0x0D, MODEM
  0x8B,  // 0x0E, DEVIATION
  0xC6,  // 0x0F, AFC_CONTROL
  0x2F,  // 0x10, FILTER
  0x61,  // 0x11, VGA1
  0x55,  // 0x12, VGA2
  0x2E,  // 0x13, VGA3
  0x2B,  // 0x14, VGA4
  0x20,  // 0x15, LOCK
  0x76,  // 0x16, FRONTEND
  0x87,  // 0x17, ANALOG, RX=87/TX=87
  0x10,  // 0x18, BUFF_SWING
  0x25,  // 0x19, BUFF_CURRENT
  0xAE,  // 0x1A, PLL_BW
  0x34,  // 0x1B, CALIBRATE
  0xB0,  // 0x1C, PA_POWER
  0xF0,  // 0x1D, MATCH
  0x00,  // 0x1E, PHASE_COMP
  0x00,  // 0x1F, GAIN_COMP
  0x00   // 0x20, POWERDOWN
};

const char DefaultTXANALOG868 = 0x87;
const char DefaultRXANALOG868 = 0x87;

// SmartRF Studio v5.3.0.0

// Device: CC1020

// System parameters:
// X-tal frequency: 14.745600 MHz	Internal
// X-tal accuracy: +/-  5 ppm
// RF frequency A: 915.000000 MHz	Active  	Rx
// RF frequency B: 915.000000 MHz	Inactive	Tx
// Frequency separation: 4.950 kHz
// Data rate: 4.800 kBaud
// Data Format: Manchester		Accurate
// RF output power: +5 dBm
// Channel width: 25 kHz
// Modulation: GFSK		Dithering enabled
// Lock: Continuous
// Carrier sense offset:   0 dBm	DCLK squelch disabled
// Operator Mode: Rx

const char DefaultConfig905[32] =
{
  0x0F,  // 0x01, INTERFACE
  0xFF,  // 0x02, RESET
  0x8F,  // 0x03, SEQUENCING
  0x3D,  // 0x04, FREQ_2A
  0x48,  // 0x05, FREQ_1A
  0x15,  // 0x06, FREQ_0A
  0x3A,  // 0x07, CLOCK_A
  0x3D,  // 0x08, FREQ_2B
  0x4D,  // 0x09, FREQ_1B
  0x6B,  // 0x0A, FREQ_0B
  0x3A,  // 0x0B, CLOCK_B
  0x44,  // 0x0C, VCO
  0x51,  // 0x0D, MODEM
  0x8B,  // 0x0E, DEVIATION
  0xC6,  // 0x0F, AFC_CONTROL
  0x2F,  // 0x10, FILTER
  0x61,  // 0x11, VGA1
  0x55,  // 0x12, VGA2
  0x2E,  // 0x13, VGA3
  0x2B,  // 0x14, VGA4
  0x20,  // 0x15, LOCK
  0x76,  // 0x16, FRONTEND
  0x87,  // 0x17, ANALOG, RX=87/TX=87
  0x10,  // 0x18, BUFF_SWING
  0x25,  // 0x19, BUFF_CURRENT
  0xAE,  // 0x1A, PLL_BW
  0x34,  // 0x1B, CALIBRATE
  0xB0,  // 0x1C, PA_POWER
  0xF0,  // 0x1D, MATCH
  0x00,  // 0x1E, PHASE_COMP
  0x00,  // 0x1F, GAIN_COMP
  0x00   // 0x20, POWERDOWN
};

const char DefaultTXANALOG905 = 0x87;
const char DefaultRXANALOG905 = 0x87;


// Configures all the CC1020 registers according to the values stored in EEPROM
void SetupCC1020All(void)
{ 
  char counter;
  char value;

  for(counter=0x01; counter<=0x20; counter++){
    value=EEPROMCC1020Config[counter-1];
    WriteToCC1020Register(counter,value);
  }

  Button1Char=EEPROMButton1Char;
  Button2Char=EEPROMButton2Char;
  TXANALOG=EEPROMTXANALOG;
  RXANALOG=EEPROMRXANALOG;
  PA_POWER=EEPROMPA_POWER;
  PreambleLength=EEPROMPreambleLength;
}


// Dumps the values of all the registers of the CC1000 to the screen
void DumpCC1020Regs(void)
{
  char RegCounter;

  writestr("Register dump:\n\r\n\r");
  for(RegCounter=0x00; RegCounter<=0x20; RegCounter++) {
    writestr("Addr. ");
    writehex(RegCounter);
    writestr(" : ");
    writehex(ReadFromCC1020Register(RegCounter));
    writeln("");
  }
}



// Lets the user select one of the default setups
void DefaultSettings(void)
{
  char i;

  writeln("Select default configuration:\n\r");
  writeln("4 - 433 MHz");
  writeln("8 - 868 MHz");
  writeln("9 - 905 MHz");
  writestr("Enter choice : ");

  i=getchar();
  writeln("");

  switch(toupper(i)){
    case '4' :
        for(i=0; i<0x20; i++){
          EEPROMCC1020Config[i]=DefaultConfig433[i];
        }
        EEPROMTXANALOG=DefaultTXANALOG433;
        EEPROMRXANALOG=DefaultRXANALOG433;
        break;

    case '8' :
        for(i=0; i<0x20; i++){
          EEPROMCC1020Config[i]=DefaultConfig868[i];
        }
        EEPROMTXANALOG=DefaultTXANALOG868;
        EEPROMRXANALOG=DefaultRXANALOG868;
        break;

    case '9' :
        for(i=0; i<0x20; i++){
          EEPROMCC1020Config[i]=DefaultConfig905[i];
        }
        EEPROMTXANALOG=DefaultTXANALOG905;
        EEPROMRXANALOG=DefaultRXANALOG905;
        break;
  }

  EEPROMButton1Char=BUTTON1_CHAR;
  EEPROMButton2Char=BUTTON2_CHAR;

  Button1Char=EEPROMButton1Char;
  Button2Char=EEPROMButton2Char;

  TXANALOG=EEPROMTXANALOG;
  RXANALOG=EEPROMRXANALOG;

  EEPROMPA_POWER = EEPROMCC1020Config[CC1020_PA_POWER-1];
  PA_POWER = EEPROMPA_POWER;

  EEPROMPreambleLength = PREAMBLE_LENGTH;

  UnitAddress=0x01;

  SetupCC1020All();

}

// Lets the user set up which characters are transmitted when the buttons are pressed
void ButtonConfig(void)
{
  writestr("Enter character to be sent when button 1 is pressed: ");
  EEPROMButton1Char=getchar();
  writeln("");
  writestr("\n\rEnter character to be sent when button 2 is pressed: ");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -