CC2530无线点灯
代码目的:用A板使用按键SW1无线控制B板上的所有LED灯亮灭
涉及到的地方:BasicRF通讯、按键控制、灯的控制
一、主要使用的函数
1.无线发送函数
函数格式
uint8 basicRfSendPacket( uint16 destAddr , uint8 *pPayload , uint8 length )
uint16 destAddr: 发送目标的地址
uint8 *pPayload: 发送的数据
uint8 length: 发送格式的长度
注意:
1.uint8为unsigned char
2.uint16为unsigned short
2.无线接收函数
函数格式
uint8 basicRfReceive( uint8 *pRxData , uint16 len , int16 *pRssi )
uint8 *pRxData: 接收到的数据
uint16 destAddr: 数据的长度
int16 *pRssi: 接收信号的强度
3.判断无线包状态函数
函数格式
uint8 basicRfPacketIsReady( void )
使用函数时注意,先得判断是否有数据包发送过来之后再去使用无线接收函数。
4.演示
发送数据
代码如下(示例):
Send_Data[0] = 0x01;
basicRfSendPacket(0x1234,Send_Data,1); //发送Send_Data数据给地址为0x1234的设备
接收数据
代码如下(示例):
if(basicRfPacketIsReady()) //是否接收到无线RF发来的信号
{
basicRfReceive(Recv_Data,1,NULL); //获取无线RF的数据
if(Recv_Data[0] == 0x01)
{
; //程序段
}
}
二、A板代码
代码如下(示例):
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "sensor_drv/sensor.h"
#include <stdio.h>
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = 11; // 频道
basicRfConfig.channel = 0xabcd; //网络id
basicRfConfig.myAddr = 0xaaaa; //本机模块地址
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
#define SW1 P1_2
#define uint8_t unsigned char
#define uint32_t unsigned int
#define SEND_ADDR 0xbbbb //发送地址
/*
Send_Data[32]:发送数据时使用的变量
使用的位置:Scan_Key()中
Key_Flag:判断是否再次点击
使用的位置:Scan_Key()中
*/
uint8_t Send_Data[32],Key_Flag=1;
// @brief 延迟函数
void Delay(uint32_t x)
{
while(x--);
}
// @brief 按键初始化函数
void Init_Port()
{
P1SEL |= 0x04;
P1DIR &= ~0x04;
}
// @brief 按键扫描处理函数
void Scan_Key()
{
if(SW1 == 0)
{
Delay(100);
if(SW1 == 0)
{
while(SW1 == 0);
if(Key_Flag)
{
Key_Flag=0;
Send_Data[0] = 0x01;
basicRfSendPacket(SEND_ADDR,Send_Data,1); //发送0x01给B板
}
else
{
Key_Flag=1;
Send_Data[0] = 0x02;
basicRfSendPacket(SEND_ADDR,Send_Data,1); //发送0x02给B板
}
}
}
}
/********************MAIN************************/
void main(void)
{
halBoardInit(); //初始化其他功能
ConfigRf_Init(); // 无线RF初始化
Init_Port(); //初始化按键引脚
while(1)
{
Scan_Key(); //扫描按键是否触发
}
}
三、B板代码
代码如下(示例):
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "sensor_drv/sensor.h"
#include <stdio.h>
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = 11; // 频道
basicRfConfig.channel = 0xabcd; //网络id
basicRfConfig.myAddr = 0xbbbb; //本机模块地址
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
#define uint8_t unsigned char
/*
Recv_Data[32]:用于存放从RF收到的数据
使用的位置:main()中
*/
uint8_t Recv_Data[32];
//初始化LED灯
void Init_Port()
{
P1SEL &= ~0x1b;
P1DIR |= 0x1b;
P1 &= ~0x1b;
}
/********************MAIN************************/
void main(void)
{
halBoardInit(); //初始化其他功能
ConfigRf_Init(); // 无线RF初始化
Init_Port(); //初始化LED灯引脚
while(1)
{
if(basicRfPacketIsReady()) //是否接收到无线RF发来的信号
{
basicRfReceive(Recv_Data,1,NULL); //获取无线RF的数据
if(Recv_Data[0] == 0x01)
{
P1 |= 0x1b; //灯亮
}
if(Recv_Data[0] == 0x02)
{
P1 &= ~0x1b; //灯灭
}
}
}
}
总结
本文基于BasicRF包来对CC2530无线点灯,最主要的是了解包中提供函数的使用方法。
源文件下载/download
源文件查看基础代码在rf_set.c中,调用的函数在basic_rf.c中