概述
“51单片机” 和 “zigbee” 、 “cc2530芯片” 之间的关系
51单片机:是一款比较老的单片机,至于单片机你可以把它理解成电脑中的CPU。
Zigbee:是一短距离、低功耗的局域网无线通信技术,但可以进行自组网。
CC2530:是TI公司推出的一款芯片,里面包含了51单片机的内核与Zigbee技术,而且TI提供了很好的Zigbee协议栈以及决解方案。
I/O端口
寄存器 PxSEL,其中 x 为端口的标号 0~2,用来设置端口的每个引脚为通用 I/O 或者是外部设备 I/O 信号 。作为缺省的情况,每当复位之后,所有的数字输入/输出引脚都设置为通用输入引脚。
在任何时候,要改变一个端口引脚的方向,就使用寄存器 PxDIR 来设置每个端口引脚为输入或输出。因此只要设置 PxDIR 中的指定位为 1,其对应的引脚口就被设置为输出了。
定时器
中断
所有21个I / O引脚都具有外部中断功能。 因此,如果需要,外部设备可能会产生中断。 外部中断功能也可用于将器件从睡眠模式(电源模式PM1,PM2和PM3)中唤醒。
通用IO:共21个,分成3组,P0组、P1组、P2组,其中P0P1组各8个IO,P2组5个(P2_0、P2_1、 P2_2、P2_3、 P2_4)。其中P1_0、P1_1有20mA的输出驱动能力,其余的只有4mA。
所有端口都可通过SFR寄存器P0,P1和P2进行位和字节寻址。 每个端口引脚都可以单独设置为通用I / O或外设I / O。
1、GPIO功能选择寄存器——PxSEL
寄存器PxSEL(其中x是端口号0-2)用于将端口中的每个引脚配置为通用I / O引脚或外设I / O引脚,可位寻址。 默认情况下,复位后,所有数字输入/输出引脚都配置为通用输入引脚。
P2SEL只有第0位至第2位是端口2的功能选择控制位,第3位至第6位是端口1的外设优先级控制位。
2、GPIO输入输出方向选择寄存器——PxDIR
寄存器PxDIR用于将每个端口的引脚方向设置为输入方向或输出方向。 因此,将PxDIR中的相应位设置为1,相应的引脚就变成输出方向,可位寻址。
P2DIR只有第0位至第4位是端口2的方向选择控制位,第6位和第7位是端口0外设优先级控制位。
3、GPIO输入模式寄存器——PxINP
寄存器PxINP用于设置IO端口的输入模式,通用I / O端口引脚可配置为具有上拉,下拉或三态操作模式。 默认情况下,复位后,输入配置为带有上拉的输入。如果要取消输入端口的上拉或下拉功能,必须将PxINP中的相应位设置为1。
I / O端口引脚P1.0和P1.1不具有上拉或下拉功能。
请注意,即使IO端口是外设功能输入,配置为外设I / O信号的引脚也不具有上拉或下拉功能。
其中,P2INP中,第0位至第4位是端口2的输入模式选择位,第5位至第7位是端口0、端口1、端口2的上下拉选择位。
外设 I/O
串口
DMA控制器
ADC
看门口
USB控制器
如何实现组播,广播通信,怎么识别组播、广播?
// Setup for the periodic message's destination address
// Broadcast to everyone
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//这是设置广播
SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
// Setup for the flash command's destination address - Group 1
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; //这是设置组播
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
// By default, all devices start out in Group 1
SampleApp_Group.ID = 0x0001;
osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
// Fill out the endpoint description.
SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; //填充端点信息
SampleApp_epDesc.task_id = &SampleApp_TaskID;
SampleApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
SampleApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &SampleApp_epDesc );
区别发送和接收不同的信息?
实现过程:
用户添加自定义的组播通信或广播通信应该与用户或系统事件响应函数结合起来,将组播或广播控制字的定义与消息响应函数的实现一同考虑。
(1)声明射频地址类型变量、应用层的组变量,在初始化用户任务时给定义的这些变量赋初值。在App目录的用户应用程序文件中实现。
例如
// Setup for the periodic message's destination address
// Broadcast to everyone
SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//这是设置广播
SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Periodic_DstAddr.addr.shortAddr = 0xFFFF;
// Setup for the flash command's destination address - Group 1
SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; //这是设置组播
SampleApp_Flash_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;
// By default, all devices start out in Group 1
SampleApp_Group.ID = 0x0001;
osal_memcpy( SampleApp_Group.name, "Group 1", 7 );
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
// Fill out the endpoint description.
SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; //填充端点信息
SampleApp_epDesc.task_id = &SampleApp_TaskID;
SampleApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
SampleApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &SampleApp_epDesc );
()定义射频消息簇ID 用于识别通过组播或广播传送到的、用户自定义的射频数据包。
例如:
(2)声明组播或广播射频发送过来后,进行接收消息数据包的回调函数的原型。并在消息回调函数中添加处理接收到的射频数据包的程序代码。
void SampleApp_SendFlashMessage( uint16 flashTime )//接收射频数据包的函数,并进行处理
{
uint8 buffer[3];
buffer[0] = (uint8)(SampleAppFlashCounter++);
buffer[1] = LO_UINT16( flashTime );
buffer[2] = HI_UINT16( flashTime );
if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_FLASH_CLUSTERID,
3,
buffer,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
(4)定义组播或广播数据发送函数,用于响应特定的用户或系统事件,在用户任务的事件处理函数(SampleApp ProcessEvent)电调用。
void SampleApp_SendPeriodicMessage( void ) //广播发送
{
if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_PERIODIC_CLUSTERID,
1,
(uint8*)&SampleAppPeriodicCounter,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
void SampleApp_SendFlashMessage( uint16 flashTime ) //组播发送
{
uint8 buffer[3];
buffer[0] = (uint8)(SampleAppFlashCounter++);
buffer[1] = LO_UINT16( flashTime );
buffer[2] = HI_UINT16( flashTime );
if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc,
SAMPLEAPP_FLASH_CLUSTERID,
3,
buffer,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
}
else
{
// Error occurred in request to send.
}
}
书中说明,可以参考。
参考:
1.https://blog.csdn.net/ysh1042436059/article/details/86579339
最后
以上就是紧张外套为你收集整理的zigbee中的cc2530的全部内容,希望文章能够帮你解决zigbee中的cc2530所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复