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

📄 smac_per_rx.c

📁 采用MC13213做的在SMAC协议基础上的发送程序,可作为点对点实验中的END DEVICE.
💻 C
字号:
/****************************************************************************
application rx_per.c

Author: MOTOROLA

Application Note: 
RX_per waits for a ZigBee packet to be received.
Then the link quality of the ZigBee packet is measured by reading the link quality register.
A comparison is made between SPEC_POWER L1_POWER, L2_POWER, and L3_POWER.
From this comparison a ACK packet is formed {'A','C','K', x = {0,1,2,3}} where x represents the respective power settings.
After the ACK is sent the RADIO returns to RX forever mode.
****************************************************************************/

#include <hidef.h> /* for EnableInterrupts macro */
#include "pub_def.h"
#include "LCD.h"
#include "SCI.h"
#include "APP_SMAC_API.h"
#include "freescale_radio_hardware.h"
#include "smac_per_rx.h"
#include "eventDefs.h"
#include "timer.h"
#include "ledFunctions.h"
#include <string.h>
#include "kbi.h"
#include "ascii_utilities.h"
#if (EMBEDDED_BOOTLOADER == TRUE)  
#include "bootloader user api.h"
#endif
/* Global Variables */
byte gu8RTxMode; /* needed for s-mac, application can read this variable */
				/* rtx_mode is the software state variable of the radio */
				/* This variable reflects the current state of MC13192 */
int app_status = 0;	//State machine variable for the application	
byte led_status = 0;	//led status reflects which power setting should be set.
UINT8 link_quality;	//Holds the link quality of the last received ZigBee Packet.
extern char SCIdata[2];
extern int SCIdata_flag;
UINT8 gu8Channel = CHANNEL_NUMBER;
UINT16 gu16Events = 0;
UINT8 expectedString[30];
extern UINT16 gu16msTimer;
extern UINT16 gu16timerEvent[2];
void main(void) {

   tRxPacket rx_packet;	//SMAC structure for RX packets
   tTxPacket tx_packet;	//SMAC structure for TX packets
   byte rx_data_buffer[20];	//Data buffer to hold RX data, if you want larger packets change 20 to what you need.
   byte tx_data_buffer[20];	//Data buffer to hold TX data, if you want larger packets change 20 to what you need.
   UINT32 loop, i;
   UINT16 packet_count = 0;
   char App_String[10];
	
	//EnableInterrupts; /* enable interrupts */
	/* include your code here */
	/* Init LED's */



	//Initialize the packet.
  tx_packet.u8DataLength = 0;		//Set TX default length to 0
  tx_packet.pu8Data = &tx_data_buffer[0];	//Load the address of our txbuffer into the tx structure
  rx_packet.u8DataLength = 0;		//Set RX default length to 0
  rx_packet.pu8Data = &rx_data_buffer[0];	//Load the address of our rxbuffer into the rx structure
  rx_packet.u8MaxDataLength = 128;		//Define the max buffer we are interested in.
  rx_packet.u8Status = 0;					//initial status variable for rx to 0.
  MCUInit();			//Initialize the mcu, setup GPIOs, SPI, clock scheme, etc.
  RadioInit();
  
  app_init();
	SCIInitGeneric(8000000, 38400, DEFAULT_SCI_PORT);	
   KBIInit();
   
   KBI_ENABLEINTERRUPTS;
   
	(void)MLMESetMC13192ClockRate(0);  /* Set initial Clk speed */
	UseExternalClock();	/* switch clock sources */
	
	
	/* include your start up code here */	
  EnableInterrupts; /* Turn on system interrupts */
	(void)MLMESetChannelRequest(CHANNEL_NUMBER);	//Set channel to 0 (2.405GHz)		

#if (EMBEDDED_BOOTLOADER == TRUE)
  boot_init();  //Initialize the bootloader...in bootloader user api.c
#endif

  /******************************************************************
  To adjust output power call the MLMEMC13192PAOutputAdjust() with:
  
  MAX_POWER     (+3 to +5dBm)
  NOMINAL_POWER (0 dBm)
  MIN_POWER     ~(-16dBm)
  
  or somewhere custom ? (0-15, 11 (NOMINAL_POWER) being Default power)

	******************************************************************/
	//MLMEMC13192PAOutputAdjust(MAX_POWER);	//Set MAX power setting
  //MLMEMC13192PAOutputAdjust(MIN_POWER);	//Set MIN power setting
  (void)MLMEMC13192PAOutputAdjust(OUTPUT_POWER);	//Set Nominal power setting	


	#if (EMBEDDED_BOOTLOADER == TRUE)
      boot_call();  //Checks for user request for bootloader.
                    //Runs bootloader if requested.  Code will not return.
  #endif

   /* Indicate RX radio out of reset */
   setLedsMode(LED_HEX_MODE, 0xF, 30, LED_NO_FLAGS);
   setLedsMode(LED_HEX_MODE, 0xF, 30, LED_NO_FLAGS);
   
   /* Set up the expected string */
   for (loop=0; loop<20; loop++) {
      expectedString[loop] = (UINT8)loop;
   }
   expectedString[20] = '\0'; /* Terminate the string */
   
	
	app_status = IDLE_STATE;
	
	SCITransmitStr("\r\r------ SMAC RX PACKET TEST -------\r");
   SCITransmitStr("SW1 - Start Test\r");
   SCITransmitStr("SW2 - Change Channel\r");
		
	//Loop forever
	for (;;) { 
		/* include your regular code here */
		switch (app_status) {
			case INITIAL_STATE:
			   packet_count = 0;			
				//For RX
				LED1 = LED_ON; LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_ON;		//All LEDs On
				for (loop = 0; loop < LED_DELAY; loop++);
				LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_OFF; //All LEDs Off
				for (loop = 0; loop < LED_DELAY; loop++);
				LED1 = LED_ON; LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_ON;		//All LEDs On
				for (loop = 0; loop < LED_DELAY; loop++);
				LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_OFF;	//All LEDs Off
				for (loop = 0; loop < LED_DELAY; loop++);
				app_status = RX_STATE;	//Since we are rx...Set RX_STATE
				App_String[0] = '\0'; 				
				SCITransmitStr("\rThe RX radio is now listening...\rStart the test by pressing SW1 on the TX radio\r");
				break;								
	/*		case TX_STATE:
				tx_data_buffer[0] = 'Z';
				tx_data_buffer[1] = 'i';
				tx_data_buffer[2] = 'g';
				tx_data_buffer[3] = 'B';
				tx_data_buffer[4] = 'e';
				tx_data_buffer[5] = 'e';
				tx_packet.u8DataLength = 6;
				if (MCPSDataRequest(&tx_packet) == SUCCESS)
					LED2 ^= 1; 
				(void)MLMERXEnableRequest(&rx_packet,DELAY_COUNT);					
				app_status = WAITING_FOR_ACK;
				break;	*/			
			case RX_STATE:
			 	MLMERXEnableRequest(&rx_packet,0); //Zero means wait forever with RX ON.
				app_status = WAITING_FOR_ACK;
				break; 				
			case RESET_STATE:
				RadioInit();
				app_status = RECEIVER_ALWAYS_ON;
				break;
				
			case RECEIVER_ALWAYS_ON:
				break;
				
			case WAITING_FOR_ACK:
				break;
				
		   case IDLE_STATE:
		      break;
				
			case SET_LEDS:
				LED1 ^= 1;
				switch (led_status) {
					case 0:
						LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_OFF; //At spec
						break;
					case 1:
						LED2 = LED_ON; LED3 = LED_OFF; LED4 = LED_OFF; //spec < reading < -80
						break;
					case 2:
						LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_OFF; //spec < reading < -70
						break;
					case 3:
						LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_ON; //reading < -70
						break;
					default:
					break;
				}
				app_status = RX_STATE;
				break;
			
			case GOOD_PACKET:
			   LED1 ^= 1;
			   for(i = 0; i< 18; i++){
			   SCIStartTransmit(rx_packet.pu8Data[i]);
			      
			   }
		/*	   SCITransmitStr("N:");
			   (void)int2string((UINT32) packet_count, App_String);
			   (void)trimWhiteSpace(App_String);
			   SCITransmitStr(App_String);
				
				SCITransmitStr(" L:");
			   (void)int2string((UINT32) rx_packet.u8DataLength, App_String);
			   (void)trimWhiteSpace(App_String);
			   SCITransmitStr(App_String);

            link_quality = (UINT8)(MLMELinkQuality()/2);	//Read the link quality of the last received packet.  
            SCITransmitStr(" LQI=-");
			   (void)int2string((UINT32) link_quality, App_String);
			   (void)trimWhiteSpace(App_String);
			   SCITransmitStr(App_String);				
			   	
            SCITransmitStr(" CRC=1 Data=");
            SCITransmitFormattedArray(rx_packet.pu8Data, rx_packet.u8DataLength);
            SCITransmitStr("\r");    */
         //   packet_count++;
            app_status = RX_STATE;
            
            break;
            
		   case ECHO_STATE:
			
		     SCITransmitStr("Good:\t");
			   (void)int2string((UINT32) packet_count, App_String);
			   (void)trimWhiteSpace(App_String);
			   SCITransmitStr(App_String);
			   SCITransmitStr("/");
				 (void)int2string((UINT32) TEST_NUM +1, App_String);//SCITransmitStr("/TEST_NUM\r\r");
				 (void)trimWhiteSpace(App_String);
			   SCITransmitStr(App_String);
				 SCITransmitStr("\r\rHalt\r");
            app_status = FINAL_STATE;
				break;
				
		   case FINAL_STATE:
		         for (i=0; i<strlen(App_String); i++) {
		            switch (App_String[i]) {
		              case '0':
		                  LED1 = LED_ON; LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_ON;
		                  break;
		              case '1':
		                  LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_ON;
		                  break;
		              case '2':
		                  LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_ON; LED4 = LED_OFF;
		                  break;
		              case '3':
		                  LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_ON; LED4 = LED_ON;
		                  break;
		              case '4':
		                  LED1 = LED_OFF; LED2 = LED_ON; LED3 = LED_OFF; LED4 = LED_OFF;
		                  break;
		              case '5':
		                  LED1 = LED_OFF; LED2 = LED_ON; LED3 = LED_OFF; LED4 = LED_ON;
		                  break;
		              case '6':
		                 LED1 = LED_OFF; LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_OFF;
		                  break;
		              case '7':
		                  LED1 = LED_OFF; LED2 = LED_ON; LED3 = LED_ON; LED4 = LED_ON;
		                  break;
		              case '8':
		                  LED1 = LED_ON; LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_OFF;
		                  break;   
		              case '9':
		                  LED1 = LED_ON; LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_ON;
		                  break;   
		              
		              default:
		               break;     
		            }
		            
		            delay(30); /* 30 msecs */
		           LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_OFF; LED4 = LED_OFF;
		            delay(30); /* 30 msecs */ 
		         }
		         
		         //Larger delay
		         delay(50);
		}
	
	
			  /* Check for debounce timer (TIMER1) */
        if ((gu16Events & TIMER_EVENT1) != 0) {
            gu16Events &= ~TIMER_EVENT1; /* Clear the event */
            gu16timerEvent[1] = 0; /* Turn off the timer */
        }
        /* See if a RX ON Request has been made */	      
        if ((gu16Events & KBI2_EVENT) != 0) {
            #if BUZZER_ENABLED
               BUZZER = BUZZER_ON;
            #endif
               delay(10);
            #if BUZZER_ENABLED
               BUZZER = BUZZER_OFF;
            #endif
               gu16Events &= ~KBI2_EVENT; /* Clear the event */
        	      
        	      KBI1SC |= 0x02; /* Enable Interrupts */
        	      app_status = INITIAL_STATE;
        }       
       
        /* See if a Channel Request has been made */	      
        if ((gu16Events & KBI3_EVENT) != 0) {
            #if BUZZER_ENABLED
               BUZZER = BUZZER_ON;
            #endif
               delay(10);
            #if BUZZER_ENABLED
               BUZZER = BUZZER_OFF;
            #endif
               gu16Events &= ~KBI3_EVENT; /* Clear the event */
        	      if (gu8Channel == 15) {
        	         gu8Channel = 0;  
        	      } else {
        	         gu8Channel += 1;
        	      }
        	      
        	      
        	      /* Actually Switch Channels now that the ack is received */
        	      (void)MLMESetChannelRequest(gu8Channel);
        	      
        	      /* Now notify user that channel has changed */
        	      setLedsMode(LED_HEX_MODE, (UINT8)(gu8Channel), 50, LED_NO_FLAGS);
               setLed(0, 0);  /* Turn off all the LEDs*/       	      
        	      KBI1SC |= 0x02; /* Enable Interrupts */
        }	
	}
}

void MCPSDataIndication(tRxPacket *rx_packet2) {

	if (rx_packet2->u8Status == TIMEOUT) {

		/* Put timeout condition code here */
		app_status = RX_STATE;	//Should not get here.

	}
   if (rx_packet2->u8Status == SUCCESS) {      
   
   
	   if (strcmp(&rx_packet2->pu8Data[0], "DONEDONE") == 0)
	      app_status = ECHO_STATE;
	   else if (rx_packet2->u8DataLength == 20){//根据长度认为是好包;
	      //if (strncmp(&expectedString, rx_packet2->pu8Data, 18) == 0)
	      app_status = GOOD_PACKET;
	   } else{
	      app_status = RX_STATE;
	   }
	} else {
	   app_status = RX_STATE;
	}
}

void MLMEMC13192ResetIndication() {
	//Notifies you that the MC13192 has been reset.
	//Application must handle this here.
	app_status = RESET_STATE;
}

void app_init(void) {
  
  /* Init LED's */
	LED1 = 1; /* Default is off */
	LED2 = 1;
	LED3 = 1;
	LED4 = 1;

	LED1DIR = 1; /*Set the DDIR register as Outputs for the LED pins*/
	LED2DIR = 1;
	LED3DIR = 1;
	LED4DIR = 1;
	
	//Pull up the pushbuttons.
	PB0PU = 1;
   PB1PU = 1;
   PB2PU = 1;
   PB3PU = 1;

  /* OTAP entry */
  #if SMAC_FEATURE_OTAP == TRUE
  if (PB0 == 0){
    KBI1SC = 0x00; /* Turn On Interrupts */
    OTAPActivate();
  }
  #endif // SMAC_FEATURE_OTAP == TRUE
  
   /* Setup Timer 1 */
     /* Setup Timer 1 */
  TPM1MOD = 625; /* Set the timer for a 26ms timer rate (1/8E6) * 128 * 625 = 10msec */
                 /* Timer rate = (1/BUSCLOCK) * TIMER_PRESCALER * TIMER MOD */
  TPM1SC = 0x4F; /* Timer divide by 128. (16uS timebase for 8MHz bus clock). interrupt on*/


}

⌨️ 快捷键说明

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