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 );
}
- 第
18至19行:关闭WeBee底板的LED2和LED1。halLedSet(x)是使灯点亮,halLedClear(x)是使灯熄灭。 - 第
21至22行:选择其中的一行,并把另外一行屏蔽掉。一个是实现发射按键信息的功能,另一个是接收按键信息并改变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();
}
}
}
- 第
2至5行:TI学习板上的液晶模块的定义,我们不用管它。 - 第
7至11行:Basic RF启动中的初始化,就是上面所讲的Basic RF启动的第3步。 - 第
13行:Basic RF发射第1步,把要发射的数据或者命令放入一个数据buffer,此处把灯状态改变的命令LIGHT_TOGGLE_CMD放到pTxData中。 - 第
15行:由于模块只需要发射,所以把接收屏蔽掉以降低功耗。 - 第
19行:if(halButtonPushed() == HAL_BUTTON_1)判断按键S1是否被按下。函数halButtonPushed是halButton.c里面的,它的功能是:按键S1有被按动时,就回返回true,则进入basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);。 - 第
20行:Basic RF发射第2步,也是发送数据最关键的一步,函数功能在前面已经讲述。basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH)将LIGHT_ADDR、pTxData、APP_PAYLOAD_LENGTH的实参写出来就是basicRfSendPacket(0xBEEF, pTxData[0], 1),实际上就是把字节长度为1的命令,发送到地址0xBEEF。 - 第
22至23行: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 );
}
}
}
}
- 第
6至9行:这是LCD显示的内容,暂时不用理它。 - 第
11至14行: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无线点灯示例内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复