?? configure.c
字號:
/****************************************************************************/
/* */
/* 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.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 v4.81
// Device: CC1020
// System parameters:
// X-tal frequency: 14.745600 MHz Internal
// X-tal accuracy: +/- 8 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: 0 dBm
// Channel width: 25 kHz
// Modulation: GFSK Dithering enabled
// Lock: Continuous
// Carrier sense offset: 0 dBm DCLK squelch disabled
// Operator Mode: Rx
// Component values, Match
// C1 = 10.0 pF
// C2 = N.A pF
// C3 = 3.9 pF
// L1 = 33.0 nH
// L2 = 15.0 nH
// Component values, LC-filter
// C71 = 18.0 pF
// C72 = 18.0 pF
// L71 = 10.0 nH
// Component values, PLL loop filter:
// R2 = 2.2 k Ohm
// R3 = 6.8 k Ohm
// C6 = 100.0 nF
// C7 = 3900.0 pF
// C8 = 1000.0 pF
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
0x87, // 0x0F, AFC_CONTROL
0x2F, // 0x10, FILTER
0x65, // 0x11, VGA1
0x57, // 0x12, VGA2
0x2F, // 0x13, VGA3
0x2D, // 0x14, VGA4
0x20, // 0x15, LOCK
0x78, // 0x16, FRONTEND
0x46, // 0x17, ANALOG, RX=46/TX=46
0x54, // 0x18, BUFF_SWING
0x22, // 0x19, BUFF_CURRENT
0xAE, // 0x1A, PLL_BW
0x35, // 0x1B, CALIBRATE
0x0E, // 0x1C, PA_POWER
0x00, // 0x1D, MATCH
0x00, // 0x1E, PHASE_COMP
0x00, // 0x1F, GAIN_COMP
0x00 // 0x20, POWERDOWN
};
const char DefaultTXANALOG433 = 0x46;
const char DefaultRXANALOG433 = 0x46;
// SmartRF Studio v4.81
// 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: 0 dBm
// Channel width: 25 kHz
// Modulation: GFSK Dithering enabled
// Lock: Continuous
// Carrier sense offset: 0 dBm DCLK squelch disabled
// Operator Mode: Rx
// Component values, Match
// C1 = 10.0 pF
// C2 = N.A pF
// C3 = 10.0 pF
// L1 = 18.0 nH
// L2 = 3.6 nH
// Component values, LC-filter
// C71 = 8.2 pF
// C72 = 8.2 pF
// L71 = 5.1 nH
// Component values, PLL loop filter:
// R2 = 2.2 k Ohm
// R3 = 6.8 k Ohm
// C6 = 100.0 nF
// C7 = 3900.0 pF
// C8 = 1000.0 pF
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
0x87, // 0x0F, AFC_CONTROL
0x2F, // 0x10, FILTER
0x65, // 0x11, VGA1
0x57, // 0x12, VGA2
0x2E, // 0x13, VGA3
0x2B, // 0x14, VGA4
0x21, // 0x15, LOCK
0x76, // 0x16, FRONTEND
0x86, // 0x17, ANALOG, RX=86/TX=87
0x50, // 0x18, BUFF_SWING
0x25, // 0x19, BUFF_CURRENT
0xAE, // 0x1A, PLL_BW
0x35, // 0x1B, CALIBRATE
0xA0, // 0x1C, PA_POWER
0xF0, // 0x1D, MATCH
0x00, // 0x1E, PHASE_COMP
0x00, // 0x1F, GAIN_COMP
0x00 // 0x20, POWERDOWN
};
const char DefaultTXANALOG868 = 0x87;
const char DefaultRXANALOG868 = 0x86;
// SmartRF Studio v4.81
// Device: CC1020
// System parameters:
// X-tal frequency: 14.745600 MHz Internal
// X-tal accuracy: +/- 8 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: 0 dBm
// Channel width: 25 kHz
// Modulation: GFSK Dithering enabled
// Lock: Continuous
// Carrier sense offset: 0 dBm DCLK squelch disabled
// Operator Mode: Rx
// Component values, Match
// C1 = 10.0 pF
// C2 = N.A pF
// C3 = 10.0 pF
// L1 = 18.0 nH
// L2 = 3.6 nH
// Component values, LC-filter
// C71 = TBD pF
// C72 = TBD pF
// L71 = TBD nH
// Component values, PLL loop filter:
// R2 = 2.2 k Ohm
// R3 = 6.8 k Ohm
// C6 = 100.0 nF
// C7 = 3900.0 pF
// C8 = 1000.0 pF
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
0x87, // 0x0F, AFC_CONTROL
0x2F, // 0x10, FILTER
0x65, // 0x11, VGA1
0x57, // 0x12, VGA2
0x2E, // 0x13, VGA3
0x2B, // 0x14, VGA4
0x21, // 0x15, LOCK
0x76, // 0x16, FRONTEND
0x86, // 0x17, ANALOG, RX=86/TX=87
0x50, // 0x18, BUFF_SWING
0x25, // 0x19, BUFF_CURRENT
0xAE, // 0x1A, PLL_BW
0x35, // 0x1B, CALIBRATE
0xA0, // 0x1C, PA_POWER
0xF0, // 0x1D, MATCH
0x00, // 0x1E, PHASE_COMP
0x00, // 0x1F, GAIN_COMP
0x00 // 0x20, POWERDOWN
};
const char DefaultTXANALOG905 = 0x87;
const char DefaultRXANALOG905 = 0x86;
// 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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -