芯片:CC2530
协议栈: Z-Stack 3.0.1
功能:使用串口1的P1.6,P1.7连接MT7628,让CC2530通过ZNP和MT7628进行通讯。
TI所提供的ZNP工程默认情况下是采用串口0与MCU进行通信,所以接下来就需要通过修改代码来实现串口1与MCU进行通信。
本次修改是基于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
在工程中,有三种接口:串口、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);
}
}
通过源码分析,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
这一步可以选择的操作,如果原理图中有流控的引脚有接,并且需要进行流控,可以不必关闭。串口初始化位于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
}
在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
在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工具进行测试。
测试结果