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

📄 main.c

📁 射频芯片驱动
💻 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通过USB接口从主机接收到的数据缓冲区

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在LinkStatus数组内,先是通道状态字节,然后才是通道编号
BYTE LinkStat,LastStat;  //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.RX_pipe的值通过读取射频芯片的状态寄存器获得
BYTE byte_ctr;

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

BYTE Trans_Tmr;                                                       // Variables for trans timer comm mode一个信道发射时间计数
BYTE 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;   //定时器T2的状态标志

//--------------------------------------------------------------------
// 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
        }//if(T2_State)
        
        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则LED1亮
                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 //若不是预定点通道接收到数据,则LED2闪烁
                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 RX_DR:
          
          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 TX_DS:

          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则LED4闪烁
                Table_Ptr = CLEAR;                                    // Reset Table_Ptr to first channel清除跳频表的指针
                if(Try_Ctr++ == 3)
                {	//若尝试次数已达3次
                  LinkStat = STOP;  //停止使用当前频点
                }
              }//if(++Table_Ptr == FREQ_TABLE_SIZE)
              L01_Set_Channel(Freq_table[Table_Ptr]);                 // select new channel使用新的信道
            }//if(Freq_Agil_Status)
            
            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;
            }//switch(LinkStat)
          break;
        }//case MAX_RT:
				default:                          // ..error handler     
          break;
      	}//switch(IRQ_Source)
        IRQ_Source = CLEAR;   // Clear IRQ flag

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

        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解析通过USB接口接收到的命令
    {
      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;

⌨️ 快捷键说明

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