打印
[Zigbee]

Z-Stack 3.0.1 ZNP开发--通讯串口调整

[复制链接]
912|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aoyi|  楼主 | 2020-2-1 18:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
概述
芯片:CC2530
协议栈: Z-Stack 3.0.1
功能:使用串口1的P1.6,P1.7连接MT7628,让CC2530通过ZNP和MT7628进行通讯。

TI所提供的ZNP工程默认情况下是采用串口0与MCU进行通信,所以接下来就需要通过修改代码来实现串口1与MCU进行通信。

硬件原理



使用特权

评论回复

相关帖子

沙发
aoyi|  楼主 | 2020-2-1 18:12 | 只看该作者
ZNP工程配置及修改步骤
本次修改是基于Z-Stack 3.0.1协议栈,其ZNP工程位于协议栈中如下目录

Texas Instruments\Z-Stack 3.0.1\Projects\zstack\ZNP\CC253x

编译选择的是CC2530-Debug分支。相关的介绍文档位于

Texas Instruments\Z-Stack 3.0.1\Documents\API/Z-Stack ZNP Interface Specification.pdf

Step1:使能CC2530串口支持
在工程中,有三种接口:串口、SPI、USB接口,但是CC2530只能通过串口与MCU连接,ZHA1.2.2a的ZNP工程可以使用SPI和串口连接。
在Z-Stack ZNP Interface Specification 规范文档2.2.1章节,介绍了硬件的接口,其中需要注意的就是CFG0和CFG1这两个硬件引脚。

CFG0在2.2.1.1.1 Configuration Pins章节中介绍了,其用于控制CC2530是否使用内置的32K时钟还是外置的32K时钟。有的Zigbee模块上为了节省成本可能不会焊接32K时钟,这点在使用的时候需要确认。

CFG1在文档中并没有介绍,但是通过ZNP的功能代码或者ZHA1.2.2a协议栈中关于ZNP的文档可以了解到,CFG1接口用于控制ZNP的接口方式。
CC2530 ZNP接口方式的初始化代码位于InitBoard函数中:

/*********************************************************************
* @fn      InitBoard()
* @brief   Initialize the CC2420DB Board Peripherals
* @param   level: COLD,WARM,READY
* @return  None
*/
void InitBoard( uint8 level )
{
  if ( level == OB_COLD )
  {
    // IAR does not zero-out this byte below the XSTACK.
    *(uint8 *)0x0 = 0;
    // Interrupts off
    osal_int_disable( INTS_ALL );
    // Check for Brown-Out reset
    ChkReset();

#if defined CC2531ZNP
    znpCfg1 = ZNP_CFG1_UART;
#elif defined CC2530_MK
    znpCfg1 = ZNP_CFG1_SPI;
    znpCfg0 = ZNP_CFG0_32K_OSC;
#else
    /*
    znpCfg1 = P2_0;
    znpCfg0 = P1_2;
    // Tri-state the 2 CFG inputs after being read (see hal_board_cfg_xxx.h for CFG0.)
    P1INP |= BV(2);
    P2INP |= BV(0);
  */
    znpCfg1 = ZNP_CFG1_UART;//配置为串口工作方式
    znpCfg0 = ZNP_CFG0_32K_OSC;//配置为内置时钟
#endif
  }
  else  // !OB_COLD
  {
    /* Initialize Key stuff */
    HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback);
  }
}


131465e354efdc2b87.png (63.03 KB )

131465e354efdc2b87.png

使用特权

评论回复
板凳
aoyi|  楼主 | 2020-2-1 18:13 | 只看该作者
Step2:配置串口1用于ZNP接口
通过源码分析,main->HalDriverInit->HalUARTInit->HalUARTInitDMA,在HalUARTInitDMA函数中对串口的GPIO进行配置,但是选择串口0或者串口1是通过HAL_UART_DMA宏定义来决定的,所以需要修改HAL_UART_DMA宏定义,让其选择串口1的配置。
HAL_UART_DMA宏定义位于hal_board_cfg.h文件下


#if defined HAL_SB_BOOT_CODE
#define HAL_UART_DMA  0
#define HAL_UART_ISR  2 //由1修改为2
#else
#define HAL_UART_DMA  2 //由1修改为2
#define HAL_UART_ISR  0
#endif
#define HAL_UART_USB  0


使用特权

评论回复
地板
aoyi|  楼主 | 2020-2-1 18:13 | 只看该作者
Step3:关闭串口的流控
这一步可以选择的操作,如果原理图中有流控的引脚有接,并且需要进行流控,可以不必关闭。串口初始化位于npInit函数中

源文件znp_app.c

static void npInit(void)
{
  if (ZNP_CFG1_UART == znpCfg1)
  {
    halUARTCfg_t uartConfig;

    uartConfig.configured           = TRUE;
    uartConfig.baudRate             = ZNP_UART_BAUD;
#ifdef ZNP_ALT
    uartConfig.flowControl          = FALSE;
#else
    uartConfig.flowControl          = FALSE; //关闭流控
#endif
    uartConfig.flowControlThreshold = HAL_UART_FLOW_THRESHOLD;
    uartConfig.rx.maxBufSize        = HAL_UART_RX_BUF_SIZE;
    uartConfig.tx.maxBufSize        = HAL_UART_TX_BUF_SIZE;
    uartConfig.idleTimeout          = HAL_UART_IDLE_TIMEOUT;
    uartConfig.intEnable            = TRUE;
    uartConfig.callBackFunc         = npUartCback;
    HalUARTOpen(HAL_UART_PORT, &uartConfig);
    MT_UartRegisterTaskID(znpTaskId);
  }
  else
  {
    /* npSpiInit() is called by hal_spi.c: HalSpiInit().*/
  }

  npInitNV();
#if defined (MT_ZDO_FUNC)
  MT_ZdoInit();
#endif
  MT_SysResetInd();
#if defined ZCL_KEY_ESTABLISH
#if defined TC_LINKKEY_JOIN
  zcl_TaskID = znpTaskId;
#endif
#endif
#if LQI_ADJUST
  ZMacLqiAdjustMode(LQI_ADJ_MODE1);
#endif
#if defined CC2531ZNP
  (void)osal_pwrmgr_task_state(znpTaskId, PWRMGR_HOLD);
#endif
}


使用特权

评论回复
5
aoyi|  楼主 | 2020-2-1 18:14 | 只看该作者
Step4:修改HAL_UART_PORT值
在ZNP工程中,HAL_UART_PORT的值一直是0,所以在npInit函数中,一直打开的是串口0而不是串口已,这会导致ZNP无法通讯,所以需要修改HAL_UART_PORT的值为1或者添加如下宏定义

源文件:OnBoard.h
#if (HAL_UART_DMA == 1)
#define HAL_UART_PORT             0
#else
#define HAL_UART_PORT             1
#endif


使用特权

评论回复
6
aoyi|  楼主 | 2020-2-1 18:14 | 只看该作者
Step5:修改ZNP相关参数
在Z-Stack Monitor and Test API.pdf中有许多的功能,如果想添加这些功能可以在工程的Tools/znp.cfg中定义相关的功能宏。
Tools/znp.cfg:

/* MAC Settings */
-DMAC_CFG_APP_PENDING_QUEUE=TRUE

/* Generic All-in-One Settings */
-DZSTACK_DEVICE_BUILD="(DEVICE_BUILD_COORDINATOR | DEVICE_BUILD_ROUTER | DEVICE_BUILD_ENDDEVICE)"

/* Other Settings */
-DNWK_AUTO_POLL

// The watchdog can be enabled to break out of a locked SPI transaction - not recommended for development, debug & test.
-DZNP_RUN_WDOG=FALSE

-DZNP_UART_BAUD=HAL_UART_BR_115200 //波特率

-DZIGBEEPRO
-DZIGBEE_FRAGMENTATION
-DINTER_PAN
-DOSAL_CLOCK
-DOSAL_SAPI=FALSE
-DSAPI_CB_FUNC=FALSE

-DHOLD_AUTO_START
-DNV_RESTORE
-DNV_INIT
-DNUM_DISC_ATTEMPTS=0

//-DSRC_RTG_EXPIRY_TIME=255
//-DCONCENTRATOR_ENABLE=TRUE
//-DCONCENTRATOR_DISCOVERY_TIME=60
//-DMAX_RTG_SRC_ENTRIES=100

// Define this flag to enable ZNP implementation of the ZCL_KEY_ESTABLISHMENT_ENDPOINT and task.
//-DTC_LINKKEY_JOIN

/*
* Monitor Test Interface
*/

/* MT_UTIL interface */
-DMT_UTIL_FUNC

/* MT_SYS interface */
-DMT_SYS_FUNC

/* MT_AF interface */
-DMT_AF_FUNC

/* MT_SAPI Interface */
-DMT_SAPI_FUNC
-DMT_SAPI_CB_FUNC

// ZNP Conglomerate Commands and Responses.
//-DMT_ZNP_FUNC

/* MT_ZDO interface */
-DMT_ZDO_CB_FUNC
-DMT_ZDO_FUNC
-DMT_ZDO_MGMT
-DMT_ZDO_EXTENSIONS

/* MT_GP GreenPower interface */
-DMT_GP_CB_FUNC

/* MT_APP interface - useful when ZAP defines ZAP_ZNP_MT for MT_SYS_APP_MSG pass-through. */
-DMT_APP_FUNC
-DMT_APP_CNF_FUNC


Tools/f8wconfig.cfg:
在该配置中,可以修改信道等信息

使用特权

评论回复
7
aoyi|  楼主 | 2020-2-1 18:14 | 只看该作者
本帖最后由 aoyi 于 2020-2-1 18:19 编辑

编译测试

在修改完成后,进行编译并下载到CC2530中。
使用USB转串口,与CC2530的Uart0连接。然后使用Z-TOOLS工具进行测试。




使用特权

评论回复
8
aoyi|  楼主 | 2020-2-1 18:19 | 只看该作者

测试结果


使用特权

评论回复
9
drer| | 2020-3-1 10:05 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
gwsan| | 2020-3-1 10:09 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
11
kxsi| | 2020-3-1 10:12 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

3307

帖子

3

粉丝