通过SPI传输BMI160数据到nrf528xx
目录
- 主控和外设之间的联系
- 关键
- 示例
- 可能的bug
主控和外设之间的联系
在完成代码之前,我们手里会有两份代码,一份是nrf528xx的SDK,一份是BMI160传感器的SDK,怎么利用SDK完成我们的需求呢?首先我们要搞明白,主控和外设之间的联系是什么?传感器给的SDK具体是什么内容。
我们这次的需求是通过SPI进行传输,SPI通过6条线将传感器和主控芯片联系在一起,如图:
传感器是一个商用的物品,已经没有第二次烧录的可能性,他里面已经烧录了代码,只要连接引脚,通过引脚给他指令就可以工作,可以理解成一个蓄势待发的玩具青蛙,等待一个指令就可以不停的跳(工作)。引脚也可以理解成一个硬件级别的API接口哈哈
而传感器的SDK就相当于一个指令集,比如一个蓝牙耳机,你看说明书他会告诉你怎么按(API接口)可以播放音乐、暂停音乐。类似的,一般的传感器会提供SPI或者是I2C的通信,SDK会告诉你怎么通过函数API让他开始传输数据,哈哈这里就比较复杂一点,没法对6条线实物操作,好像你只能把他掐断了,但他也工作不了,需要自己写代码去驱动。什么是驱动,就是拿着他的SDK放在自己代码中。
那有人问了,函数API怎么就能通过六条线进行指令啦?这涉及到通信啦,大家感兴趣的话可以了解一下SPI 通信、计算机网络,但是对于我们代码来说其实属于最高级别的应用层,直接黑盒子拿API来使用。如果问代码为啥可以变成 0/1进行通信,那就得去学学计科计组和编译啦。
在与BMI160进行交互时,通常我们会通过其寄存器来配置设备、读取数据以及执行其他操作。这些寄存器包括配置寄存器、数据寄存器、状态寄存器等。大家看到SDK里面有很多宏定义,大部分都是寄存器的一些地址,这也是需要硬件商家提供的,让API的每一个对应函数功能都去找对应的寄存器存或者取数据。不用理会其中的为啥这个宏定义就i是1或者2,这就是硬件商家规定好的,就像你给一个物体打个标签区分他们一样,你只要看他的变量名字就好了。
好,我们了解了传感器SDK一般会给我们的东西,仔细琢磨可以知道他是怎么运作,想直接用的话你可以直接把他当成黑盒子,直接调用他给出的API就好,涉及的库直接记得依赖进来就好。
关键
我们刚才说通过SPI线进行驱动传感器才会工作,那SPI的传输数据代码到底是属于谁的呢?是主控的!因为我们烧写的代码是在主控上进行的,写的代码就要调用主控上的SPI端口。 好像传感器的SDK也有写到SPI,但他实际上只是变量写了SPI相关字眼,实际上函数参数导入主控上SPI对象,告诉你应该从哪个寄存器存或者取,然后根本还是要用主控上SPI去读取。
主控上一般都会给出I2C和SPI的示例代码,只要进行调用对应的函数就好了。
// nrf_drv_spi_transfer 是nrf528xx的API, spi_read_transfer是自己命名的函数
int8_t spi_read_transfer(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{ret_code_t ret ;uint8_t read_temp[ length + 1 ] ;reg_addr = reg_addr | 0x80; ret = nrf_drv_spi_transfer(&spi, ®_addr, 1, read_temp, length + 1 ) ; nrf_delay_ms(5); for( int i = 1 ; i < length + 1 ; i ++ )reg_data[i-1] = read_temp[i] ;return (int8_t)ret;
}int8_t spi_write_transfer(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{ret_code_t ret;uint8_t write_temp[ length + 1 ] ;reg_addr = reg_addr & 0x7F;write_temp[0] = reg_addr ;for( int i = 1 ; i < length + 1 ; i ++ )write_temp[i] = reg_data[i-1] ;ret = nrf_drv_spi_transfer(&spi, write_temp, length + 1, &no_use, 1 ) ;nrf_delay_ms(5) ;return (int8_t)ret;
}
我们来看看bmi160的SDK
dev->read底层用的是nrf52的SPI接口,具体代码在bmi160的示例中:
sensor.read = spi_read_transfer;
sensor.write = spi_write_transfer;
他将sensor这个类的read句柄接入了spi_read_transfer,而这个函数本质是nrf_drv_spi_transfer()
示例
整体流程是:
1、实例化bmi160(BMI160 SDK)
2、实例化SPI(nrf52 SDK)
3、将bmi160 设置的SPI句柄实例化
3、读取传感器数据(BMI160 SDK)
github 示例
可能的bug
- 如果数据一直是0的话,看是否激活sensor进行工作,比如bmi160就需要以下这句代码让他不断读取数据
// set configurationsensor_calibration.acc_cg.power = BMI160_ACC_NORMAL_MODE; // power modesensor_calibration.gyro_cfg.power = BMI160_GYRO_NORMAL_MODE; // power mode
- 如果和蓝牙一起使用注意 spi和蓝牙的优先级
spi_config0.irq_priority = 2;
相关文章:

通过SPI传输BMI160数据到nrf528xx
目录 主控和外设之间的联系关键示例可能的bug 主控和外设之间的联系 在完成代码之前,我们手里会有两份代码,一份是nrf528xx的SDK,一份是BMI160传感器的SDK,怎么利用SDK完成我们的需求呢?首先我们要搞明白,…...

MAYA教程之建模基础命令介绍
基础命令 视图相关操作 旋转视图 : ALT 鼠标左键平移视图 : ALT 鼠标中键缩放视图 : 滚动鼠标滚轮 或者 ALT 鼠标右键切换视图 : 空格键回到模型 : F 视图状态 选择状态 : Q移动状态 : W旋转状态 : E缩放状态 : R 视图显示 正常显示 : 1正常圆滑同时显示 : 2圆滑显示 …...

文档外发控制与安全:实现高效协作与数据安全的关键
随着企业数据量的不断增加,文档外发成为了一个不可避免的需求。然而,很多企业在文档外发过程中存在着很多问题,如数据泄露、信息误用等。因此,如何保证文档外发的安全性和高效性成为了企业亟待解决的问题。飞驰云联Ftrans的文件收…...

在线课堂知识系统源码系统+前端+后端完整搭建教程
大家好啊,今天罗峰来给大家分享一款在线课堂知识系统源码系统。这款系统的功能十分强大。可以使用手机随时随地地学习,有专业的导师答疑解惑。支持视频,音频,图文章节。以下是部分核心代码图: 系统特色功能一览&#x…...

CSS之布局系列--顶部导航栏二级菜单居中展示
原文网址:CSS之布局系列--顶部导航栏二级菜单居中展示_IT利刃出鞘的博客-CSDN博客 简介 本文介绍CSS将顶部导航栏居中展示并支持二级菜单下拉展示的方法。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…...

算法通关村第九关黄金挑战——透彻理解二叉树中序遍历的应用
大家好,我是怒码少年小码。 上一篇讲了二分查找,今天我们看看它的难度扩展。 有序数组转为二叉搜索树 LeetCode 108:给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高…...

【算法设计与分析zxd】第7章 贪心法
贪心算法的设计技术 • 每一步的判断都是一个当前最优的抉择,这个抉择计算设计的好坏,决定了算法的成败。 • 多步判断过程,最终的判断序列对应于问题的最优解 • 适用于 能够 由 局部最优达到全局最优的优化问题 【比如 求最短哈密顿回路的…...

CCF CSP认证 历年题目自练Day35
题目一 试题编号: 202305-1 试题名称: 重复局面 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3次以上,可由任意一方提出和棋。 问题…...
应用crash时发送广播及信息
一、环境 高通865 Android 10 二、情景 应用崩溃时,将奔溃信息以广播的形式发送 二、代码位置 frameworks/base/core/java/com/android/internal/os/RuntimeInit.java private static class KillApplicationHandler implements Thread.UncaughtExceptionHandle…...
【亲测可用】图像目标识别入门-利用笔记本电脑摄像头识别人脸标记出来采用深度学习模型实现
更高的精度和准确性,可以考虑使用基于深度学习的人脸检测和识别方法,例如基于人脸特征的人脸检测器和具有高识别率的人脸识别模型。下面是使用基于深度学习的人脸检测和识别方法的代码示例: 首先,安装必要的库和模型:…...

数字孪生技术:煤矿运输的未来革命
煤矿是我国能源工业的重要支柱,然而,煤矿运输过程中一直存在着诸多问题,如安全隐患、能源浪费、效率低下等,这不仅对煤矿行业的可持续发展构成威胁,也对环境造成负面影响。因此,数字孪生技术应运而生&#…...

一些bug总结
今天被几个小问题和bug折磨了一天,来总结一下… 权限问题 用vscode连接服务器,如果是在root用户连接的情况下新建的文件/文件夹,然后切换到别的用户的时候去写的代码 可能会遇到各种问题 解决方案是更改文件或文件夹的所有权。这可以通过使用…...

第三章 内存管理 九、基本分段存储管理方式
目录 一、概括 二、什么是分段 三、段表 四、地址转换 五、分段和分页的对比 六、总结 一、概括 基本分段存储管理方式是一种操作系统的内存管理方式,采用这种方式,将进程所需的内存分成若干个段,每个段都可以单独进行管理和保护。 具…...

轻重链剖分+启发式合并专题
Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树,每条边上有一个字符(a-v共22种)。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…...
IRC/ML:金融智能风控—信贷风控场景简介、两大场景(贷款场景+信用卡场景)、信用卡评分模型设计、反欺诈检测技术的简介、案例应用之详细攻略
IRC/ML:金融智能风控—信贷风控场景简介、两大场景(贷款场景+信用卡场景)、信用卡评分模型设计、反欺诈检测技术的简介、案例应用之详细攻略 目录 信贷风控简介 信贷风控两大场景...

【学习笔记】RabbitMQ01:基础概念认识以及快速部署
参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 一、认识RabbitMQ1.1 消息中间件(MQ Message Queue 消息队列1.2 主流的消息中间件1.3 MQ的应用场景1.3.1 异步处理1.3.2 系统解耦1.3.3 流量削峰1.3.4 日志处理 二、RabbitMQ运行环境搭建…...
Java数据结构之第二十章、手撕平衡AVL树
目录 一、二叉平衡树 1.1二叉搜索树回顾以及性能分析 1.1.1二叉搜索树的概念 1.2二叉搜索树的查找 1.3二叉树查询性能分析 二、AVL树 2.1AVL树的概念 2.2AVL树节点的定义 2.3AVL树的插入 2.4AVL树的旋转 2.4.1新节点插入较高左子树的左侧---右单旋 2.4.2新节点插入较…...
SQL 在PostgreSQL中使用SQL将多行连接成数组
在本文中,我们将介绍如何使用SQL语言在PostgreSQL数据库中将多行数据连接成一个数组。在开发和分析应用程序时,我们经常需要将数据库中的多个行合并为一个,以便更方便地进行处理和分析。PostgreSQL提供了一种名为ARRAY_AGG的聚合函数…...
Ajax技术实现前端开发
一、原生AJAX 1.1AJAX 简介 AJAX 全称为Asynchronous JavaScript And XML,就是异步的JS 和XML。 通过AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。 1.2XML 简介 XML 可扩…...
WebMail:网页注册成功发送邮件
1.特别注意 isELIgnored"false" 如果没有这个El表达式无法识别 2.pre work pox.xml <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...