zoukankan      html  css  js  c++  java
  • 在mesh client示例中加入spi_slave接口(without IDE)

    在mesh client示例中加入spi_slave接口(without IDE)

    主要是理解cmake构建的过程,然后修改工程中的inlcude路径及c源文件。

    1. 解压mesh_sdk

    unzip nrf5_SDK_for_Mesh_v1.0.0_src.zip -d mesh_sdk
    
    cd mesh_sdk
    

    解压后的mesh_sdk文件包含如下内容

    total 68K
    drwxr-xr-x  6 gexin gexin 4.0K Feb  6 11:42 bin
    drwxr-xr-x  7 gexin gexin 4.0K Feb  6 11:42 CMake
    -rw-r--r--  1 gexin gexin 3.3K Feb  6 11:42 CMakeLists.txt
    -rw-r--r--  1 gexin gexin 2.0K Feb  6 11:42 COPYING.md
    drwxr-xr-x  6 gexin gexin 4.0K Feb  6 11:42 doc
    drwxr-xr-x  8 gexin gexin 4.0K Feb  6 11:42 examples
    drwxr-xr-x  6 gexin gexin 4.0K Feb  6 11:43 external
    -rw-r--r--  1 gexin gexin  183 Feb  6 11:43 gtags.conf
    drwxr-xr-x 12 gexin gexin 4.0K Feb  6 11:43 mesh
    drwxr-xr-x  6 gexin gexin 4.0K Feb  6 11:43 models
    -rw-r--r--  1 gexin gexin 3.2K Feb  6 11:43 README.md
    -rw-r--r--  1 gexin gexin  14K Feb  6 11:43 RELEASE_NOTES.md
    drwxr-xr-x  4 gexin gexin 4.0K Feb  6 11:43 scripts
    drwxr-xr-x  7 gexin gexin 4.0K Feb  6 11:43 tools
    

    2. 向mesh_sdk中添加nrf_sdk的components目录

    {mesh_sdk_path}/external/nRF5_SDK_14.2.0_17b948a目录已存在components文件夹,但是相关的外设文件不全,只包含了mesh示例工程所需要的文件。

    我们将官方nRF5_SDK_14.2.0_17b948a中的components文件夹拷贝至{mesh_sdk_path}/external/nRF5_SDK_14.2.0_17b948a处,这样就可以使用sdk中的各种外设功能。

    cp -rn {nRF5_SDK_PATH}/components  {mesh_sdk_path}/external/nRF5_SDK_14.2.0_17b948a
    

    注意cp命令复制时,使用-n选项,这样可以跳过相同文件,mesh_sdk中有的文件定义与nrf_sdk中定义有冲突。

    3. 以client为模板建立工程

    打开mesh_sdk/examples/light_switch文件夹,之下有clientserver等目录,将client复制为proj_client

    $ cp -r  client  proj_client
    

    并在light_switch下的CMakeLists.txt文件中加入add_subdirectory("proj_client")

    在proj_client下的CMakeLists.txt文件第一行target 名字修改为set(target "light_switch_proj_client_${PLATFORM}_${SOFTDEVICE}")防止与client工程重名。

    此时,proj_client已经在工程之中。

    4. cmake产生makefile

    返回到mesh-sdk的顶层目录下,执行cmake . 命令。

    然后返回到proj_client目录,会发现该目录下已经产生了Makefile文件。

    执行make会编译该project并在当前文件夹下产生目标文件light_switch_proj_client_nrf52832_xxAA_s132_5.0.0.hex

    5. 给proj_client添加include路径及c文件。

    在proj_client的源码位于src目录中,代码修改可以直接修改其中的main.c文件。若要在proj_client的基础上添加spi_slave的相关功能,需要添加相应的头文件包含路径及c文件。

    include路径和项目c文件是由proj_client目录下的CMakeLists.txt文件控制的

    • add_executable()命令控制生成目标文件所需编译的c源文件
    • target_include_directories()命令控制该工程的include路径。

    首先添加include路径,将target_include_directories()修改如下:

    target_include_directories(${target} PUBLIC
         "${CMAKE_CURRENT_SOURCE_DIR}/include"
         "${CMAKE_CURRENT_SOURCE_DIR}/../include"
         "${CMAKE_SOURCE_DIR}/examples"
         "${CMAKE_SOURCE_DIR}/examples/common/include"
         "${SDK_ROOT}/components/drivers_nrf/delay"
         "${SDK_ROOT}/components/drivers_nrf"
         "${SDK_ROOT}/components/drivers_nrf/spi_slave"
         "${SDK_ROOT}/components/drivers_nrf/common"
         "${SDK_ROOT}/components/libraries/experimental_log/"
         "${SDK_ROOT}/components/libraries/experimental_section_vars/"
         "${SDK_ROOT}/components/libraries/experimental_log/src"
         "${SDK_ROOT}/config"
         ${SIMPLE_ON_OFF_CLIENT_INCLUDE_DIRS}
         ${CONFIG_CLIENT_INCLUDE_DIRS}
         ${HEALTH_CLIENT_INCLUDE_DIRS}
         ${PROV_INCLUDE_DIRS}
         ${ACCESS_INCLUDE_DIRS}
         ${${BOARD}_INCLUDE_DIRS}
         ${${SOFTDEVICE}_INCLUDE_DIRS})
    

    然后添加c源文件,这里只添加spis相关的文件,其他源文件可以根据同样的方式添加。将add_executable()修改如下:

     add_executable(${target}
         "${CMAKE_CURRENT_SOURCE_DIR}/src/main.c"
         "${CMAKE_CURRENT_SOURCE_DIR}/src/provisioner.c"
         "${MBTLE_SOURCE_DIR}/examples/nrf_mesh_sdk.c"
         "${MBTLE_SOURCE_DIR}/examples/common/src/rtt_input.c"
         "${CMAKE_SOURCE_DIR}/examples/common/src/simple_hal.c"
         "${SDK_ROOT}/components/drivers_nrf/spi_slave/nrf_drv_spis.c"
         "${SDK_ROOT}/components/drivers_nrf/common/nrf_drv_common.c"
         ${WEAK_SOURCE_FILES}
         ${SIMPLE_ON_OFF_CLIENT_SOURCE_FILES}
         ${CONFIG_CLIENT_SOURCE_FILES}
         ${HEALTH_CLIENT_SOURCE_FILES}
         ${ACCESS_SOURCE_FILES}
         ${PROV_PROVISIONER_SOURCE_FILES}
         ${PROV_COMMON_SOURCE_FILES}
         ${${PLATFORM}_SOURCE_FILES})
    

    6. 添加spis示例

    mesh_sdk/external/nRF5_SDK_14.2.0_17b948a/components/libraries/util/app_error.h中的APP_ERROR_HANDLER()函数替换为ERROR_CHECK(),因为APP_ERROR_HANDLER找不到定义。并在该文件包含头文件#include "nrf_mesh_sdk.h"

    原因不明。。。

    在nrf_sdk中找到spis的示例工程: {nrf_sdk_path}/examples/examples/peripheral/spis

    在nrf_sdk找到spis的示例,将其中的config文件夹复制到components目录下,其中的头文件定义了一些引脚定义、spis中断优先级等信息。

    添加spis所需的头文件

    #include "sdk_config.h"
    #include "nrf_spis.h"
    #include "nrf_gpio.h"
    #include "nrf_drv_spis.h"
    

    以上四个头文件,除了sdk_config.h其他三个都可以在components文件夹中找到,需要将文件所在目录添加到工程的user_include路径中。

    修改main.c文件,在main.c文件中添加spis相关的定义,如下所示。

    /*****************************************************************************
     * SPIS Definitions
     *****************************************************************************/
    #define SPIS_INSTANCE 1 /**< SPIS instance index. */
    static const nrf_drv_spis_t spis = NRF_DRV_SPIS_INSTANCE(SPIS_INSTANCE);/**< SPIS instance. */
    
    #define TEST_STRING "Nordic"
    static uint8_t       m_tx_buf[] = TEST_STRING;           /**< TX buffer. */
    static uint8_t       m_rx_buf[sizeof(TEST_STRING) + 1];    /**< RX buffer. */
    static const uint8_t m_length = sizeof(m_tx_buf);        /**< Transfer length. */
    
    static volatile bool spis_xfer_done; /**< Flag used to indicate that SPIS instance completed the transfer. */
    
    /**
     * @brief SPIS user event handler.
     *
     * @param event
     */
    void spis_event_handler(nrf_drv_spis_event_t event)
    {
        if (event.evt_type == NRF_DRV_SPIS_XFER_DONE)
        {
            spis_xfer_done = true;
            //NRF_LOG_INFO(" Transfer completed. Received: %s",(uint32_t)m_rx_buf);
        }
    }
    
    

    在main()主函数中,添加上spis的函数,修改后的主函数如下:

    
    int main(void)
    {
        __LOG_INIT(LOG_SRC_APP | LOG_SRC_ACCESS, LOG_LEVEL_INFO, LOG_CALLBACK_DEFAULT);
        __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "----- BLE Mesh Light Switch Client Demo -----
    ");
    
        hal_leds_init();
        ERROR_CHECK(hal_buttons_init(button_event_handler));
    
        /* Set the first LED */
        hal_led_pin_set(BSP_LED_0, true);
        mesh_core_setup();
        access_setup();
        rtt_input_enable(rtt_input_handler, RTT_INPUT_POLL_PERIOD_MS);
    
        /* configure spi_slave */
    
        nrf_drv_spis_config_t spis_config = NRF_DRV_SPIS_DEFAULT_CONFIG;
        spis_config.csn_pin               = 29;
        spis_config.miso_pin              = 28;
        spis_config.mosi_pin              = 4;
        spis_config.sck_pin               = 3;
    
        ERROR_CHECK(nrf_drv_spis_init(&spis, &spis_config, spis_event_handler));
    
        while (true)
        {
          //  (void)sd_app_evt_wait();
    
            /********************************
             * add for spis_example
             ********************************/
            memset(m_rx_buf, 0, m_length);
            spis_xfer_done = false;
    
            ERROR_CHECK(nrf_drv_spis_buffers_set(&spis, m_tx_buf, m_length, m_rx_buf, m_length));
    
            while (!spis_xfer_done)
            {
                __WFE();
            }
    
            bsp_board_led_invert(17);
    
            if(hal_led_pin_get(17))
              hal_led_pin_set(BSP_LED_0, false);
            else hal_led_pin_set(BSP_LED_0, true);
    
        }
    }
    
    
  • 相关阅读:
    idea jsp无法加载<c:foreach>循环遍历数据
    java POI读取Excel文件
    Javaweb中请求的资源[/Servlet]不可用解决方案
    大作业第一阶段冲刺(一)
    hive中sql左外连接查询列值为null
    关于ECharts在jsp页面无法显示的问题
    echarts通过ajax实现数据加载
    读书笔记
    解决:[Err] 1064
    idea启动Tomcat报错Artifact testdemo1:war exploded: Error during artifact deployment. See server log for details.问题解决
  • 原文地址:https://www.cnblogs.com/gexin/p/8422872.html
Copyright © 2011-2022 走看看