目录

1、CC2530中串口波特率改为9600时单个数据包来不及接收的解决方案

2、使用串口0预编译

3、通过修改PANID实现多个网络的共存

4、zstack中发现PANID冲突的解决办法





1、CC2530中串口波特率改为9600时单个数据包来不及接收的解决方案


在调试CC2530过程中发现波特率改为9600时,单个包仅有3个Byte时,接收DMA就会启动

因而数据包被强迫拆分成多个,显然只要将接收DMA启动延时做到足够大即可。




hal_dma.c

HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR )


#if HAL_UART_DMA


  if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX))


  {



HalUARTIsrDMA();

  }


#endif // HAL_UART_DMA




进入定义函数HalUARTIsrDMA();的地方,找到如下所示的地方进行修改。


_hal_uart_dma.c



#if (HAL_UART_DMA == 1)

#define HAL_UART_PERCFG_BIT        0x01         // USART0 on P0, Alt-1; so clear this bit.


#define HAL_UART_Px_RX_TX          0x0C         // Peripheral I/O Select for Rx/Tx.


#define HAL_UART_Px_RTS            0x20         // Peripheral I/O Select for RTS.


#define HAL_UART_Px_CTS            0x10         // Peripheral I/O Select for CTS.


#else


#define HAL_UART_PERCFG_BIT        0x02         // USART1 on P1, Alt-2; so set this bit.


#define HAL_UART_Px_RTS            0x20         // Peripheral I/O Select for RTS.


#define HAL_UART_Px_CTS            0x10         // Peripheral I/O Select for CTS.


#define HAL_UART_Px_RX_TX          0xC0         // Peripheral I/O Select for Rx/Tx.


#endif



// The timeout tick is at 32-kHz, so multiply msecs by 33.


#define  HAL_UART_MSECS_TO_TICKS    200

  ​//33 



经过上述修改,可在9600波特率下传送足够大的数据包。


============================================


2、使用串口0预编译


MT_uart.c void MT_UartInit () 


  #if defined (ZTOOL_P1) || defined (ZTOOL_P2)

   uartConfig.callBackFunc         = MT_UartProcessZToolData;

#elif defined (ZAPP_P1) || defined (ZAPP_P2)

   uartConfig.callBackFunc         = MT_UartProcessZAppData;

#else

   uartConfig.callBackFunc         = NULL;

#endif 

这个是预编译,根据预先定义的 ​ZTOOL​或者​ZAPP​选择不同的数据处理函数。

后面的​P1​和​P2​则是串口​0​和串口​1​。我们用​ZTOOL​,串口​0​。

我们可以在​option​——​C/C++​的​CompilerPreprocessor​里面看到​,​已经默认添加​ZTOOL_P1​预编译。

============================================


3、通过修改PANID实现多个网络的共存

(1)、PANID简介

PANID其全称是Personal Area Network  ID,即某个网络的标识符,是针对一个或 多个应用的网络,

一般是mesh或者cluster tree两种拓扑结构之一。

一个网络只有一个PANID,该网络中的所有节点的panID唯一,它是由协调器生成的,PANID是可选配置项,

用来控制ZigBee路由器和终端节点要加入那个网络。 若要在应用中查看PANID,可以通过_NIB.nwkPanId读取即可。

(2)、具体操作

协议栈中的文件f8wConfg.cfg中的 ZDO_CONFIG_PAN_ID 参数可以设置为一个 0~0x3FFF 之间的一个值。

协调器使用这个值,作为它要启动的网络的 PAN ID。

而对于路由器节点和终端节点来说只要加入一个已经用这个参数配置了PANID的网络。

如果要关闭这个功能,只要将这个参数设置为0xFFFF。

要更进一步控制加入过程,需要修改 ZDApp.c 文件中ZDO_NetworkDiscoveryConfirmCB 函数。

现在分析当关闭PAN ID的配置功能,即令ZDAPP_CONFIG_PAN_ID为默认的0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PANID(0~0x3FFF),XXX经过试验发现,这个随机的PANID并非完全随机,其与IEEE地址有一定的关系:要么就是IEEE地址的低16位,要么就是一个与IEEE地址低16位非常相似的值。如IEEE地址为0x8877665544332211,PANID很有可能就是2211,或相似的值;IEEE地址为0x8877665544337777,PANID很有可能就是3777,或其它相似的值。


为了便于查找与修改,这里列出Z-stack中相关部分代码Tools下f8wConfig.cfg里面:

-DZDAPP_CONFIG_PAN_ID=0xFFFF




============================================

4、zstack中发现PANID冲突的解决办法

在同一空间如果同时存在多个zigbee网络,可能出现的一个问题就是网络ID(PANID)冲突,这问题会导致zigbee网络出现混乱。

在zigbee2004和zigbee2006这个问题没有解决办法,到了zigbee 2007协议有了描述,不过各厂家的解决不太一样。

就ZSTACK来说,引入了一个叫网络管理节点的概念,通过激活网络管理节点,可以解决PANID冲突的问题。

可以按照下图提示的方法,添加宏NWK_MANAGER,来激活网络管理节点。

ZigBee常见问题_#define

需要注意的是网络管理节点只能是协调器或者路由器,终端节点不适合作为网络管理节点;一个网络只能存在一个网络管理节点,如果同时有多个网络管理节点,会导致网络管理的混乱。



============================================