ZigBee
单片机:cc2530
协议栈:ZStack-CC2530-2.5.1a
开发工具:IAR
1.软件配置
(1)配置单片机
第一步:右击工程名,在快捷菜单选择Options...,打开Options for node ‘ex1’对话框
第二步:选择General Options列表项,单击右边的Target标签,显示的页面为配置单片机的内容
第三步:单击Device后面的按钮,在弹出的对话框中选择CC2530F256.i51文件,文件位于C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\8051\config\devices\Texas Instruments文件夹中
第四步:在CPU core 下拉列表框中选择Plain列表项,其他参数默认
(2)配置连接器
第一步:右击工程名,在快捷菜单选择Options...,打开Options for node ‘ex1’对话框,选择Linker列表项,然后选择右边Config标签
第二步:在Config页面中勾选Linker configuration file框架中的Override default复选框,单击框架中的..按钮,弹出对话框,选择lnk51ew_cc2530F256_banked.xcl文件,位于C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\8051\config\devices\Texas Instruments文件夹中
第三步:其他项的配置选择默认值
(3)配置仿真器
第一步:右击工程名,在快捷菜单选择Options...,打开Options for node ‘ex1’对话框,选择Debugger列表项,然后选择右边Setup标签
第二步:在Setup页面中单击Driver下拉列表框,从展开的列表项中选择Texas Instruments列表项
第三步:勾选Device Description file框架中的Override default复选框,然后单击框架中的..按钮,在弹出的对话框中选择ioCC2530F256.ddf文件,位于C:\Program Files\IAR Systems\Embedded Workbench 6.0 Evaluation\8051\config\devices\Texas Instruments文件夹中
2.ZigBee网络中的设备
ZigBee网络中主要有协调器,路由器,终端节点3种设备
(1)协调器
在ZigBee网络中只能有1个协调器。协调器主要负责网络的组建,维护,控制节点的加入,数据包路由选择等。所谓路由是指数据在网络中传输时的路径选择与控制。
(2)路由器
在ZigBee网络中可以有多个路由器或者没有路由器。路由器主要负责数据包的路由选择,网络连接等。
(3)终端节点
在ZigBee网络中可以有1个或多个终端节点。终端节点的主要功能是负责数据的采集和执行机构的控制,例如温度,湿度的采集,电机,照明灯的控制等。
注意:在ZigBee,协调器具备路由器的功能,也可以作为一个终端节点来使用。路由器则不具备网络组建功能,可作为一个终端节点来使用。终端节点不具备路由功能。一个ZigBee网络至少要包含1个协调器和1个终端节点,其中终端节点可以有路由器来兼任。
3.系统事件与用户事件
(1)系统事件
系统事件是协议栈内部已经预先定义好的事件,用户不必定义
SYS_EVENT_MSG 0x8000 系统事件
AF_DATA_CONFIRM_CMD 0xFD 收到数据确认事件
AF_INCOMING_MSG_CMD 0x1A 收到报文(MSG)类消息
AF_INCOMING_KVP_CMD 0x1B 收到键值对(KVP)类的消息
KEY_CHANGE 0xC0 按键状态发生改变
ZDO_NEW_DSTADDR 0xD0 ZDO获得新地址
ZDO_STATE_CHANGE 0xD1 ZDO改变了网络的状态
ZDO_MATCH_DESC_RSP_SENT 0xD2 描述符匹配响应发送
ZDO_CB_MSG 0xD3 收到ZDO反馈消息
ZDO_NETWORK_REPORT 0xD4 ZDO收到网络状态报告消息
ZDO_NETWORK_UPDATE 0xD4 ZDO收到网络状态更新消息
(2)用户事件
用户事件是用户在应用系统开发的过程中根据实际需要自定义的事件
在ZStack中事件定义的特点:
1)一个任务可以包含多个事件,即一个任务可以由几个事件中的某个事件触发
2)一个事件只能归属于一个任务之中,即一个事件的发生,只能触发一个任务的执行。
3)任务的事件用16位二进制数表示,一个二进制位代表一个单一的事件,二进制位的值为1时,表示该位二进制位所代表的事情发生了,二进制位的值为0时,表示该位二进制位所代表的事情没有发生。(0x0001,0x0002,0x0004······0x8000为单一事件。0x0003为复合事件由0x0001和0x0002组成)
4)同一任务的各个事件的编码不能相同,不同任务的事件编码可以相同
5)事件编码中,0x8000为系统事件的编码,用户为每个任务所能定义的单一事件最多只有15个
4.软件操作
(1)移除App组中的多余文件
右击文件,选择Remove。
(2)查看文件中函数
在左下角点击f{}。
(3)显示代码的行号
单击菜单栏Tools—>Options菜单项,打开IDE Options对话框
在左侧列表框中选中Editor列表项,然后在右侧勾选Show line numbers,确定
(4)新建组
单击参加的工程名,右击选择Add,再选择Add Group,填写组名,确定。
(5)建立模块设备
选择菜单Project—>Edit Configurations命令,在弹出的对话框中选择New建立模块设备,选择基于Deubg模块进行配置,选择OK。在新建前把Deubg配置好,当作模板
(6)工程添加头文件
点击IAR菜单中的Project—>Options,选择C/C++ Compiler,然后再选择Preprocessor,在Additional include directories:(one per line)中输入头文件的路径。
1)$PROJ_DIR$\代表当前工程文件所在的workspace的目录
2)..\表示对应目录的上一层
(7)串口输出数据
点击IAR菜单中的Project—>Options,选择C/C++ Compiler,然后再选择Preprocessor,Defined symbols:(one per line)中添加CC2530_DEBUG,既可串口输出
4.库函数
(1)osal_msg_deallocate() 释放存储空间
功能:释放消息所占存储空间
原型:uint8 osal_msg_deallocate(uint *msg_ptr);
说明:参数msg_ptr为指向所需回收的消息缓冲区的指针。
返回值:成功:SUCCESS(0x00) 失败:INVALID_MSG_POINTER(0x05)
(2)osal_msg_receive() 消息检索
功能:为指定的任务从消息队列中检索一条消息
原型:uint8 osal_msg_receive(uint task_id);
说明:参数task_id为任务编码
返回值:成功:指向存放该消息的缓冲区的指针 失败:NULL
(3)osal_start_timeEx() 开启定时器
功能:启动定时器,当定时时间到后为指定的任务设置事件
原型:uint8 osal_start_timerEx(uint8 taskID,uint16 event_id,uint16 timeout_value);
说明:参数taskID指定任务的任务号,参数event_id所需设置事件的事件编码,参数timeout_value定时的时长,单位为ms
返回值:成功:SUCCESS(0x00) 失败:NO_TIMER_AVAIL
(4)HalLedSet() LED的状态
功能:设置指定发光二极管的状态
原形:uint8 HalLedSet(uint leds,uint8 mode);
说明:
leds:待设置的发光二极管
HAL_LED_1 0x01 与P1_0脚相接的发光二极管LED1
HAL_LED_2 0x02 与P1_1脚相接的发光二极管LED2
HAL_LED_3 0x04 与P1_4脚相接的发光二极管LED3
mode:待设置的状态
HAL_LED_MODE_OFF 0x00 熄灭模式
HAL_LED_MODE_ON 0x01 点亮模式
HAL_LED_MODE_BLINK 0x02 闪烁模式
HAL_LED_MODE_FLASH 0x04 周期性地闪烁模式
HAL_LED_MODE_TOGGLE 0x08 状态翻转模式
(5)HalLedBink() LED闪烁控制
功能:控制指定的发光二极管闪烁
原型:void HalLedBink(uint8 leds,uint8 numBlinks,uint8 percent,uint16 period);
说明:
leds:要闪烁的LED
numBlinks:闪烁的次数。为0时不停闪烁,为其他表示闪烁的次数
percent:LED点亮时间占闪烁周期的百分比。percent为0时熄灭,大于等于100点亮,为其他值表示点亮时间的百分比。
period:闪烁的周期,单位为ms
(6)HalUARTOpen() 串口初始化
功能:用指定的参数初始化串口
原型:uint8 HalUARTOpen(uint8 port,halUARTCfg_t *config);
说明:
port:所要初始化串口的串口号
config:串口配置变量的地址。
例:
void InitUart(void)
{
halUARTCfg_t UartConfig; //定义串口配置变量
UartConfig.configured=TRUE; //进行串口配置
UartConfig.baudRate=HAL_UART_BR_115200; //波特率
UartConfig.flowControl=FALSE; //不进行流控制
UartConfig.callBackFunc=NULL; //无回调函数
HalUARTOpen(0,&UartConfig); //按设置参数初始化串口0
}
(7)HalUARTRead() 串口接收
功能:从串口中读取指定长度的数据,并存入用户缓冲区
原型:uint8 HalUARTRead(uint8 port,uint8 *buf,uint16 len);
说明:
port:串口号
buf:存放的缓冲区
len:读取的长度
(8)HalUARTWrite() 串口发送
功能:从串口中发生指定长度的数据
原型:uint8 HalUARTWrite(uint8 port,uint8 *buf,uint16 len);
说明:
port:串口号
buf:发生数据所在的地址
len:发生的长度
(9)osal_set_event() 设置事件
功能:为指定的任务设置事件
原型:uint8 osal_set_event(uint8 task_id,uint16 event_flag);
说明:
task_id:指定任务的任务号
event_flag:所需设置事件的事件编码
返回值:成功:SUCCESS(0x00) 失败:INVALID_TASK
(10)osal_memcmp() 判断数据是否相同
功能:对2个存储区的内容进行比较
原型:uint8 osal_memcmp(const void GENERIC *src1,const void GENERIC *src2,unsigned int len);
说明:
src1:待比较的第1个数据区的首地址
src2:待比较的第2个数据区的首地址
len:所需比较的字节数
返回值: TRUE:内容相同 FALSE:内容不同
(11)osal_strlen() 读取字符串长度
功能:计算一个字符串的长度
原型:uint8 osal_strlen(char *pString)
说明:
pString:所要计算的字符串,要求字符串必须以NULL(值为0x00)结尾
返回值:字符串的长度
(12)osal_memset() 批量赋值
功能:将用户缓冲区的内容设置为指定值
原型:void *osal_memset(void *dest,uint8 value,int len);
说明:
dest:用户缓冲区的地址
value:所要设置的值
len:所需设置的长度
5.连接云平台
将232转485接口与黑板连接,转换接口的+与路由器4851A连接,-与路由器4851B连接
在云平台上项目选择工业物联-》以太网,确定
添加设备选择TCP的通信协议
网关接入云平台