Proprietary Knowledge Base

    Publish
     
      • Si4x6x/EZR32芯片中不用到的管脚怎么连

        JunFan | 11/311/2017 | 02:52 AM

        实际应用中,客户经常问到以上芯片不用的管脚怎么连接,经查KBA非常感谢Daniel的建议如下:

        • TX脚: 不连
        • RXP, RXN脚: 不连
        • 其它GPIO 脚: 不连
      • 实用的通信距离计算器

        JunFan | 11/311/2017 | 02:36 AM
        Silabs已发布了通信距离计算器。该工具可以根据通信场合,发射功率,接收灵敏度,频率,天线增益等参数来计算真空中及实际应用场合的通信距离。英文板的KBA如下地址:https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2017/05/02/rf_range_calculator-RtCs
      • 建立C++的BLE工程

        Kevin_Fu | 10/290/2017 | 11:10 PM

        使用BLE协议栈建立C++工程需要如下步骤:

        1. 在main.cpp注释掉att.h并使用extern C围绕所有头文件。

        2. 建立att.c文件,其包含stdint.h和att.h,并将其加入工程。

        3. 使用C/C++编译选项:auto(extension-based)

      • PCB number of layers vs Output power

        dasimon | 08/229/2017 | 07:33 AM

        Using a 2-layer PCB in the application hardware is usually preferred by customers due to cost saving purposes. Still, based on the RF output power level, unwanted radiation of top or bottom layer traces (mostly VDD or digital) can occur, which causes that the application can violate the harmonic limits of the related standards. In order to minimize the possibility of unwanted trace radiations, Silicon Labs recommends to use multilayer PCBs in the following cases:

         

        • >=16dBm output power at sub-GHz frequencies
        • >=10dBm output power at 2.4GHz

        Note that the actual recommendation depends on which standard (ETSI, FCC, ARIB, etc.) the application has to be compliant with.

         

        One can notice that not all Silicon Labs reference design follows the above listed recommendations. EZRadioPRO reference design boards are made on 2 or 4 PCB layers based on the output power, while all EZR32 and EFR32 reference design boards are using 4 or 6 PCB layers due to the complexity of the design. In the latter case, the layout routing could not be realised on a 2-layer PCB if all digital traces were intended to be used. Of course, on a custom design where the complexity of the design is much less, 2-layer PCBs can be used for EZR32 or EFR32 applications as well considering the above listed recommendations.

      • 如何使用Network rejoin加入网络?

        Lesun | 08/218/2017 | 10:39 PM

        问题

         

        设备如何使用Network rejoin方式加入网络?

        答案

         

        本文主要讲解设备在拥有网络信息的情况下,如何通过NWK rejoin的方式入网。通常可通过外部的方式将网络信息传送给某设备节点,该设备节点获取所需要的网络信息后,直接通过NWK rejoin加入网络。此时该网络不需要处于允许设备入网状态(即PJoin状态未开启也可以入网)。下面通过一个例子来讲解该过程。本实验使用两块WSTK+4151radio板。

         

        首先,将UART Bootloader以及NCP firmware烧录一个4151radio板。将板子连接电脑,使用Simplicity Command进行烧录,在CM中输入如下命令:

         

        C:\Users\Lesun>commander flash C:\SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\protocol\zigbee_5.10\ncp-images\efr32mg1p232f256gm48\ncp-uart-rts-cts-use-with-serial-uart-btl-5.10.1.s37 C:\SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\protocol\zigbee_5.10\tool\bootloader-efr32mg1p232f256gm48\serial-uart-bootloader\serial-uart-bootloader.s37

         

         其次,在Cgywin中编译Z3Gateway sample,并运行Host程序,使用如下命令建立网络。使用info CLI命令查看当前网络信息,在下一步设备加入网络时需要用到,包括网络PANID、信道、Network Key等,如下图所示。在Host端输入keys print可以查看该网络的Network Key。

         

        1.png

         

        然后,使用Z3Light sample作为基础示例,在其Z3LightSOC_callback.c上增加如下核心代码:

           

        EmberStatus MyNodeSecurityInit()
        {
                 EmberInitialSecurityState state;
                 EmberStatus status;
                 EmberKeyData NetworkKey = {0x58,0x12,0x17,0x34,0x64,0xC7,0x7A,0xDC,0x40,0xD9,0x39,0x01,0xFB,0xD0,0xF4,0xAE,};
         
                 MEMSET(&state, 0, sizeof(EmberInitialSecurityState));
                 state.bitmask |= EMBER_HAVE_NETWORK_KEY;
         
                 MEMMOVE(emberKeyContents(&state.networkKey),
                         emberKeyContents(&NetworkKey),
                         EMBER_ENCRYPTION_KEY_SIZE);
         
                 emberAfSecurityPrintln("set state to: 0x%2x", state.bitmask);
                 status = emberSetInitialSecurityState(&state);
                 if (status != EMBER_SUCCESS) {
                   emberAfSecurityPrintln("security init node: 0x%x", status);
                   return status;
                 }
         
                 return EMBER_SUCCESS;
        }

         

        void findingAndBindingEventHandler()
        {
        #if 0
          if (emberAfNetworkState() == EMBER_JOINED_NETWORK) {
            emberEventControlSetInactive(findingAndBindingEventControl);
            emberAfCorePrintln("Find and bind target start: 0x%X",
                               emberAfPluginFindAndBindTargetStart(LIGHT_ENDPOINT));
          }
        #else
               EmberStatus status = EMBER_INVALID_CALL;
               EmberNodeType nodeType = EMBER_ROUTER;
               EmberNetworkParameters networkParams;
         
               MEMSET(&networkParams, 0, sizeof(EmberNetworkParameters));
               networkParams.radioChannel = 25;
               networkParams.radioTxPower = 8;
               networkParams.panId = 0x08B6;
               networkParams.joinMethod = EMBER_USE_NWK_REJOIN_HAVE_NWK_KEY;
         
         
               emberEventControlSetInactive(findingAndBindingEventControl);
         
               status = MyNodeSecurityInit();
         
               emberAfCorePrintln("MyNodeSecurityInit status = 0x%X", status);
         
               status = emberJoinNetwork(nodeType, &networkParams);
         
               emberAfCorePrintln("%ping on ch %d, panId 0x%2X.  status = 0x%X",
                                   "Join",
                                                    networkParams.radioChannel,
                                                    networkParams.panId, status);
        #endif
        } 

         

         

        最后,将Bootloader以及编译生成的应用程序烧录另一个4151radio板,按下WSTK地板上任何一个按键,可以看到该设备成功加入刚才建立的网络。输入info CLI命令可以查看该设备的网络信息,如下图所示。

         2.png

         

        总结:以上主要介绍一种out-of-band的实现方式。当设备获取网络参数之后,可以通过NWK rejoin加入网络,即通过调用emberJoinNetwork()以及在此之前调用emberSetInitialSecurityState()来实现。其中需要将安全状态的bitmask 设置为EMBER_HAVE_NETWORK_KEY,并设置正确的网络Key。

      • EmberZnet调试UART-NCP(基于EFR32MG)的一些实用方法

        Lesun | 07/208/2017 | 11:04 PM

        问题

         

        EmberZnet调试UART-NCP(基于EFR32MG)的一些实用方法

        答案

         

        通常客户在设计Gateway的时候使用Host+NCP模式。在客户的设计中常用32Pin的EFR32MG的芯片进行Gateway设计开发,其中NCP与UART使用两线串口(Tx/Rx)相连。本文提供在该情境下调试NCP的一些实用方法。

         

        首先,由于Silicon Labs在stack中只提供关于标准无线板(如BRD4151/BRD4161 radio board)的预制固件,包括Bootloader以及NCP firmware。任何其它型号的芯片,尤其是32Pin的EFR32MG芯片的固件都需要客户自己进行自定义编译。

         

        在此有两篇关于如何编译自定义固件的KBA,供客户参考。

        Make customized ZigBee bootloader for the EFR32MG1 QFN32 parts

        Make customized ZigBee xNCP images for EFR32MG parts 

         

        注意:在编译NCP的时候,最关键的几点内容如下:

         

        • UART的GPIO管脚是否配置正确
        • 客户版上是否使用外部的768K低频晶振。(stack中默认是不使用此外部晶振,可以在程序头文件中使用宏来控制)
        • NCP的Plugin中流控类型选定为software control

        当编译好板子对应的固件(Bootloader以及NCP firmware)的时候,现在需要对板子进行烧录和调试。

         

        • 使用Silicon Labs的WSTK主版作为烧录器,将WSTK的10Pin调试口与客户版的10Pin Mini-Simplicity Connector相连。打开Simplicity Studio,将WSTK主板的“Debug Mode”设置为OUT。
        • 可以通过烧录RAILTest或Nodetest或自己编译的SOC程序验证串口是否正常工作。
        • 将Bootloader先烧录到客户板中,注意:烧录的时候先擦除芯片,保证此时只烧录Bootloader。这样做的好处是芯片在上电启动之后直接进去Bootloader模式,正常情况下在串口中可以看到打印信息,以表明串口的硬件连接没有问题。
        • 将客户板的串口连上UART转USB口模块,并连接上PC电脑(在此以Win7系统为例)。在电脑上打开串口工具,正常情况下,可以看到如下类似信息即表明串口以及Bootloader已经正常工作。

        1.png

        • 继续在客户版中烧录已经编译好的NCP固件。在Win7 PC机上面的Cygwin环境中编译Host程序验证NCP是否正常工作,可以直接使用Z3GatewayHost例程。
        • 输入以下命令,启动Host程序:

        ./build/exe/Z3GatewayHost.exe -n 1 -p com44

         

        如果能看到如下信息,表明NCP程序工作正常。

        2.png

         

      • 如何使用Inter-Pan消息实现两个不同网络的设备之间的单跳通信?

        Lesun | 07/199/2017 | 03:39 AM

        问题

         

        如何使用Inter-Pan消息实现两个不同网络的设备之间的单跳通信?

        答案

         

        Inter-Pan消息可用于不同网络,同一信道的两个设备之间的单跳通信。Silicon Labs提供Inter-Pan Plugin,方便客户在此Plugin的基础上扩展,以在自己的应用中实现Inter-Pan消息的发送和接收。本文主要介绍如何搭建和测试Inter-Pan的功能,并以Z3Light sample(EmberZnet stack v5.10)为例,在WSTK+4151 无线板子上进行演示。

         

        1. Inter-Pan Plugin的源码位于协议栈的C:\SiliconLabs\SimplicityStudio\v4\developer\sdks\gecko_sdk_suite\v1.1\protocol\zigbee_5.10\app\framework\plugin\interpan
        1. 在Z3Light sample中已经勾选该Inter-Pan Plugin。创建并编译该Z3Light sample,将固件以及对应的Bootloader烧录到两块WSTK 4151无线板。
        1. 两块无线板启动之后会自动扫描网络并加入Centralized,如果没有网络可以加入,最后会建立自己Distributed网络。在此实验中,每个板子分别建立自己的Distributed网络,确保它们处于同一个信道即可。如果比较难建立同一信道上的不同网络,也可以分别加入两个同一信道不同PANID的网络。如下所示,两个板子分别建立好自己的网络。
        AppBuilder MFG Code: 0x1002
        node [(>)000B57FFFE07F6E3] chan [20] pwr [3]
        panID [0xF052] nodeID [0xCBD9] xpan [0x(>)0D03351F0A0587C6]
        stack ver. [5.10.0 GA build 36]
        nodeType [0x02]
        Security level [05]
        network state [02] Buffs: 74 / 75
        AppBuilder MFG Code: 0x1002
        node [(>)000B57FFFE07F6E2] chan [20] pwr [3]
        panID [0x2923] nodeID [0x390E] xpan [0x(>)87461289F0783C2F]
        stack ver. [5.10.0 GA build 36]
        nodeType [0x02]
        Security level [05]
        network state [02] Buffs: 75 / 75
        1. 通过CLI命令测试Inter-Pan消息的发送和接收。在Simplicity Studio中,将两个设备对应的Console打开,在一个Console中输入如下命令:

        plugin interpan fragment-test [panId:2] [eui64:8] [clusterId:2] [msgLen:2]

        • Sends a message of specified length of random values to target device over inter-PAN.
          • panId - INT16U - The PAN ID that the target is located on
          • eui64 - IEEE_ADDRESS - The target's EUI64 (big endian)
          • clusterId - INT16U - The cluster ID that the sample message should contain
          • msgLen - INT16U - The length of the randomly-filled message to be sent across inter-PAN

        plugin interpan fragment-test 0xFFFF {000B57FFFE07F6E3}  0x0000 10

        其中第一个参数是目的设备的PANID,可以设置为0xFFFF。

        第二个参数是目的设备的EUI64,可以设置为NULL代表广播消息,否则为单播。

        第三个参数是目的设备的Cluster。

        第四个参数是发送的消息的Playload长度。

         

        1. 发送完上述命令,可在控制台中看到对应的输出信息:

        发送端:

        Z3LightSocV510MG1>Sending inter-PAN message of len 10 to (>)000B57FFFE07F6E3 with random values: T00000000:Inter-PAN TX (10) [A9 30 09 70 82 6D D1 A9 3B 14 ], 0x00
        success (0x00)

        接收端:

        RX inter-PAN message (unicast):
          src pan id: 0x2923
          src long id: (>)000B57FFFE07F6E2
          profile id: 0x0109
          cluster id: 0x0000 (Basic)
        ERR: Inter-PAN profile 0x0109, cluster 0x0000, command 0x09 not permitted

        以上打印信息表明Inter-Pan消息发送成功。用户可根据自己的需求,构建自定义的消息。

         

        1. 函数流程分析:

        发送流程:

        当输入plugin interpan fragment-test,最调用如下函数:

        void emAfInterpanFragmentTestCommand(void)

        |-- emberAfSendInterPan()

        |-- emberAfInterpanSendMessageCallback()

            |-- makeInterPanMessage()

            |-- emAfPluginInterpanSendRawMessage()

                |-- emberSendRawMessage()

        最核心的函数是emberSendRawMessage(),其在raw-message.h中定义。

         

        /** @brief Sends the given message over the air without higher layer
         * network headers.
         *
         * The first two bytes are interpreted as the 802.15.4 frame control field.
         * If the Ack Request bit is set, the packet will be retried as necessary.
         * Completion is reported via ::emberRawTransmitCompleteHandler().
         * Note that the sequence number specified in this packet is not taken into
         * account by the MAC layer. The MAC layer overwrites the sequence number field
         * with the next available sequence number.
         *
         * @param message  The message to transmit.
         *
         * @return ::EMBER_SUCCESS if the message was successfully submitted to
         * the transmit queue, and ::EMBER_ERR_FATAL otherwise.
         */
        EmberStatus emberSendRawMessage(EmberMessageBuffer message);

         

        如果想发送广播消息, 可将emberAfSendInterPan()的参数改为如下格式:

        EmberStatus status = emberAfSendInterPan( OxFFFF,
                             NULL,
                             EMBER_NULL_NODE_ID,
                             0,      // mcast id - unused
                             clusterId,
                             SE_PROFILE_ID, // GBCS only
                             messageLen,
                             testMessage);

         

        接收流程:

        当接收到Inter-Pan消息时,emberMacPassthroughFilterHandler()会被调用,其在raw-message.h中定义。

         

        /** @brief This function is called when the stack has received a raw MAC message that has
         *    matched one of the application's configured MAC filters.
         *
         * @param macFilterMatchStruct This is a pointer to a structure containing information
         *   about the matching message, including the index of the filter that was matched,
         *   and the actual data of the message.
         */
        void emberMacFilterMatchMessageHandler(const EmberMacFilterMatchStruct* macFilterMatchStruct);

         

        emberMacFilterMatchMessageHandler()

            |-- emAfPluginInterpanProcessMessage()

                |-- emberAfPluginInterpanPreMessageReceivedCallback()

         

        以上就是Inter-Pan消息的测试过程以及发送和接收流程的源码分析,更多信息请参考Inter-Pan Plugin的源码。

      • ZigBee 3.0 网络:如何使用install code生成的Link Key加入Z3网络?

        Lesun | 07/198/2017 | 12:35 AM

        问题

         

        ZigBee 3.0 网络:如何使用install code生成的Link Key加入Z3网络?

        答案

         

        在ZigBee 3.0之前,install code只用于Smart Energy网络。现在,所有的ZigBee 3.0设备都需要支持install code,但是否在网络中使用由Trust Center决定。在本文中,你可以按照以下步骤使用命令行(CLI命令)的方式,将Z3 Light使用install code生成Link Key方式加入到Z3 Gateway中。本文适用于EM358x或者EFR32平台。

         

        假定你已经编译了Z3 Light的示例代码,以及Z3 Gateway的示例代码。其中Z3 Light是SOC模式,Z3 Gateway的是以NCP + Host模式。在创建Z3 Gateway的示例代码时,需要设置Link Key table的大小,可在“NCP configuration” plugin中配置,设置其至少为1(默认为0)。

         

        1. 确保Z3 Light没有处在任何网络当中。可以使用“network leave” CLI命令使其退网。
        2. 在Z3 Light的设备中安装install code,install code可以是6/8/12/16字节。在本例子中,使用00112233445566778899AABBCCDDEEFF,将其保存到txt文本中,格式如下:
        Install Code: 00112233445566778899AABBCCDDEEFF
        1. 按照AN714第4、5部分的指导,将install code安装到Z3 Light设备的Token中。我的EFR32MG1的无线板子+WSTK的套件的serial number是#440069872。在Windows系统的CMD窗口中输入以下命令:
        >commander flash --tokengroup znet --tokenfile installCode.txt --serialno 440069872

         

        你将看到窗口输出以下内容:

        Writing 2048 bytes starting at address 0x0fe04000
        Comparing range 0x0FE04000 - 0x0FE047FF (2 KB)
        Erasing range 0x0FE04000 - 0x0FE047FF (1 sector, 2 KB)
        Programming range 0x0FE04240 - 0x0FE0435F (288 Bytes)
        Verifying range 0x0FE04000 - 0x0FE047FF (2 KB)
        DONE

         

        为了验证install code是否安装成功,可以使用以下命令将Token导出进行验证:

        >commander tokendump --tokengroup znet --serialno 440069872

         

        在输出的信息中包含以下重要内容:

        #
        # The token data can be in one of three main forms: byte-array, integer, or string.
        # Byte-arrays are a series of hexadecimal numbers of the required length.
        # Integers are BIG endian hexadecimal numbers.
        # String data is a quoted set of ASCII characters.
        #
        # MFG_EMBER_EUI_64     : E3F607FEFF570B00
        ……
         
        #'MFG_INSTALLATION_CODE (Smart Energy Install Code)' token group
        # Install Code Flags : 0x0006
        Install Code       : 00112233445566778899AABBCCDDEEFF
        # CRC                : 0x8F52

         

        1. 在Z3 Gateway中,使用以下CLI命令建立Centralized网络:
         
        >plugin network-creator start 1
         
        NWK Creator: Form: 0x00
        Z3GatewayHostv510>NWK Creator Security: Start: 0x00
        NWK Creator: Form. Channel: 20. Status: 0x00
        Form Centralized network complete: 0x00
        NWK Creator: Stop. Status: 0x00. State: 0x00
        EMBER_NETWORK_UP 0x0000

         

        1. 使用以下命令将install code生成Link Key,并存储在Z3 Gateway中。Z3 Gateway作为Centralized的Trust Center。

        option install-code [KeyTableIndex:1] [ieeeAddress:8] [installCode:-1]

         

        option install-code 0 {00 0B 57 FF FE 07 F6 E3} {00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 52 8F}

        其中option install-code后面第一参数是Link Key table的指引。

        第二个参数是入网节点的EUI64地址。

        第三个参数是install code。你可以通过使用CLI “info”来查看入网节点Z3 Light的EUI64地址(node [(>)000B57FFFE07F6E3])。

        第四个参数是install code加上其对应的CRC校验码。你可以通过第3步的tokendump命令得到install code的CRC校验码。注意:这里是以大端格式排列。

         

        1. 使用Network Analyzer工具对入网过程进行抓包(可选)。在Simplicity Studio视图中转到Network Analyzer,并右键单击J-Link adapter,选择capture 进行抓包。如果你处于一个噪音环境下,可以选择在指定的PAN ID上进行抓包。

         

        1. 使用如下CLI命令,在Z3Gateway(Trust Center)上设置临时的Link Key(与install code生成的Link Key相同):

        plugin network-creator-security set-joining-Link-Key {eui64} {LinkKey}

        plugin network-creator-security set-joining-Link-Key {00 0B 57 FF FE 07 F6 E3} {9A A4 67 C7 8F 45 43 F1 BC A6 CA 03 C3 D7 3B 31}

         

        1. 在Z3Gateway中使用如下CLI命令设置允许加网:
        plugin network-creator-security open-network

         

        1. 最后在Z3Light中使用Network Steering plugin命令加入网络。
        plugin network-steering start 0

        以上步骤就是通过install code生成的临时Link Key顺利加入到Z3网络中。如果你在第6步使用Network Analyzer进行抓包,可以看到整个入网过程。Z3 Light初始化网络使用临时的Link Key。Trust Center使用临时的Link Key将Network Key传输给Z3 Light,(请参考"Transport Key (NWK)"帧)。最后Z3 Light请求一个新的Link Key,Trust Center传输新的Link Key给Z3 Light,(请参考"Transport Key (Link)"帧)。

         

         

      • Burning hex file into Si4010 step-by-step

        tanagy | 07/195/2017 | 12:30 PM

        The basic operation flow of the NVM Programming Utility (Si4010_NVM_Burner.exe)  is as follows:

         

        1. Select the Main tab on the GUI.

        2. Select the USB adapter.

        3. Hit the Connect button to connect to the part.

        Either:

        4. Add your application code intel hex file to the User Boot section.

        5. Keep the address value as it is — first line has 0xE180 address filled automatically.

        6. Check "Run" checkbox only.

        7. Specify the new output NVM Burn File. Choose Overwrite if desired. GUI must check the file existence before running the composer since the composer always overwrites the existing output file.

        8. Hit Compose and observe the results. The gui_composer.exe is invoked behind the scenes and the NBF file gets generated.

        Or:

        4.Load existing, previously generated NVM Burn File. The Compose Map gets filled in from the file. Then go to Step 9.

        In both cases:

        9.Make sure the 6.5 V programming voltage is connected to GPIO[0] of the part. For example, slide the PROG switch on the MSC-BA4 board to the ON position.

        10. Hit Burn to burn the device. The burning process loads the NBF file in the device and uses the information in the NBF file to do the actual burning. Observe the results. The burning process stops at first error encountered.

      • RAIL_SetStateTiming and scheduled TX

        tanagy | 07/195/2017 | 12:15 PM

        Here is an example about relation between RAIL_SetStateTiming setting and scheduled TX:

        If you scheduled a transmit to occur on absolute time 1000µs and have an idleToTx time of 100µs and have a ramp time of 30µs:

                   1. Scheduled transmit should start at absolute time 1000µs

                   2. IdleToTx is then in effect. The PA ramp will start at absolute time 1100µs.

                   3. PA ramps. Modulation starts when ramp ends (at 1130µs in this case).