Z-Stack 3.0.1 ZNP開發(一)--通訊串口調整

概述

芯片:CC2530
協議棧: Z-Stack 3.0.1
功能:使用串口1的P1.6,P1.7連接MT7628,讓CC2530通過ZNP和MT7628進行通訊。

TI所提供的ZNP工程默認情況下是採用串口0與MCU進行通信,所以接下來就需要通過修改代碼來實現串口1與MCU進行通信。

硬件原理

這裏寫圖片描述

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);
  }
}

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

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
}

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

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:
在該配置中,可以修改信道等信息

編譯測試

在修改完成後,進行編譯並下載到CC2530中。
使用USB轉串口,與CC2530的Uart0連接。然後使用Z-TOOLS工具進行測試。
這裏寫圖片描述

測試結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章