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

📄 rfdesign.c

📁 利用c8051f系列单片机实现无线收发器的功能
💻 C
📖 第 1 页 / 共 5 页
字号:
//-----------------------------------------------------------------------------
// 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 + -