在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文件夹,之下有client、server等目录,将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 -----\n");
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);
}
}
在mesh client示例中加入spi_slave接口(without IDE)的更多相关文章
- 各种开发语言示例调用HTTP接口(示例中默认HTTP接口编码为gb2312)
asp示例: function getHTTPPage(strurl,data) on error resume next set http = Server.CreateObject(&qu ...
- 微信JS-SDK分享接口示例中jsapi_ticket.php和access_token.php说明
关于如何使用微信JS-SDK,可以查看官方介绍说明:查看链接 在使用分享接口的过程中,查看了示例代码,其中包含两个文件jsapi_ticket.php和access_token.php,记录一下这两个 ...
- WebApi接口 - 如何在应用中调用webapi接口
很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...
- C#中对IDisposable接口的理解
http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html C#中对IDisposable接口的理解 本人最近接触一个项目,在这个项目里面看到很多类实现了 ...
- 《HTML5网页开发实例详解》连载(四)HTML5中的FileSystem接口
HTML 5除了提供用于获取文件信息的File对象外,还添加了FileSystem相关的应用接口.FileSystem对于不同的处理功能做了细致的分类,如用于文件读取和处理的FileReader和Fi ...
- golang 结构体中的匿名接口
golang 结构体中的匿名接口 代码示例 golang 中,可以给结构体增加匿名field,可参考 unknwon 大神的书. 匿名字段和内嵌结构体 但,golang同时也可以给结构体定义一个匿名i ...
- 【转】C#中对IDisposable接口的理解
IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资 ...
- 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 ...
- Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类。 混合编程中使用COM接口指针
Microsoft.VisualC 命名空间包含支持用 c + + 语言的代码生成和编译的类. Microsoft.VisualC.StlClr Unmanaged Code 和 Managed Co ...
随机推荐
- Django学习笔记3-静态文件调用
1.settings.py 静态文件相关示例代码及说明: # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.c ...
- 2. HTML常用标签
相信大家常常会打开浏览器搜索一些内容或者浏览一些网站,在浏览器的页面上会呈现很多内容,但是具体的形式无非就是图片.文字以及链接(可以点击进入另一个页面的特殊文字),其中文字承载着巨大的作用,传递着各种 ...
- Nginx初体验(一):nginx介绍
今天我们来介绍一下Nginx. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器 特点: 反向代理,负载均衡,动静分离 首先我们来介绍一下正向代理服务器 ...
- BZOJ2330_糖果_KEY
题目传送门 看题目可知这是一道差分约束的题目. 根据每种关系建边如下: 对于每种情况建边,然后跑一边SPFA.(最长路) 因为可能会有自环或环的情况,都不可能存在. 跑SPFA时记录入队次数,超过N弹 ...
- Lvm linux磁盘分区管理(多个分区合并成一个)
备份# rsync -avP -e ssh /data qqmap@10.173.139.100:/data1/qqmap/backup/10.234.22.143卸载# umount /data / ...
- 北京Uber优步司机奖励政策(1月28日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 北京Uber优步司机奖励政策(1月9日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 13 内建属性 _getattribute_ 内建函数
1.内建属性 2.__getattribute__ 属性访问时拦截器 class Itcast(object): def __init__(self,subject1): self.subject1 ...
- LeetCode:46. Permutations(Medium)
1. 原题链接 https://leetcode.com/problems/permutations/description/ 2. 题目要求 给定一个整型数组nums,数组中的数字互不相同,返回该数 ...
- Android AOSP 编译sdk
首先你要有AOSP 工程. 然后执行下面的命令编译sdk. //运行下面的命令得到编译环境 source build/envsetup.sh lunch sdk make sdk 最后文件输出在哪个位 ...