原创 CC2520点对点通信实验

2009-2-19 13:02 3009 4 4 分类: MCU/ 嵌入式

https://static.assets-stash.eet-china.com/album/old-resources/2009/2/19/9168dcb5-a068-4d90-b200-f4513205ff07.rar工程下载


编译环境:IAR7.30B


硬件环境:C51RF-CC2520-PKC51RF-WSN-CC2520


/***********************************************************************************
  Filename: light_switch.c


***********************************************************************************/


/***********************************************************************************
* INCLUDES
*/
#include <hal_led.h>
#include <hal_joystick.h>
#include <hal_assert.h>
#include <hal_board.h>
#include <hal_int.h>
#include "hal_mcu.h"
#include "hal_button.h"
#include "hal_rf.h"
#include "util_lcd.h"
#include "basic_rf.h"
#include "OLED.h"


/***********************************************************************************
* CONSTANTS
*/
// Application parameters
#define RF_CHANNEL                25      // 2.4 GHz RF channel


// BasicRF address definitions
#define PAN_ID                0x2007
#define SWITCH_ADDR           0x2520
#define LIGHT_ADDR            0xBEEF
#define APP_PAYLOAD_LENGTH        1
#define LIGHT_TOGGLE_CMD1          1
#define LIGHT_TOGGLE_CMD2          2
#define LIGHT_TOGGLE_CMD3          3
#define LIGHT_TOGGLE_CMD4          4


// Application states
#define IDLE                      0
#define SEND_CMD                  1


// Application role
#define NONE                      0
#define SWITCH                    1
#define LIGHT                     2
#define APP_MODES                 2


/***********************************************************************************
* LOCAL VARIABLES
*/
static uint8 pTxData[APP_PAYLOAD_LENGTH];
static uint8 pRxData[APP_PAYLOAD_LENGTH];
static basicRfCfg_t basicRfConfig;


#ifdef SECURITY_CCM
// Security key
static uint8 key[]= {
    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
};
#endif


/***********************************************************************************
* LOCAL FUNCTIONS
*/
static void appLight();
static void appSwitch();
static uint8 appSelectMode(void);


/***********************************************************************************
* @fn          appLight
*
* @brief       Application code for light application. Puts MCU in endless
*              loop waiting for user input from joystick.
*
* @param       basicRfConfig - file scope variable. Basic RF configuration data
*              pRxData - file scope variable. Pointer to buffer for RX data
*
* @return      none
*/
static void appLight()
{
    print(20,0,"Light Ready",1);


    // Initialize BasicRF
    basicRfConfig.myAddr = LIGHT_ADDR;
    if(basicRfInit(&basicRfConfig)==FAILED) {
      HAL_ASSERT(FALSE);
    }
    basicRfReceiveOn();


    // Main loop
    while (TRUE) {
        while(!basicRfPacketIsReady());


        if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {
            switch(pRxData[0])
            {
              case LIGHT_TOGGLE_CMD1:
                halLedToggle(1);
                break;
              case LIGHT_TOGGLE_CMD2:
                halLedToggle(2);
                break;
              case LIGHT_TOGGLE_CMD3:
                halLedToggle(3);
                break;
              case LIGHT_TOGGLE_CMD4:
                halLedToggle(4);
                break;
            }
        }
    }
}


/***********************************************************************************
* @fn          appSwitch
*
* @brief       Application code for switch application. Puts MCU in
*              endless loop to wait for commands from from switch
*
* @param       basicRfConfig - file scope variable. Basic RF configuration data
*              pTxData - file scope variable. Pointer to buffer for TX
*              payload
*              appState - file scope variable. Holds application state
*
* @return      none
*/
void appSwitch()
{
   uint8 keytemp;


    print(20,0,"Switch",1);
    print(0,2,"Joystick Push",1);
    print(0,4,"Send Command",1);



    pTxData[0] = LIGHT_TOGGLE_CMD1;


    // Initialize BasicRF
    basicRfConfig.myAddr = SWITCH_ADDR;
    if(basicRfInit(&basicRfConfig)==FAILED) {
      HAL_ASSERT(FALSE);
    }


    // Keep Receiver off when not needed to save power
    basicRfReceiveOff();


    // Main loop
    while (TRUE)
    {
        keytemp = redJoystick();
        if( keytemp)
        {
          if(keytemp == JOYSTICK_UP)  pTxData[0] = LIGHT_TOGGLE_CMD1;
          if(keytemp == JOYSTICK_DN)  pTxData[0] = LIGHT_TOGGLE_CMD2;
          if(keytemp == JOYSTICK_LF)  pTxData[0] = LIGHT_TOGGLE_CMD3;
          if(keytemp == JOYSTICK_RT)  pTxData[0] = LIGHT_TOGGLE_CMD4;


          basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);
          halLedToggle(keytemp);
        }
    }
}


/***********************************************************************************
* @fn          main
*
* @brief       This is the main entry of the "Light Switch" application.
*              After the application modes are chosen the switch can
*              send toggle commands to a light device.
*
* @param       basicRfConfig - file scope variable. Basic RF configuration
*              data
*              appState - file scope variable. Holds application state
*
* @return      none
*/
void main(void)
{
    uint8 appMode = NONE;


    // Config basicRF
    basicRfConfig.panId = PAN_ID;
    basicRfConfig.channel = RF_CHANNEL;
    basicRfConfig.ackRequest = TRUE;
#ifdef SECURITY_CCM
    basicRfConfig.securityKey = key;
#endif


    // Initalise board peripherals
    halBoardInit();
    halJoystickInit();


    // Initalise hal_rf
    if(halRfInit()==FAILED) {
      HAL_ASSERT(FALSE);
    }


    // Indicate that device is powered
    //halLedSet(1);


    halMcuWaitMs(350);


    // Set application role
    appMode = appSelectMode();


    // Transmitter application
    if(appMode == SWITCH)
        // No return from here
        appSwitch();


    // Receiver application
    if(appMode == LIGHT)
        // No return from here
        appLight();
    // Role is undefined. This code should not be reached
    HAL_ASSERT(FALSE);
}



/****************************************************************************************
* @fn          appSelectMode
*
* @brief       Select application mode
*
* @param       none
*
* @return      uint8 - Application mode chosen
*/
static uint8 appSelectMode(void)
{
    UINT8 mode = 0;
    print(0,0,"Press S2 Select:",1);
    print(40,2,"Light",1);
    print(0,4,"Press S3 Select:",1);
    print(40,6,"Switch",1);


    while(!mode)
    {
      if(halButtonPushed() == HAL_BUTTON_1)
      {
        mode = SWITCH;
      }
      if(halButtonPushed() == HAL_BUTTON_2)
      {
        mode = LIGHT;
      }
    }
    ClearScreen();
    return mode;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条