我是靠谱客的博主 矮小裙子,这篇文章主要介绍ZigBee无线点灯示例,现在分享给大家,希望可以做个参考。

  light_switch.c代码详解:无论你看哪个实验的代码,首先要找的就是main函数:

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 对硬件抽象层的rf进行初始化 */
    if ( halRfInit() = = FAILED ) {
        HAL_ASSERT ( FALSE );
    }
    /*-----------根据WeBee学习底板配置----------*/
    halLedClear ( 2 ); /* 关LED2 */
    halLedClear ( 1 ); /* 关LED1 */
    /*-----选择性下载程序,发送模块和接收模块-----*/
    appSwitch(); /* 节点为按键S1,引脚为P0_0 */
    appLight(); /* 节点为指示灯LED1,引脚为P1_0 */
    /* Role is undefined. This code should not be reached */
    HAL_ASSERT ( FALSE );
}
  • 1819行:关闭WeBee底板的LED2LED1halLedSet(x)是使灯点亮,halLedClear(x)是使灯熄灭。
  • 2122行:选择其中的一行,并把另外一行屏蔽掉。一个是实现发射按键信息的功能,另一个是接收按键信息并改变LED状态,分别为Basic RF发射和接收。不同模块在烧写程序时选择不同功能。

注意,程序会在appSwitch函数或者appLight函数里面循环或者等待,不会执行到第26行。
  接下来看appSwitch函数:

static void appSwitch() {
#ifdef ASSY_EXP4618_CC2420
    halLcdClearLine ( 1 );
    halLcdWriteSymbol ( HAL_LCD_SYMBOL_TX, 1 );
#endif
    /* Initialize BasicRF */
    basicRfConfig.myAddr = SWITCH_ADDR;

    if ( basicRfInit ( &basicRfConfig ) == FAILED ) {
        HAL_ASSERT ( FALSE );
    }

    pTxData[0] = LIGHT_TOGGLE_CMD;
    /* Keep Receiver off when not needed to save power */
    basicRfReceiveOff();

    /* Main loop */
    while ( TRUE ) { /* 程序进入死循环 */
        if ( halButtonPushed() == HAL_BUTTON_1 ) { /* 按键S1被按下 */
            basicRfSendPacket ( LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH );
            /* Put MCU to sleep. It will wake up on joystick interrupt */
            halIntOff();
            halMcuSetLowPowerMode ( HAL_MCU_LPM_3 ); /* Will turn on global */
            /* interrupt enable */
            halIntOn();
        }
    }
}
  • 25行:TI学习板上的液晶模块的定义,我们不用管它。
  • 711行:Basic RF启动中的初始化,就是上面所讲的Basic RF启动的第3步。
  • 13行:Basic RF发射第1步,把要发射的数据或者命令放入一个数据buffer,此处把灯状态改变的命令LIGHT_TOGGLE_CMD放到pTxData中。
  • 15行:由于模块只需要发射,所以把接收屏蔽掉以降低功耗。
  • 19行:if(halButtonPushed() == HAL_BUTTON_1)判断按键S1是否被按下。函数halButtonPushedhalButton.c里面的,它的功能是:按键S1有被按动时,就回返回true,则进入basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);
  • 20行:Basic RF发射第2步,也是发送数据最关键的一步,函数功能在前面已经讲述。basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH)LIGHT_ADDRpTxDataAPP_PAYLOAD_LENGTH的实参写出来就是basicRfSendPacket(0xBEEF, pTxData[0], 1),实际上就是把字节长度为1的命令,发送到地址0xBEEF
  • 2223行:WeBee开发板暂时还没有joystick(多方向按键),不用理它。
  • 25行:使能中断。

  发送的appSwitch讲解完毕,接下来就到接收函数appLight

static void appLight() {
    /*-----------------------------------------
    halLcdWriteLine(HAL_LCD_LINE_1, “Light”);
    halLcdWriteLine(HAL_LCD_LINE_2, “Ready”);
    -----------------------------------------*/
#ifdef ASSY_EXP4618_CC2420
    halLcdClearLine ( 1 );
    halLcdWriteSymbol ( HAL_LCD_SYMBOL_RX, 1 );
#endif
    /* 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 ) {
            if ( pRxData[0] == LIGHT_TOGGLE_CMD ) {
                halLedToggle ( 1 );
            }
        }
    }
}
  • 69行:这是LCD显示的内容,暂时不用理它。
  • 1114行:Basic RF启动中的初始化,上面Basic RF启动的第3步。
  • 15行:函数basicRfReceiveOn开启无线接收功能,调用这个函数后模块一直会接收,除非再调用basicRfReceiveOff使它关闭接收。
  • 17行:程序开始进行不断扫描的循环。
  • 18行:Basic RF接收的第1步,while(!basicRfPacketIsReady())检查是否接收上层数据。
  • 19行:Basic RF接收的第2步,if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL) > 0)判断否接收到有效数据。
  • 20行:if(pRxData[0] == LIGHT_TOGGLE_CMD)判断接收到的数据是否就是发送函数里面的LIGHT_TOGGLE_CMD。如果是,则执行第25行。
  • 21行:halLedToggle(1)改变Led1的状态。

  完成烧写后上电,按下发射模块的S1按键,可以看到接收模块的LED1被点亮。

最后

以上就是矮小裙子最近收集整理的关于ZigBee无线点灯示例的全部内容,更多相关ZigBee无线点灯示例内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(121)

评论列表共有 0 条评论

立即
投稿
返回
顶部