关于stm32与Zigbee一些问题?求大神回答

关于stm32与Zigbee一些问题?求大神回答,第1张

如果ZigBee模块是买现成的,里面有卖家烧好的程序,你可以根据卖薯庆销家给你的手册进行 *** 作,一般有透明传输模式。STM32只须向ZigBee模块传输你规定的协议差伍数据即可,如果ZigBee模块是自己画的,那么自然需要编写数游相关程序,要烧写程序啦

STM32W108两点间及多点间的通信实例很多,技术上很简单,可参考如下代码进行调试:

程序的设计基于SimpleMac协议栈进行,根据官方提供的MAC协议栈慎激闹示例代码进行的裁剪更改,

**************************************************************************

功能描述:向参数中传入的地址发送类型负载类型为PT_LED的数据包

输入参数:vddMillivolts为发送的16位数据,dstShortAddr为目的地址,sendDirectly为调用不同发送函数的表示符。

输出参数:无

*************************************************************************/

voidsendVddDataPacket2(u16 vddMillivolts, u16 dstShortAddr, boolean sendDirectly)

{

u8 packet[128]

//对数据包进行包装

packet[0] = (15+2)//长度

packet[1] = FCF_DATA + FCF_ACKREQ +FCF_INTRAPAN//帧类型

packet[2] = FCF_SHORTDST + FCF_SHORTSRC//地址类型

currSeqNum++//数据包序列号

packet[3] = currSeqNum

packet[4] =(ST_RadioGetPanId()>>0)&0xFF//目标PAN ID

packet[5] =(ST_RadioGetPanId()>>8)&0xFF

packet[6] =(dstShortAddr>>0)&0xFF//目标Node ID

packet[7] =(dstShortAddr>>8)&0xFF

packet[8] =(ST_RadioGetNodeId()>>0)&0xFF//源PAN ID

packet[9] =(ST_RadioGetNodeId()>>8)&0xFF

packet[10] = PT_LED//数据包类型

packet[11] =(vddMillivolts>>0)&0xFF//发送的16位数据

packet[12] = (vddMillivolts>>8)&0xFF

//归零Tx SFD有效负载,MSB用于指示SFD有效

packet[13] = 0

packet[14] = 0

packet[15] = 0

enqueueTxPacket(sendDirectly,dstShortAddr, packet, 13)//调用发送函数

//发送完成后令LED_D3先灭后亮闪烁一次,之后串口输出“send already!”

#ifdefPLANET_ROLE

halSetLed(LED_D3)

halCommonDelayMilliseconds(500)//500ms

halClearLed(LED_D3)

#endif

printf("send already!\r\n")

}

接收数据

/**************************************************************************

功能描述:对接收的数据铅伍包进行解析解码处理,并根据不同类型的数据包执行不同的 *** 作,数宽罩据包信息通过数据包回调函数保存在结构体变量rxData中

输入参数:无

输出参数:无

***************************************************************************/

voidprocessRxPacket(void)

{

…...

//不同的数据包类型,不同的处理

switch(packetType) {

case (GENERIC_DATA_PACKET): //普通类型数据包

RX_DETAILS(printf("GENERIC_DATA_PACKET\r\n"))

#ifdefSUN_ROLE

case (LED_PACKET): //PT_LED数据包

printf("Message from myPLANET\r\n")

halSetLed(LED_D1)//点亮LED

halCommonDelayMilliseconds(500)//延时500ms

halClearLed(LED_D1)

break

#endif

case (SUN_SEARCH_PACKET): //处理搜索父节点的数据包

RX_DETAILS(printf("SUN_SEARCH_PACKET\r\n"))

for(i=0i<PLANET_TABLE_SIZEi++) //扫描子节点数组

{

if(!planetTable[i].active) //判断是否有有效空间

{

packet[0] = (24+2)//数据包长度

packet[1] = FCF_DATA//帧类型

packet[2] = FCF_LONGDST +FCF_LONGSRC//地址类型

currSeqNum++//数据包序列号

packet[3]=currSeqNum

packet[4] =(0xFFFF>>0)&0xFF//16位短目标地址

packet[5] =(0xFFFF>>8)&0xFF

memcpy((packet+6), longSrcAddr, 8)//64位长目标地址

packet[14] =(ST_RadioGetPanId()>>0)&0xFF//16位源PAN ID

packet[15] =(ST_RadioGetPanId()>>8)&0xFF

memcpy((packet+16), ST_RadioGetEui64(),8)//64位长源地址

packet[24] = PT_SUN_AVAILABLE//负载类型

enqueueTxPacket(TRUE, 0xFFFF, packet,0)//广播

break

}

}

break

case (SUN_AVAILABLE_PACKET): //SUN节点发送的父节点可用数据包

RX_DETAILS(printf("SUN_AVAILABLE_PACKET\r\n"))

if(availableSunFound) //如果已加入网络,则停止父节点搜索

{

return

}

if(srcPanId!=MyPANID) //如果PANID不同,则不处理此数据包

{

goto stopProcessing

}

availableSunFound=TRUE

ST_RadioSetPanId(srcPanId)//设置节点PANID

packet[0] = (22+2)//数据包长度

packet[1] = FCF_DATA + FCF_ACKREQ +FCF_INTRAPAN//帧类型

packet[2] = FCF_LONGDST + FCF_LONGSRC//地址类型

currSeqNum++ //数据包序列号

packet[3]=currSeqNum

packet[4] =(ST_RadioGetPanId()>>0)&0xFF//16位短目标地址

packet[5] =(ST_RadioGetPanId()>>8)&0xFF

memcpy((packet+6), longSrcAddr, 8)//64位长目标地址

memcpy((packet+14), ST_RadioGetEui64(),8)//64位长源地址

packet[22] = PT_JOIN_REQUEST//负载类型

enqueueTxPacket(TRUE, 0xFFFF, packet, 0)//单播发送请求加入网络数据包

break

case (JOIN_REQUEST_PACKET): //SUN节点收到请求加网的包

RX_DETAILS(printf("JOIN_REQUEST_PACKET\r\n")) //串口终端显示

{

u8 flag=0

u8 pt= PT_JOIN_DENIED//负载类型

u8 assignedShortId[2] = {0xFE, 0xFF}

packet[0] = (24+2)//数据包长度

packet[1] = FCF_DATA + FCF_ACKREQ +FCF_INTRAPAN//帧类型

packet[2] = FCF_LONGDST + FCF_LONGSRC//地址类型

currSeqNum++ //数据包序列号

packet[3]=currSeqNum

packet[4] =(ST_RadioGetPanId()>>0)&0xFF//16位短目标地址

packet[5] =(ST_RadioGetPanId()>>8)&0xFF

memcpy((packet+6), longSrcAddr, 8)//64位长目标地址

memcpy((packet+14), ST_RadioGetEui64(),8)//64位长源地址

/*搜寻表中是否存在与加网节点相同的64位长地址,如果有则覆盖,若没有则继续遍历表*/

for(i=0i<PLANET_TABLE_SIZEi++)

{

u8 k=0

while(k<8)

{

if(planetTable[i].longAddr[k]!=rxData.packet[14+k])

break

k++

}

if(k==8)

{

planetTable[i].active = TRUE

shortAddrCounter++

planetTable[i].shortAddr =shortAddrCounter

pt = PT_JOIN_ACCEPTED//允许加入网络负载类型

assignedShortId[0] =(shortAddrCounter>>0)&0xFF

assignedShortId[1] =(shortAddrCounter>>8)&0xFF

printf("Join: Planet 0x%04X(index %d) has joined the network\r\n",

shortAddrCounter, i)

flag=1

break

}

}

if(flag==0) //如果没有找到相同长地址,则查找空缺位置加进去

{

for(i=0i<PLANET_TABLE_SIZEi++)

if(!planetTable[i].active) {

planetTable[i].active = TRUE

shortAddrCounter++

planetTable[i].shortAddr =shortAddrCounter

memcpy(planetTable[i].longAddr, longSrcAddr,8)

pt = PT_JOIN_ACCEPTED //允许加入网络负载类型

assignedShortId[0] =(shortAddrCounter>>0)&0xFF

assignedShortId[1] =(shortAddrCounter>>8)&0xFF

printf("Join: Planet 0x%04X(index %d) has joined the network\r\n",

shortAddrCounter, i)

break

}

}

packet[22] = pt//负载类型

packet[23] = assignedShortId[0]

packet[24] = assignedShortId[1]

enqueueTxPacket(TRUE, 0xFFFF, packet,0)//单播回应

}

break

case (JOIN_ACCEPTED_PACKET): //PLANET节点处理加入网络允许数据包

RX_DETAILS(printf("JOIN_ACCEPTED_PACKET\r\n"))

ST_RadioSetNodeId((rxData.packet[payloadStart+1]<<0)|

(rxData.packet[payloadStart+2]<<8))//设置NodeID

networkJoinedStopSearching = TRUE//加入网络成功,停止搜索

break

case (JOIN_DENIED_PACKET): //PLANET节点处理加入网络拒绝数据包

RX_DETAILS(printf("JOIN_DENIED_PACKET\r\n"))

ST_RadioSetPanId(0xFFFF)//重设PANID

break

……

……

default:

RX_DETAILS(printf("Unknown payloadtype\r\n"))

goto stopProcessing

}

stopProcessing:

rxData.packetBeingProcessed = FALSE

}

具体的调试过程中,进行灵活堂握。

如果是我的话,首先进行串口自回环测试,排除硬件串口引脚隐患。

然后观察c8t6串口的引脚,注意,是c8t6串口接收引脚,手春有无波形。

c8t6板子接上调试器,在线调试看看能不埋孙能进串口中毕液耐断。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12540410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存