📄 main.c
字号:
/** @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 + -