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

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

1. 解压mesh_sdk

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

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

  1. total 68K
  2. drwxr-xr-x 6 gexin gexin 4.0K Feb 6 11:42 bin
  3. drwxr-xr-x 7 gexin gexin 4.0K Feb 6 11:42 CMake
  4. -rw-r--r-- 1 gexin gexin 3.3K Feb 6 11:42 CMakeLists.txt
  5. -rw-r--r-- 1 gexin gexin 2.0K Feb 6 11:42 COPYING.md
  6. drwxr-xr-x 6 gexin gexin 4.0K Feb 6 11:42 doc
  7. drwxr-xr-x 8 gexin gexin 4.0K Feb 6 11:42 examples
  8. drwxr-xr-x 6 gexin gexin 4.0K Feb 6 11:43 external
  9. -rw-r--r-- 1 gexin gexin 183 Feb 6 11:43 gtags.conf
  10. drwxr-xr-x 12 gexin gexin 4.0K Feb 6 11:43 mesh
  11. drwxr-xr-x 6 gexin gexin 4.0K Feb 6 11:43 models
  12. -rw-r--r-- 1 gexin gexin 3.2K Feb 6 11:43 README.md
  13. -rw-r--r-- 1 gexin gexin 14K Feb 6 11:43 RELEASE_NOTES.md
  14. drwxr-xr-x 4 gexin gexin 4.0K Feb 6 11:43 scripts
  15. 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中的各种外设功能。

  1. 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

  1. $ 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()修改如下:

  1. target_include_directories(${target} PUBLIC
  2. "${CMAKE_CURRENT_SOURCE_DIR}/include"
  3. "${CMAKE_CURRENT_SOURCE_DIR}/../include"
  4. "${CMAKE_SOURCE_DIR}/examples"
  5. "${CMAKE_SOURCE_DIR}/examples/common/include"
  6. "${SDK_ROOT}/components/drivers_nrf/delay"
  7. "${SDK_ROOT}/components/drivers_nrf"
  8. "${SDK_ROOT}/components/drivers_nrf/spi_slave"
  9. "${SDK_ROOT}/components/drivers_nrf/common"
  10. "${SDK_ROOT}/components/libraries/experimental_log/"
  11. "${SDK_ROOT}/components/libraries/experimental_section_vars/"
  12. "${SDK_ROOT}/components/libraries/experimental_log/src"
  13. "${SDK_ROOT}/config"
  14. ${SIMPLE_ON_OFF_CLIENT_INCLUDE_DIRS}
  15. ${CONFIG_CLIENT_INCLUDE_DIRS}
  16. ${HEALTH_CLIENT_INCLUDE_DIRS}
  17. ${PROV_INCLUDE_DIRS}
  18. ${ACCESS_INCLUDE_DIRS}
  19. ${${BOARD}_INCLUDE_DIRS}
  20. ${${SOFTDEVICE}_INCLUDE_DIRS})

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

  1. add_executable(${target}
  2. "${CMAKE_CURRENT_SOURCE_DIR}/src/main.c"
  3. "${CMAKE_CURRENT_SOURCE_DIR}/src/provisioner.c"
  4. "${MBTLE_SOURCE_DIR}/examples/nrf_mesh_sdk.c"
  5. "${MBTLE_SOURCE_DIR}/examples/common/src/rtt_input.c"
  6. "${CMAKE_SOURCE_DIR}/examples/common/src/simple_hal.c"
  7. "${SDK_ROOT}/components/drivers_nrf/spi_slave/nrf_drv_spis.c"
  8. "${SDK_ROOT}/components/drivers_nrf/common/nrf_drv_common.c"
  9. ${WEAK_SOURCE_FILES}
  10. ${SIMPLE_ON_OFF_CLIENT_SOURCE_FILES}
  11. ${CONFIG_CLIENT_SOURCE_FILES}
  12. ${HEALTH_CLIENT_SOURCE_FILES}
  13. ${ACCESS_SOURCE_FILES}
  14. ${PROV_PROVISIONER_SOURCE_FILES}
  15. ${PROV_COMMON_SOURCE_FILES}
  16. ${${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所需的头文件

  1. #include "sdk_config.h"
  2. #include "nrf_spis.h"
  3. #include "nrf_gpio.h"
  4. #include "nrf_drv_spis.h"

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

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

  1. /*****************************************************************************
  2. * SPIS Definitions
  3. *****************************************************************************/
  4. #define SPIS_INSTANCE 1 /**< SPIS instance index. */
  5. static const nrf_drv_spis_t spis = NRF_DRV_SPIS_INSTANCE(SPIS_INSTANCE);/**< SPIS instance. */
  6. #define TEST_STRING "Nordic"
  7. static uint8_t m_tx_buf[] = TEST_STRING; /**< TX buffer. */
  8. static uint8_t m_rx_buf[sizeof(TEST_STRING) + 1]; /**< RX buffer. */
  9. static const uint8_t m_length = sizeof(m_tx_buf); /**< Transfer length. */
  10. static volatile bool spis_xfer_done; /**< Flag used to indicate that SPIS instance completed the transfer. */
  11. /**
  12. * @brief SPIS user event handler.
  13. *
  14. * @param event
  15. */
  16. void spis_event_handler(nrf_drv_spis_event_t event)
  17. {
  18. if (event.evt_type == NRF_DRV_SPIS_XFER_DONE)
  19. {
  20. spis_xfer_done = true;
  21. //NRF_LOG_INFO(" Transfer completed. Received: %s",(uint32_t)m_rx_buf);
  22. }
  23. }

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


  1. int main(void)
  2. {
  3. __LOG_INIT(LOG_SRC_APP | LOG_SRC_ACCESS, LOG_LEVEL_INFO, LOG_CALLBACK_DEFAULT);
  4. __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "----- BLE Mesh Light Switch Client Demo -----\n");
  5. hal_leds_init();
  6. ERROR_CHECK(hal_buttons_init(button_event_handler));
  7. /* Set the first LED */
  8. hal_led_pin_set(BSP_LED_0, true);
  9. mesh_core_setup();
  10. access_setup();
  11. rtt_input_enable(rtt_input_handler, RTT_INPUT_POLL_PERIOD_MS);
  12. /* configure spi_slave */
  13. nrf_drv_spis_config_t spis_config = NRF_DRV_SPIS_DEFAULT_CONFIG;
  14. spis_config.csn_pin = 29;
  15. spis_config.miso_pin = 28;
  16. spis_config.mosi_pin = 4;
  17. spis_config.sck_pin = 3;
  18. ERROR_CHECK(nrf_drv_spis_init(&spis, &spis_config, spis_event_handler));
  19. while (true)
  20. {
  21. // (void)sd_app_evt_wait();
  22. /********************************
  23. * add for spis_example
  24. ********************************/
  25. memset(m_rx_buf, 0, m_length);
  26. spis_xfer_done = false;
  27. ERROR_CHECK(nrf_drv_spis_buffers_set(&spis, m_tx_buf, m_length, m_rx_buf, m_length));
  28. while (!spis_xfer_done)
  29. {
  30. __WFE();
  31. }
  32. bsp_board_led_invert(17);
  33. if(hal_led_pin_get(17))
  34. hal_led_pin_set(BSP_LED_0, false);
  35. else hal_led_pin_set(BSP_LED_0, true);
  36. }
  37. }

在mesh client示例中加入spi_slave接口(without IDE)的更多相关文章

  1. 各种开发语言示例调用HTTP接口(示例中默认HTTP接口编码为gb2312)

    asp示例: function getHTTPPage(strurl,data)   on error resume next   set http = Server.CreateObject(&qu ...

  2. 微信JS-SDK分享接口示例中jsapi_ticket.php和access_token.php说明

    关于如何使用微信JS-SDK,可以查看官方介绍说明:查看链接 在使用分享接口的过程中,查看了示例代码,其中包含两个文件jsapi_ticket.php和access_token.php,记录一下这两个 ...

  3. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  4. C#中对IDisposable接口的理解

    http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html C#中对IDisposable接口的理解 本人最近接触一个项目,在这个项目里面看到很多类实现了 ...

  5. 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口

    HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...

  6. golang 结构体中的匿名接口

    golang 结构体中的匿名接口 代码示例 golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书. 匿名字段和内嵌结构体 但,golang同时也可以给结构体定义一个匿名i ...

  7. 【转】C#中对IDisposable接口的理解

    IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资 ...

  8. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  9. Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针

    Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类. Microsoft.VisualC.StlClr Unmanaged Code 和 Managed Co ...

随机推荐

  1. iOS | 解决中文乱码

    在iOS开发中,多多少少的朋友在开发的过程中,测试数据的时候可能会碰到后台打印的时候不能正确的打印出正常的汉字,打印出一些影响判断的字符,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接 ...

  2. OOP导论系列---抽象过程

    OOP导论系列---抽象过程 所有编程语言都提供抽象机制.可以认为,人们所能解决的问题的复杂性直接取决于抽象的类型和质量.所谓“类型”是指“所抽象的是什么?”你可以抽取待求解问题的任何概念化构件,如: ...

  3. js中数组的api整理

    首先列出所有的方法: join(), sort(), slice(), splice(), concat(), reverse(), push()+pop(), shift()+unshift(), ...

  4. 19-3-4 Python进制转换;bool str int三者之间的转换;字符串的索引,切片;for循环的使用

    进制转换: 二进制转十进制:  0010 1111 = 1*2**0+1*2**1+1*2**2+1*2**3+1*2**5 十进制转换二进制: 用十进制数除2逆序取余 --->101010 布 ...

  5. angularjs脏机制

    Angular 每一个绑定到UI的数据,就会有一个 $watch 对象. watch = { name:'', //当前的watch 对象 观测的数据名 getNewValue:function($s ...

  6. Yii2 yiisoft/mongodb 手动安装

    手动将yiisoft/mongodb下载到vendor/yiisoft目录(注意约束条件). 在vendor/yiisoft/extensions.php 中添加 'yiisoft/yii2-mong ...

  7. PHP获取当月天数,获取当月的每天的开始和结束的时间戳,获取当月每号

    由于经常要写导单和数据分析功能,所以要获取什么时间的数据,想什么当天,周,年,月之类的时间格式都很好获取.我今天在这里为大家提供的是当月每天的开始和结束的时间格式. 希望能帮到大家!!! # 获取当月 ...

  8. 2.1 摄像头V4L2驱动框架分析

    学习目标:学习V4L2(V4L2:vidio for linux version 2)摄像头驱动框架,分析vivi.c(虚拟视频硬件相关)驱动源码程序,总结V4L2硬件相关的驱动的步骤:  一.V4L ...

  9. 如何将24位RGB颜色转换16位RGB颜色

    有许多朋友第一次使用16位彩色显示屏会遇到如何将24位RGB颜色转换为对应的16位RGB颜色的问题, 通过查阅相关资料,就写一下其中的转换原理吧,希望对大家会有所帮助. 我们知道24位RGB是分别由8 ...

  10. Go语言中的流程控制

    1 概述 Go语言提供了条件分支 if,状态分支 switch,循环 for,跳转 goto,延迟执行 defer,这些流程控制语句.分别作说明如下: 2 条件分支 if 依据条件是否满足确定执行哪个 ...