📄 rfdesign.c
字号:
//-----------------------------------------------------------------------------
// Wireless Voice Transmitter/Receiver
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <c8051f330.h> // SFR declarations
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // speed of internal clock
#define SAMPLE_RATE 16000 // sampling rate for the ADC
#define BAUDRATE 76800 // Baud rate of UART in bps
#define ADC_DAC_FIFOSIZE 90 // Size of ADC/DAC FIFOs
#define RX_TX_FIFOSIZE 60 // Size of UART FIFOs
#define DACUPDATERATE 8000 // rate of DAC sample output
// Transmission-Related Constants
#define DATA_BYTES_PER_TRANSMISSION 20 // bytes TX per Transmit Session
#define TX_BYTES_OF_PREAMBLE 7 // bytes of 0x55 TX per Transmit Session
#define TX_WAKEUP_BYTES 20 // for first TX for RX detection
// and calibration
#define RX_MODE 0 // used to set UART_MODE to RX
#define TX_MODE 1 // used to set UART_MODE to TX
#define RX_MINIMUM_PREAMBLE_BAUDS 40 // number of preamble bauds that
// must be detected before the
// averaging filter locks
#define EDGES_TO_DISREGARD 20 // used by PCA interrupt during TX-to-RX
// transitions to avoid invalid data
#define BAUDTOLERANCE 9 // used for baud measurements:
// baudtol./10 < width < 20-baudtol./10
#define STARTUP_SILENCE 30 // to avoid audbile "pop" at beginning
// transmission:
// STARTUP_SILENCE * DACUPDATERATE
// seconds of silence
// Wake up Constants
#define RSSI_THRESHOLD 80 // wake-up amplitude level for RSSI
// in ADC codes
#define AUDIO_THRESHOLD 720 // wake-up amp. level for audio input
// in ADC codes
// Shutdown Constants
#define CHANGE_IN_VOLUME 8 // sets window for quiet signal
// detection in ADC codes. sample is
// compared to center saved
#define SHUTDOWN_TOLERANCE 4000 // value +/- C_I_V sets number of
// consecutive samples that must fall
// within window before shutdown
// sequence begins
#define TRANSITION_COMPLETE 4 // used to test for 250 us elapsed time
// during RX-to-TX and TX-to_RX
// transitions.
// TRANSITION COMPLETE =
// (SAMPLE_RATE * 25) / 100000
// CSVD Constants
#define DELTAMAX 200 // adjusts the magnitude of delta value
// change
#define DELTAMIN 10 // sets minimum delta value
#define I1_TIMECONST 4 // sets speed of output change
// I1 = I1_TIMECONST/SAMPLE_RATE sec
#define I2_TIMECONST 5 // sets speed of delta changes
// I2 = I2_TIMECONST/SAMPLE_RATE sec
//-----------------------------------------------------------------------------
// CC1000 Registers
//-----------------------------------------------------------------------------
#define MAIN 0x00
#define FREQ_2A 0x01
#define FREQ_1A 0x02
#define FREQ_0A 0x03
#define FREQ_2B 0x04
#define FREQ_1B 0x05
#define FREQ_0B 0x06
#define FSEP1 0x07
#define FSEP0 0x08
#define CURRENT 0x09
#define FRONT_END 0x0A
#define PA_POW 0x0B
#define PLL 0x0C
#define LOCK 0x0D
#define CAL 0x0E
#define MODEM2 0x0F
#define MODEM1 0x10
#define MODEM0 0x11
#define MATCH 0x12
#define FSCTRL 0x03
#define PRESCALER 0x1C
#define TEST4 0x42
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F33x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 IDA0 = 0x96; // IDAC0 data
sfr16 ADC0 = 0xbd; // ADC0 data
sfr16 ADC0GT = 0xc3; // ADC0 Greater-Than
sfr16 ADC0LT = 0xc5; // ADC0 Less-Than
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
sfr16 PCA0CP1 = 0xe9; // PCA0 Module 1 Capture/Compare
sfr16 PCA0CP2 = 0xeb; // PCA0 Module 2 Capture/Compare
sfr16 PCA0 = 0xf9; // PCA0 counter
sfr16 PCA0CP0 = 0xfb; // PCA0 Module 0 Capture/Compare
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void); // initialize system clock to 24.5 MHz
void PORT_Init (void); // initialize crossbar
void ADC0_Init (void); // ADC captures on Tmr2 overflows
// interrupts enabled
void PCA0_Init(void); // edge-triggered interrupts
void Timer0_Init(void); // used for WaitUS()
void Timer2_Init (unsigned int); // ADC start-of-conversion clock source
void Timer3_Init(unsigned int); // sets DAC output rate
void IDAC0_Init(void); // enables IDAC output on P0.1
void UART0_Init (void); // set to BAUDRATE, interrupts enabled
void SPI_Init(void); // enable 3-wire Master SPI
void Timer3_ISR (void); // updates the DAC
void UART0_ISR (void); // RX and TX with RF transceiver
void ADC0_ISR (void); // checks for a quiet signal,
// pushes samples onto ADCRXFIFO
// FIFO Routines
unsigned char UTXFIFO_Pull(); // pulls compressed sample to be TXed
unsigned char URXFIFO_Pull(); // pulls RXed compressed sample
unsigned short ADCRXFIFO_Pull(); // pulls ADC sample
unsigned short DACTXFIFO_Pull(); // pulls decompressed sample
void UTXFIFO_Push(unsigned char); // pushes compressed sample to be TXed
void URXFIFO_Push(unsigned char); // pushes RXed compressed sample
void ADCRXFIFO_Push(unsigned short); // pushes ADC sample
void DACTXFIFO_Push(unsigned short); // pushes decompressed sample
void CLEAR_FIFOS(void); // resets all FIFOs to default values
// CVSD Compression Algorithms
void RXalgorithm(void); // Compresses an ADC sample
void TXalgorithm(void); // Decompresses received samples
// RF Transceiver Register Routines
void SETREG(unsigned char, unsigned char);
// updates register to value parameter
unsigned char READREG(unsigned char); // return register value
void C1000_LOCK_FILTER(void); // locks Averaging Filter
void C1000_UNLOCK_FILTER(void); // sets Avg. Filter to free-running
void C1000_Init(void); // initializes RF transceiver
void C1000_RX_MODE(void); // sets RF transceiver settings to RX
void C1000_TX_MODE(void); // sets RF transceiver settings to TX
void C1000_POWERDOWN(void); // shuts down components of the RF
// transceiver to conserve power
void ASLEEP(void); // function that runs when the
// communications channel is idle
void WaitUS(unsigned int); // function will delay controller
// for a set number of microseconds
//-----------------------------------------------------------------------------
// User-Defined Types
//-----------------------------------------------------------------------------
typedef union USHORT { // access a short variable as two
unsigned short S; // 8-bit integer values
unsigned char C[2];
} USHORT;
// This struct is used for the 8-bit data frame UART fifos
struct CHAR_FIFO_ST
{
unsigned char EMPTY; // empty = 1 means the fifo is empty
unsigned char FIRST; // index to element to be pulled next
unsigned char LAST; // index to elmnt most recently pushed
signed short COUNT; // saves number of elements in FIFO
unsigned char OF; // overflow indicator
unsigned char FIFO[RX_TX_FIFOSIZE]; // array to store elements
};
// This struct is used for ADC and DAC data, which require 16-bit precision
struct SHORT_FIFO_ST
{
unsigned char EMPTY; // empty = 1 means the fifo is empty
unsigned char FIRST; // index to element to be pulled next
unsigned char LAST; // index to elmnt most recently pushed
signed short COUNT; // saves number of elements in FIFO
unsigned char OF; // overflow indicator
unsigned short FIFO[ADC_DAC_FIFOSIZE];
// array to store elements
};
/*
RX State Machine States
RX_UNCALIBRATED
Averaging Filter has not been locked
RX_SEARCH_FOR_SYNCBYTE
inside PCA ISR measuring bit widths
RX_DATA
state spent in UART ISR receiving data bytes
*/
enum RX_STATES {RX_UNCALIBRATED, RX_SEARCH_FOR_SYNCBYTE, RX_DATA};
/*
TX State Machine States
TX_UNCALIBRATED
state where wake-up bytes are sent
TX_PREAMBLE_BAUDS
transmit preamble bauds
TX_SYNCBYTE
transmit Sync byte
TX_DATA
transmit data
*/
enum TX_STATES {TX_UNCALIBRATED, TX_PREAMBLE_BAUDS, TX_SYNCBYTE, TX_DATA};
/*
Shutdown State Machine States
NO_ENDPOINTS_QUIET
transmission should continue, channel is active
ONE_ENDPOINT_QUIET
either remote or local endpoint's voice signal is considered quiet, and
is ready to shutdown
BOTH_ENDPOINTS_QUIET
both endpoints' voice signals are quiet, power down
RF transceivers
POWERING_DOWN
transmission should immediately terminate
*/
enum SHUTDOWN_STATES {NO_ENDPOINTS_QUIET, ONE_ENDPOINT_QUIET,
BOTH_ENDPOINTS_QUIET, POWERING_DOWN};
//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------
sbit PALE = P0^3; // indicates to RF transceiver whether
// SPI data is a register read or write
// FIFOs
// FIFOs are stored in 512-byte XDATA space
// All FIFOs are initialized to be empty
struct SHORT_FIFO_ST xdata DACTXFIFO = {{1}};
struct SHORT_FIFO_ST xdata ADCRXFIFO = {{1}};
struct CHAR_FIFO_ST xdata URXFIFO = {{1}};
struct CHAR_FIFO_ST xdata UTXFIFO = {{1}};
// RX/TX State Machine variables, flags
unsigned char RX_STATEMACHINE; // used in PCA ISR and UART ISR
unsigned char TX_STATEMACHINE; // used in UART ISR
unsigned short EDGES_THIS_SESSION; // counts edges at the beginning of
// an RX session
bit UART_MODE; // indicates RX/TX: TX = 1, RX = 0
bit RUN_ASLEEP = 1; // if set, channel is idle and
// ASLEEP() should run
bit TX_IN_PROGRESS; // indicates whether or not a TX
// session has started
bit RX_IN_PROGRESS;
unsigned short ADC_LOW; // counts consecutive ADC samples
// that fall within quiet signal window
unsigned short CENTER_OF_WINDOW; // saves center value for ADC window
// calculations
unsigned char LOCAL_SHUTDOWN_STATE; // saves micro's shutdown state
unsigned char REMOTE_SHUTDOWN_STATE; // saves other micro's shutdown state,
// received from UART
unsigned char TRANSITIONCOUNT; // measures time between RX/TX
// register calls to update and when
// the transition will take effect
bit TRANSITION_IN_PROGRESS; // indicates RX/TX transition
bit TO_TX_INDICATOR; // equals 1 for RX->TX and 0 for TX->RX
// RX Algorithm Variables
bit INIT_RX_ALGORITHM;
// TX Algorithm Variables
bit INIT_TX_ALGORITHM;
short accumulate; // used to create a LPF on DAC output
// DAC ISR variable
unsigned short DACstartupTimer; // counts first STARTUP_SILENCE
// interrupts
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
PORT_Init(); // initialize and enable the Crossbar
SYSCLK_Init(); // initialize oscillator
Timer0_Init();
Timer2_Init(SYSCLK/SAMPLE_RATE); // initialize timer to overflow
// at SAMPLE_RATE
ADC0_Init(); // ADC samples on Timer 2 interrupts
SPI_Init(); // init
Timer3_Init(SYSCLK/DACUPDATERATE); // initialize timer 3 to overflow at
// DACUPDATERATE
PCA0_Init(); // initialize PCA0 module 0 for
// edge-triggered interrupts
IDAC0_Init(); // enable DAC outputs at P0.1
C1000_Init(); // initalize the transceiver
UART0_Init(); // initialize UART
while (1)
{
while (RUN_ASLEEP){ASLEEP();} // RUN_ASLEEP is set on start-up
// and when the communications channel
// switches from active to idle during
// the shutdown procedure
if (!ADCRXFIFO.EMPTY) // The compression algorithm should run
RXalgorithm(); // any time samples exist to compress
if ((!URXFIFO.EMPTY)) // Decompress received samples when
TXalgorithm(); // available
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -