张高兴的.NET Core IoT 入门指南:(四)使用 SPI 进行通信

什么是 SPI

和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设接口)也是设备与设备间通信方式的一种。SPI 是一种全双工(数据可以两个方向同时传输)的串行通信总线,由摩托罗拉于上个世纪 80 年代开发[1],用于短距离设备之间的通信。SPI 包含 4 根信号线,一根时钟线 SCK(Serial Clock,串行时钟),两根数据线 MOSI(Master Output Slave Input,主机输出从机输入)和 MISO(Master Input Slave Output,主机输入从机输出),以及一根片选信号 CS(Chip Select,或者叫 SS,Slave Select)。所谓的时钟线就是一种周期,两台设备数据传输不能各发各的,这样就没有意义,因此需要一种周期去对通信进行约束;数据线就是按照 MOSI 和 MISO 的中文翻译理解即可;片选信号用于主设备选择 SPI 上的从设备,I2C 是靠地址选择设备,而 SPI 靠的是片选信号,一般来说要选择哪个从设备只要将相应的 CS 线设置为低电平即可,特殊情况需要看数据手册。下图展示了一个 SPI 主设备和三个 SPI 从设备的示意图。

640?wx_fmt=png

图源:Wikipedia

SPI 还有一个重要的概念就是时钟的极性(CPOL,Clock Polarity)和相位(CPHA,Clock Phase),对其这里不过多解释,我们只需要知道极性和相位的组合构成了 SPI 的传输模式(SPI Mode)。在数据手册中,只要是 SPI 通信协议的,一定会给出传输模式,我们根据数据手册进行设置即可。SPI 的传输模式是有固定编号的,下表给出了各个模式,常用的模式有 Mode0 和 Mode3。

Mode000
Mode101
Mode210
Mode311

640?wx_fmt=png

该时序图显示了时钟的极性和相位。图源:Wikipedia

SPI 相比较 I2C 最大的优点就是传输速率高,并且数据在同一时间内可以双向传输,这都得益于它的两根输入和输出数据线。当然缺点也很明显,比 I2C 多了两根线,这就要多占用两个 IO 接口。而且 SPI 采用 CS 线去选择设备,不像 I2C 有寻址机制,如果你有很多个 SPI 设备需要连接的话 IO 接口的占用数量是相当高的。

在 Raspberry Pi 的引脚中,引出了两组 SPI 接口。但有意思的是,在 Raspbian 中 SPI-1 是被禁用的,你需要修改一些参数去启用 SPI-1。SPI 接口的引脚编号如下图所示。

 

 提示

如何在 Raspbian 上开启 SPI-1?(在 Win10 IoT 上 SPI-1 是开启的)

1. 使用编辑器打开 /boot/config.txt ,如:sudo nano /boot/config.txt

2. 添加 dtoverlay=spi1-3cs 并保存

3. 重启

640?wx_fmt=png

Raspberry Pi B+/2B/3B/3B+/Zero 引脚图

相关类

SPI 操作的相关类位于 System.Device.Spi 和 System.Device.Spi.Drivers 命名空间下。

SpiConnectionSettings

SpiConnectionSettings 类位于 System.Device.Spi 命名空间下,表示 SPI 设备的连接设置。

640?wx_fmt=png

UnixSpiDevice 和 Windows10SpiDevice

UnixSpiDevice 和 Windows10SpiDevice 类位于 System.Device.Spi.Drivers 命名空间下。两个类均派生自抽象类 SpiDevice,分别代表 Unix 和 Windows10 下的 SPI 控制器,使用时按照所处的平台有选择的进行实例化。这里以 UnixSpiDevice 类为例说明。

640?wx_fmt=png

SPI 的通信步骤

初始化 SPI 连接设置 SpiConnectionSettings

一般情况下,我们只需要配置 SPI 的 ID,CS 的编号,时钟频率和 SPI 传输模式。其中像时钟频率、传输模式等设置都来自于设备的数据手册。比如要使用 Raspberry Pi 的 SPI-0 去操作一个时钟频率为 5 MHz,SPI 传输模式为 Mode3 的设备,代码如下:

SpiConnectionSettings settings = new SpiConnectionSettings(busId: 0, chipSelectLine: 0)
{
ClockFrequency = 5000000,
Mode = SpiMode.Mode3
};

读取和写入

读取和写入与 I2C 类似,这里不再过多赘述,详见上一篇博客,这里只提供一个代码示例。唯一要说明的就是使用全双工通信 TransferFullDuplex() 时,要求写入的数据和读取的数据长度要一致,并且能否使用也需要看设备是否支持。比如从地址为 0x00 的寄存器中向后连续读取 8 个字节的数据,并且向地址为 0x01 的寄存器写入一个字节的数据,代码如下:

640?wx_fmt=png

加速度传感器读取实验

本实验选用的是三轴加速度传感器 ADXL345 ,数据手册地址:http://wenku.baidu.com/view/87a1cf5c312b3169a451a47e.html 。

传感器图像

640?wx_fmt=jpeg

硬件需求

电路

640?wx_fmt=jpeg

  • VCC - 3.3 V

  • GND - GND

  • CS - CS0 (Pin24)

  • SDO - SPI0 MISO (Pin21)

  • SDA - SPI0 MOSI (Pin19)

  • SCL - SPI0 SCLK (Pin23)

代码

  1. 打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“Adxl345”。

  2. 引入 System.Device.Gpio NuGet 包。

  3. 新建类 Adxl345,替换如下代码:

    640?wx_fmt=png

  4. 640?wx_fmt=png

  5. 在 Program.cs 中,将主函数代码替换如下:

    640?wx_fmt=png

  6. 发布、拷贝、更改权限、运行

效果图

640?wx_fmt=jpeg

原文地址:https://www.cnblogs.com/zhanggaoxing/p/10943822.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 中使用IHttpClientFactory发出HTTP请求

1.HttpClient类使用存在的问题HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面让我们通过代码跟示例来描述。using(var cl…

linux 安装 powershell

linux 安装 powershellIntropowershell 已经推出了一个 Powershell Core, 版本号对应 Powershell 6.x,可以跨平台,支持 Linux 和 mac. 这使得对于熟练使用 Powershell 进行开发运维的一些开发者来说无疑是个福音。PowerShell 和 PowerShell C…

精彩回放 | 玩转 VS Code 物联网开发

"Visual Studio Code:物联网开发利器"技术分享圆满落下帷幕!感谢韩老师的粉丝们!感谢热情的观众朋友们!点击文末阅读原文,可以观看视频回放~这几年物联网越来越火,大家都在说物联网,那…

重磅!开放EasyCharts插件源代码!

开源代码地址https://github.com/EasyChart/EasyCharts前 言不知不觉,Excel图表插件EasyCharts已经面世两年啦,今天突然发现百度网盘中的下载次数居然达到近4万,在这里非常感谢大家对EasyCharts的厚爱。由于工作太忙,时间有限&a…

构建可读性更高的 ASP.NET Core 路由

一、前言不知你在平时上网时有没有注意到,绝大多数网站的 URL 地址都是小写的英文字母,而我们使用 .NET/.NET Core MVC 开发的项目,因为在 C# 中类和方法名采用的是 Pascal 命名规范,根据 .NET 框架默认的路由规则,项目…

【18】ASP.NET Core MVC 中的 Model介绍

ASP.NET Core MVC 中的 Model在本视频中,我们将通过一个示例讨论 ASP.NET Core MVC 中的 Model。我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示。MVC 中的模型包含一组表示数据的类和管理该数据的逻辑。 因此&#x…

使用 Powershell 远程连接 windows server

使用 Powershell 远程连接 windows serverIntro最近我们的开发环境增加了一个 windows 服务器,没有界面的,不能直接远程桌面连上去管理,需要使用 Powershell 管理,于是就有了这篇文章的探索。windows服务器配置以下所有命令需要在…

.NET Core WEB API中接口参数的模型绑定的理解

在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种:微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-api/?viewaspnetcore-2.1特性 绑定源[FromHeader]请求标头[FromQuery]请求查询字符串参数[FromForm]请求正文中的…

ASP.Net Core Razor 部署AdminLTE框架

1、AdminLTE一个基于 bootstrap 的轻量级后台模板2、AdminLTE 文档在线中文Demo:http://adminlte.la998.com/在线中文文档:http://adminlte.la998.com/documentation/index.htmlGithub:https://github.com/almasaeed2010/AdminLTE/releases3、…

.NET CORE 对接天翼云 OOS

最近,因公司项目需要对接天翼云OOS,在百度多次折腾后,大部分的都是基于java、php 等其他语言,很少基于C#语言的相关资料,即使有也是基于.NET Framwork开发的SDK,内容几乎是千篇一律,很少基于.NE…

盘点618 .NET 程序员必“败”书单

六月到了,有三个节日迎接我们,心中微微一盘算:儿童节和端午节仿佛对我们都不重要。我们期待的只有:618狂欢购物节!没错一年一度的618来了,哪些书值得买? 小编盘点了2019年1-5月.NET 相关的图书,…

ApplicationInsights的探测器尝鲜

通常我们可以依靠ApplicationInsights(以下简称ai)来收集比如请求(request),依赖项(dependencies),异常(exception)等信息,但是无法收集到比如一个方法(方法内部比如没有依赖项调用)的信息。很多时候如果一个方法很慢,…

开源/免费界面自动化测试工具对比研究

摘要:随着我行自动化测试实施范围的不断扩大,参与界面自动化测试的应用系统越来越多。我行的应用系统现阶段多采用商用工具QTP(UFT)作为执行工具来进行界面自动化测试,采购的QTP license是有限的,使得资源的…

使用 ConfigMap 挂载配置文件

使用 ConfigMap 挂载配置文件Intro有一些敏感信息比如数据库连接字符串之类的出于安全考虑,这些敏感信息保存在了 AzureKeyVault 中,最近应用上了 k8s 部署,所以想把 AzureKeyVault 的信息迁移到 ConfigMap,不再依赖 AzureKeyVaul…

SciSharpCube:容器中的SciSharp,.NET机器学习开箱即用

SciSharp Cube在Docker容器中快速体验SciSharp机器学习工具的最新功能。项目地址(原文链接):https://github.com/SciSharp/SciSharpCube从Docker Hub运行docker run --name scisharp -it -p 8888:8888 scisharpstack/scisharpcube这条命令会拉取最新的SciSharpCube镜…

.NET Core 3中的性能提升(译文)

回顾我们准备推出.NET Core 2.0的时候,我写了一篇博文来介绍.NET已经引入的诸多性能优化中的一部分,我很喜欢把它们放在一起讲述,也收获了很多正面反馈,因此我又给.NET Core 2.1,一个同样高度聚焦于性能的版本&#xf…

程序员修神之路--高并发下为什么更喜欢进程内缓存

菜菜哥,告诉你一个好消息YY妹子,什么好消息,你有男票了?不是啦,我做的一个网站,以前经常由于访问量太大而崩溃,现在我加上了缓存,很稳定啦加的什么缓存呢?我用的redis&am…

6月数据库排行:PostgreSQL和MongoDB分数罕见下降

DB-Engines 数据库流行度排行榜 6 月更新已发布,排名前二十如下:总体排名和上个月相比基本一致,其中排名前三的 Oracle、MySQL 和 Microsoft SQL Server 也是分数增加最多的三个数据库,增加的分数分别为 13.67、4.67 和 15.57&…

在ASP.Net Core 中使用枚举类而不是枚举

前言:我相信大家在编写代码时经常会遇到各种状态值,而且为了避免硬编码和代码中出现魔法数,通常我们都会定义一个枚举,来表示各种状态值,直到我看到Java中这样使用枚举,我再想C# 中可不可以这样写&#xff…

ASP.NET Core 中的错误处理

1.前言ASP.NET Core处理错误环境区分为两种:开发环境和非开发环境。●开发环境:开发人员异常页。●非开发环境:异常处理程序页、状态代码页。在Startup.Configure方法里面我们会看到如下代码:env.IsDevelopment()是判断应用程序运…