📄 smac_per_rx.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 + -