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

📄 main.c

📁 用单片机对NORDIC的无线芯片进行处理的C51程序
💻 C
📖 第 1 页 / 共 2 页
字号:
 /** @file main.c
 *
 * @author Runar Kjellhaug
 *
 * @compiler This program has been tested with Keil C51 V7.50.
 *
 * @copyright
 * Copyright (c) 2005 Nordic Semiconductor. All Rights Reserved.
 *
 * The information contained herein is confidential property of Nordic Semiconductor. The use,
 * copying, transfer or disclosure of such information is prohibited except by express written
 * agreement with Nordic Semiconductor.
 * @endcopyright
 *
 * $Date: 3.03.06 10:52 $
 * $Revision: 60 $
 *
 */
//  Global defines & includes
#include <cygnal\c8051F320.h>
#include "include\defines.h"
#include "include\usb.h"
#include "include\fwupgrade.h"
#include "include\F320_FlashPrimitives.h"
#include "include\nRF_API.h"
#include "include\ADC.h"
#include "include\TestApp.h"
#include "include\LL_API.h"
#include "include\Protocol_API.h"

code const UINT FW  = FW_VERSION;                                     // Firmware version, const..

BYTE xdata RX_buffer[USB_RX_SIZE];                                    // Last packet received from host

BYTE xdata TX_buffer[USB_TX_SIZE];                                    // Next packet to sent to host

BYTE xdata TX_pload[TX_PLOAD_MAX_WIDTH];                              // TX payload buffer
BYTE xdata RX_pload[RX_PLOAD_MAX_WIDTH];                              // RX payload buffer

BYTE xdata Table_Ptr;                                                 // Pointer for Freq_table lookup
BYTE xdata Freq_table[FREQ_TABLE_SIZE] = {2,27,52,7,32,57,12,37,
                                         62,17,42,67,22,47,72,77};    // Freq Agility table, predefined

BYTE xdata Trans_Ctrl[TRANS_PARAMS];                                  // Transmission Control bytes
BYTE xdata Freq_agil[NUM_OF_PIPES];                                   // Freq Agility On/Off for pipe.n
BYTE xdata TX_Addr[TX_ADDR_WIDTH];                                    // TX address buffer
BYTE xdata RX_pload_length[NUM_OF_PIPES];                             // holds #of bytes for pipe 0..5
BYTE xdata TX_pload_width;                                            // TX payload width variable
BYTE xdata Freq_Agil_Status;                                          // Variable that holds status of frequency agility
BYTE xdata Freq_Agil_Pipe;

BYTE xdata Button_Mode = 0;
BYTE xdata Button;                                                    // Variable that holds button index for communication
BYTE xdata SW1_Released;

//Status bytes
BYTE USB_Rx_Comp = 0;                                                 // Indicates new USB frame received
BYTE SPI_Mode = 0;                                                    // Select between HW and SW SPI
BYTE Sweep_Mode = 0;                                                  // Sweep mode on/off
BYTE Com_Mode = 2;                                                    // Communication mode on/off
BYTE IRQ_Source = 0x00;                                               // Indicates IRQ source from nRF24L01
BYTE Sweep_Progress;
BYTE Test_Mode;
BYTE Agil_Timeout;
BYTE LinkStatus[2];                                                   // Link status array, status & channel
BYTE LinkStat,LastStat;
BYTE TX_Update;
BYTE RX_Timeout;
UINT Link_Loss_Delay;                                                 // Link Loss dalay variable
BYTE Link_Loss_Status;

BYTE RX_pipe;                                                         // store RX_FIFO pipe number
BYTE byte_ctr;

// Variables used for 'Sweep_Mode'
BYTE sw_low,sw_high,next_ch;
BYTE Sweep_Time_Ctr = 0;

BYTE Trans_Tmr,Trans_Tmr_Ctr = 0;                                     // Variables for trans timer comm mode
BYTE Timer_Mode;                                                      // Variable for timer mode
BYTE Try_Ctr;                                                         // Try Counter variable
BYTE Pipe_Length;                                                     // Current RX pipe length variable
UINT CPU_temp, RF_Vdd;
BYTE Led_Blink1,Led_Blink2,Led_Blink3,Led_Blink4;
BYTE T2_State;

//--------------------------------------------------------------------
// Main Routine
//--------------------------------------------------------------------
void main(void)
{
  CPU_Init();

  while (TRUE)
  {
#ifdef _TESTMODE_
    while (!USB_Rx_Comp)                                              // wait for USB command
    {
      if(!SW1) Test_TX();                                             // Goto TX mode
      if(!SW2) Test_RX();                                             // Goto RX mode
      if(USB_SW != 0x0f)                                              // Enable SW3 = CE if USB_ID <> 0.
      {
        if(!SW3)
        {
          CE_Pin(CE_HIGH);                                            // Hold CE high while SW3 is pressed.
        }
        else 
        {
          CE_Pin(CE_LOW);                                             // Hold CE low as long as SW3 is released.
        }
      }
    }
#else
    while(!USB_Rx_Comp)                                               // wait for USB command, and prosess other operations
    {
      if(IRQ_Source)                                                  // wait for nRF24L01 interrupt
      {
      EX0 = 0;                                                        // Disable External interrupt during prosessing
      if(T2_State)
        {
          ET2 = 0;                                                    // Disable T2 interrupt
          Stop_T2();                                                  // and stop timer2
        }
        switch(IRQ_Source)
        {
          case RX_DR:                                                 // RX Data received interrupt                                          
            do
            {
              RX_pipe = L01_Read_RX_Pload(RX_pload) >> 8;             // Read current payload
              if(Freq_Agil_Pipe == RX_pipe)                           // Packet received for "expected" pipe?
              {
                Blink_Led(LED1);                                      // _DEBUG_LED_ Led1 BLINK
                LinkStatus[LINK_STATUS] = LINK_ESTABLISH;             // Indicate "Link Loss"
                LinkStatus[LINK_CHANNEL] = L01_Get_Channel();         // Insert current channel
              
                LinkStat = LINK_ESTABLISH;                            // New LinkStat
                Agil_Timeout  = CLEARED;                              // Packet received, i.e. ok
                Trans_Tmr_Ctr = CLEAR;                                // Reset frequency agility timer
              }
              else
                Blink_Led(LED2);                                      // _DEBUG_LED_ Led2 BLINK if data of other pipe
            }
            while(!(L01_Get_FIFO() & RX_EMPTY));                      // ..until FIFO empty

            L01_Clear_IRQ(MASK_RX_DR_FLAG);                           // clear RX_DR flag
          break;
          
          case TX_DS:                                                 // TX Data sent interrupt
            Blink_Led(LED1);                                          // _DEBUG_LED_ Led1 BLINK
            LinkStat = LINK_ESTABLISH;                                // set LinkStat = LINK_ESTABLISH
            Trans_Tmr_Ctr = CLEAR;                                    // reset Transmitt Timer..

            L01_Clear_IRQ(MASK_TX_DS_FLAG);                           // Clear TX_DS flag
          break;

          case MAX_RT:
          {
            Blink_Led(LED3);                                          // _DEBUG_LED_ Led3 BLINK

            if(Freq_Agil_Status)                                      // running in freq_agil mode?
            {
              if(++Table_Ptr == FREQ_TABLE_SIZE)                      // Freq_table wrapping?
              {
                Blink_Led(LED4);                                      // _DEBUG_LED_ Led4 BLINK
                Table_Ptr = CLEAR;                                    // Reset Table_Ptr to first channel,
                if(Try_Ctr++ == 3)
                {
                  LinkStat = STOP;
                }
              }
              L01_Set_Channel(Freq_table[Table_Ptr]);                 // select new channel
            }
            
            Trans_Tmr_Ctr = CLEAR;                                    // reset Transmitt Timer..
            switch(LinkStat)
            {
              case LINK_ESTABLISH:                                    // max retransmitt, but had comm on last channel
                L01_Clear_IRQ(MASK_MAX_RT_FLAG);                      // clear MAX_RT flag (nRF24L01)
              
                LinkStat = LINK_LOSS;                                 // change LinkStat state to LINK_LOSS, wait for new timeout
              break;

              case LINK_LOSS:                                         // still not connected, run channel scan..
                L01_Clear_IRQ(MASK_MAX_RT_FLAG);                      // clear MAX_RT flag (nRF24L01)
                CE_Pin(CE_PULSE);                                     // retransmitt packet
              
                LinkStat = LINK_RELOST;                               // change LinkStat state to LINK_RELOST
              break;
            
              case LINK_RELOST:
                L01_Clear_IRQ(MASK_MAX_RT_FLAG);                      // clear MAX_RT flag (nRF24L01)
                CE_Pin(CE_PULSE);                                     // retransmitt packet
              
                LinkStat = LINK_RELOST;
              break;

              case STOP:
                L01_Clear_IRQ(MASK_MAX_RT_FLAG);                      // clear MAX_RT flag
                LinkStat = LINK_ESTABLISH;                            // stop retransmission
              break;
            }
          }
          break;

          default:                                                    // ..error handler
          
          break;
        }
        IRQ_Source = CLEAR;                                           // Clear IRQ flag

        if(T2_State)
          {
            Start_T2();
            ET2 = 1;                                                  // Enable T2 interrupt only if T2 in use          
          }

        EX0 = 1;                                                      // Enable external interrupt again..
      }
      
      Check_Button_TX();

    }


#endif
    Sweep_Mode = CLEAR;                                               // Terminate Sweep_Mode
    USB_Rx_Comp = CLEAR;
    switch(RX_buffer[CMD])                                            // USB command decoder
    {
      case CSN_STATE:                                                 // Set/Reset CSN(NSS) pin
        CSN_Pin(RX_buffer[ARG]);
        TX_buffer[0] = 0;
        Block_Write(TX_buffer,1);
      break;

      case SPI_COMMAND:                                               // Writes a SPI byte
        TX_buffer[0] = SPI_RW(RX_buffer[ARG]);
        Block_Write(TX_buffer,1);
      break;

      case CE_BIT:                                                    // Set/Reset CE pin
        CE_Pin(RX_buffer[ARG]);
        
        TX_buffer[0] = 0;
        Block_Write(TX_buffer,1);
      break;

      case FW_VER:                                                    // Return current FirmWare version
        TX_buffer[0] = (BYTE)(FW>>8);                                 // Get major FW_Ver
        TX_buffer[1] = (FW & 0xff);                                   // Get minor FW_Ver
        
        Block_Write(TX_buffer, 2);
      break;

      case READ_USB_ID:                                               // Return current USB_ID switch setting
        TX_buffer[0] = USB_ID;                                        // macro; defines.h
        Block_Write(TX_buffer,1);
      break;

      case WRITE_LEDS:                                                // Set/Reset LED...
        Write_Led(RX_buffer[ARG], RX_buffer[VALUE]);
        TX_buffer[0] = 0;
        Block_Write(TX_buffer,1);
      break;

      case WR_FLASH_BLOCK:                                            // Writes 32 bytes of flash data to block 'n'
        WritePageBlock(RX_buffer[ARG], &RX_buffer[VALUE]);
        TX_buffer[0] = 0x00;
        Block_Write(TX_buffer,1);
      break;

      case RD_FLASH_BLOCK:                                            // Reads and return 32 bytes of flash block 'n'
        ReadPageBlock(RX_buffer[ARG], &TX_buffer[0]);
        Block_Write(TX_buffer, SZ_BLOCK);
      break;

      case WR_FLASH_PAGE:                                             // Writes the flash page n*256 buffer to flash
        if (RX_buffer[ARG] == 0)
          EA = 0;
        WriteFlashPage((unsigned)RX_buffer[ARG]);
        if (RX_buffer[ARG] == 0)
          EA = 1;

        TX_buffer[0] = 0x00;
        Block_Write(TX_buffer,1);
      break;

      case RD_FLASH_PAGE:                                             // Read the n*256 flash page to flash buffer
        ReadFlashPage((unsigned)RX_buffer[ARG]);

⌨️ 快捷键说明

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