Raspberry Pi 与Arduino SPI通信

2023-11-01

本教程介绍了使用SPI(串行外围设备接口总线)进行Raspberry Pi与Arduino通讯和控制的基本框架。 SPI代表了一种非常完善的芯片间通信方法,该方法在两种设备的硬件中均实现。 在这里,我们将详细探讨SPI,讨论硬件和软件注意事项,并开发一个双向通信方案的工作示例,该方案可适用于许多命令和控制应用程序。

介绍

Arduino 3.3伏

选择运行在3.3v电压下的Arduino,可以在两个设备的输入和输出引脚之间实现直接连接,而无需进行电平转换即可对齐电压并保护树莓派输入,从而简化了此项目。

Arduino通常被描述为5伏平台,但这并非完全正确。 实际上,在许多标准Arduino的核心中,ATMEGA328P-PU微控制器的额定工作电压为1.8v至5.5v。 尽管旗舰版Arduino Uno和许多其他产品都是为5v操作而设计的,但也有很多官方和非官方的3.3v Arduino供您选择,包括Fio,Pro,Pro-Mini和Lilypad。 (Pro和Pro-Mini具有3.3v和5v版本。)

开发本教程时使用的“ Arduino”是ATMEGA328P-PU,在面包板上采用准系统配置。 该设置确实是准系统。 没有电压调节器或外部时钟晶体,只有由树莓派的3.3v抽头和10K电阻将复位引脚拉高的芯片供电。 (当然,在电源轨上放置一些去耦电容器也没有什么坏处。)除了诱人的电路简单性和节俭性之外,准系统配置是连接Raspberry Pi的理想选择。 3.3v运行不仅对树莓派友好,而且使用电压调节器和晶振可以显着降低总体功耗,这对于在3.3v线路上具有50mA限制的老式树莓派尤其重要。

我通常在电池供电的小型项目中使用此准系统设置。 自己制作时,需要考虑一些在较低电压下运行328P的注意事项。 最重要的问题是需要以较低的时钟速度运行,8MHz是最快的时钟,可以在3.3v时可靠地支持该时钟。 另一个考虑因素是,必须禁用或配置328的掉电检测,以使压差小于3.3v。

Arduino官方网站上有board.txt文件:从Arduino到面包板上的微控制器,它将提供适当的设置来运行最低限度的板并加载8MHz兼容的引导程序。 如果您不熟悉启动引导程序和构建自己的主板,则本页面还将为您提供一个很好的起点,以收集必要的知识和技能。

关于树莓派环境和C ++编译器的一些注意事项

本教程是使用运行标准Raspian Linux发行版的Raspberry Pi Model B和Raspberry Pi 2开发和测试的。 这些示例应该可以在任何当前的Raspberry Pi型号上无需修改的工作。 我通过SSH从Linux PC上的终端通过SSH运行Raspi“无头”(没有监视器或键盘),因此实际上我的所有交互都在命令行中进行。 示例代码使用C ++编写,并使用GNU编译器集合(GCC)进行编译。 GCC是Raspian发行版的一部分,因此无需安装或配置即可使用。 此处的所有示例都可以使用非常简单的命令行语法进行编译:

g++ -o <target> <source>

要访问SPI外设,必须具有较高的用户权限,因此将需要使用sudo执行编译后的示例,如下所示:

sudo ./example
SPI接口

SPI是Raspberry Pi Arduino连接的几种可行选择之一。 SPI接口的一些优点是广泛采用,信号完整性,协议设计的灵活性和简单性。

SPI采用主从架构。 主设备启动并控制与从设备的所有通信。 SPI通信是同步的,这意味着两个设备之间的数据传输通过共享的时钟信号同步。 SPI通信也是全双工的,这意味着数据可以同时在两个方向上流动。

主机通过时钟线控制数据传输。 每次主机向时钟线发出脉冲时,就会有一位数据从主机发送到从机。 同时,从从机向主机推送一位数据。 实际上,出于我们此处的目的,可以将数据视为在字节级别上移动。 主机和从机各自将一个字节加载到其各自的SPI数据寄存器中,主机向时钟线脉冲八次以在每个方向上压入一个字节。 尽管可以设置各种硬件标志和可以触发的中断,但是没有SPI协议。 两个设备之间同时传输一个字节的数据是整个过程的全部。 如果需要,确认信号,错误检查,数据包定义和其他通用协议功能都可以在软件中处理。

SPI总线本身由四个物理连接组成:两条数据线,一条时钟线和从选择线。 主机必须为每个从机配备一条从机选择线,因此理论上所需的从机选择线的数量可能会增加。

Raspberry Pi和Arduino的时钟和数据线的名称和标签相同:

  • SCLK:串行时钟(主机输出)
  • MOSI:主站输出,从站输入(主站输出)
  • MISO:主机​​输入,从机输出(从机输出)

但是,在从站选择线上,两个平台之间的命名略有不同。 在Arduino上,该行称为“从属选择”,缩写为SS。 在Raspberry Pi上,该过程称为“片选”(缩写为CS),而CS线称为“芯片使能”线(简称为CE)。 PI实际上使两条从选择线可用,标识为CE0和CE1。

与某些串行总线方案不同,在串行总线方案中,一个设备的传输线(TX)连接到另一设备的接收线(RX),在SPI中,一个设备上的四条线直接连接到另一设备上的相应线,如下图所示。

SPI总线在ATMEGA328P-PU上的物理位置很简单,如下面的引脚图所示。 SS在物理引脚16上,MOSI在引脚17上,MISO在引脚18上,而SCLK在引脚19上。

Raspberry Pi GPIO接头的引脚排列图更加简单。 遵循下面的引脚图(与版本A,A +,B,B +和2B保持一致),MOSI是引脚19,MISO引脚21和SCLK引脚23。在本教程中,我们使用引脚24上的CS CE0。

启用树莓派SPI
在树莓派上编码SPI
Arduino上编码SPI

代码

详情参阅 - 亚图跨际

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raspberry Pi 与Arduino SPI通信 的相关文章

  • Arduino:将数据存储在 EEPROM 中的轻量级压缩算法

    我想将大量数据存储到我的 Arduino 上ATmega168 http www atmel com devices atmega168 aspx ATmega328 http www atmel com devices atmega328
  • 使用 pySerial 等待 Arduino 自动重置

    我正在尝试在 Linux 上使用非常简单的代码 为了展示问题 从 Arduino 板上读取行 Python代码 arduino py import serial arduino serial Serial dev ttyACM0 with
  • 如何使用arduino从sim900模块的RTC读取日期和时间数据?

    include SIM900 h include
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • PySerial 从 Arduino 读取线路的延迟

    我正在使用带有基本 DigitalReadSerial 设置的 arduino uno 如下所述 http arduino cc en Tutorial DigitalReadSerial http arduino cc en Tutori
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • 经典蓝牙 (2.1) 设备可实现的最小数据包延迟是多少?

    我正在使用 RN42 http www microchip com wwwproducts en RN42 http www microchip com wwwproducts en RN42 蓝牙模块以 115200 波特率 UART S
  • C++ Linux (Ubuntu) 正确写入串行(对于 Arduino)

    我想知道是否有一种标准方法可以与高效的串行设备进行通信 我应该使用标准库吗 如果有 是哪一个 现在我正在摆弄让 LED 根据输入的数字以给定的量亮起 Arduino 代码如下 只是练习一些东西 看我过于简单且低效的测试 include
  • C++:将成员函数作为普通函数指针传递的闭包

    我正在尝试调用外部库的成员函数 该函数接受函数指针作为参数 Timer every unsigned long period void callback void 但不幸的是我想传递的参数是一个成员函数 void MyClass the m
  • Arduino 的 C++ 类文件中的字符串无法编译

    我正在用 C 为 Arduino 编写一个堆栈类sketch http www arduino cc en Tutorial Sketch 我相信它完全符合AVR 如果这就是它的名字 我记不清了 编译器 我都用过malloc and fre
  • pySerial 与 python 2.7 和 3.4 的差异

    我正在开发一个项目 需要通过串口将一些数字从 Windows 10 中的 python 发送到 arduino uno 作为一个简单的测试 我只想通过发送 2 来打开 LED 并通过从命令提示符发送 4 来关闭 LED 尽管我希望最终能够将
  • 将浮点数转换为字节数组的 C 函数

    我正在尝试创建一个函数来接受浮点变量并将其转换为字节数组 我找到了一段有效的代码片段 但如果可能的话 希望在函数中重用它 我也在使用 Arduino 环境 但我知道它接受大多数 C 语言 目前工作 float variable 1 11 b
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 是否可以在 Arduino 上运行 ZeroMQ

    我想知道是否可以通过 ZeroMQ 与 Arduino 进行通信 我想使用 Arduino 来控制一些设备 并希望将大部分应用程序放在计算机上 为此 如果 Arduino 和控制器可以通过 Zeromq 以及 WiFi 或以太网扩展板进行通
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • 当我启动程序时,Arduino IDE (Win10) 崩溃

    我的 Arduino IDE Win10 上的版本为 1 8 12 在启动时崩溃 运行arduino debug exe我收到此错误消息 C Program Files x86 Arduino gt arduino debug exe Se
  • 如何在 Arduino 中将 char 变量作为数字打印到串行端口?

    我正在使用 Arduino Uno 我正在从 EEPROM 读取一个字节值并将该值存储在类型变量中char 1 字节 我想将变量的值作为数字 而不是相应的 ASCII 代码 打印到串行监视器 例如考虑char val 5 我想查看串行监视器
  • 使用 Arduino 来操作 Android [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人尝试过让 Android 和 Arduino 相互通信吗 我在网上找到了几个项目 Amarino http www amarino tool
  • STM32F4 板上的 SPI 从机设置

    我正在尝试通过主从配置中的 SPI 在两个 STM32F4 发现板之间进行通信 我已经有了主设备的代码 但我对需要对从设备的 SPI 初始化进行的更改感到有点困惑 我还想在主机发送数据时实现中断 而不是让从机一直轮询 RXNE 寄存器 但是

随机推荐

  • ajax嵌套的场景有哪些,ajax嵌套

    一 ajax嵌套ajax 传说中的嵌套金字塔 以及这种方式只能串联发起ajax请求 function getDataFun ajax url equip rank type GET dataType jsonp success functi
  • Qt之键盘事件无法响应问题

    Qt之键盘事件无法响应问题 概述 代码 over 文末一句话 概述 新公司的加班第一天 在调试公司项目代码时发现个小问题 鼠标 键盘事件都已写好 但是键盘事件无效无法进入断点 接来下去查文档并没有查到相关说明 翻阅百度翻到如下代码 并进行测
  • 配置文件文档

    Tranquilpeak Version 0 5 3 BETA Author Thibaud Lepr tre I STRONGLY recommend you to use a CDN to speed up loading of pag
  • Linux驱动入门(6.1)LED驱动---设备树

    前言 1 在韦东山Linux驱动入门实验班 5 LED驱动 驱动分层和分离 平台总线模型我们已经讲解了如何将驱动程序和硬件程序进行剥离 但是大佬们感觉这样还不行 他们认为要专门弄一个结构存储硬件信息 而不是用c文件存储 于是 大佬们就发明了
  • 数据结构-后序中序

    PTA 后序中序遍历给出先序结果 根据要求给定一棵二叉树的后序遍历和中序遍历结果 输出该树的先序遍历结果 输入格式 positive integer N lt 30 表示树中节点的个数 随之而来的是两行遍历序列 分别对应后序遍历和中序遍历结
  • 手把手教你ubuntu下移植MJPG-streamer

    一 嵌入式视频图像开源库 在嵌入式系统中 常用的视频图像处理开源系统有 luvcview cheese motion mjpg streamer或者ffmpeg 其中 luvcview 基于V4L2 SDL的程序 支持拍照录像 参数调节 代
  • Linux centos 卸载 ceph

    在CentOS上卸载Ceph的操作步骤 1 停止Ceph集群 首先 你需要停止Ceph集群中的所有服务 在每个节点上运行以下命令来停止所有服务 systemctl stop ceph target 2 卸载Ceph软件包 在每个节点上 使用
  • 在1-100中随机生成10个数字并进行排序

    1 生成10以内的数字 可以参考rand 10 2 生成1 10之间的数字 可以参考rand 10 1 3 特定的 要生成a b之间的数字 可以参考rand b a 1 a include
  • CSharp: QuestPDF create pdf file in donet core 6

  • UE4 分屏显示

    比较简单 直接附上蓝图 注意 启动模式选择独立游戏进程启动这样能够在两个屏幕上满屏显示 在UE4 版本上可以实现 不清楚在UE5上实现不了在两个屏幕上满屏显示 有疑惑或者想法这欢迎沟通交流 还要注意设置项目里面的屏幕设置 下面附上简单的分屏
  • js如何实现数组去重的常用方法

    聚沙成塔 每天进步一点点 专栏简介 使用 Set ES6 使用 filter 和 indexOf 使用 reduce 使用对象属性 使用 includes 方法 ES6 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上
  • 有人知道乐高机器人和乐高少儿编程区别吗

    乐高机器人和乐高少儿编程区别 现在很多的家长对于孩子的学习可以说是非常的用心 就拿现在很多的家长在给孩子选择少儿编程的学习课程的时候 可以说是非常的用心 就想要给孩子选择一个对于孩子有好处的课程 但是很多的家长对于乐高机器人和少儿编程的了解
  • 老猿学5G:融合计费的Nchf和Nchf‘服务化接口消息Nchf_ConvergedCharging_Create、Update、Release和Notify

    老猿Python博文目录 一 引言 在 老猿学5G扫盲贴 中国移动的5G计费架构解读 介绍了5G融合计费的服务化接口包括 CHF提供给CTF使用的Nchf接口 OCF提供给CHF使用的Nchf 接口 这两个接口消息的内容都相同 只是服务端和
  • 安卓端自行实现工信部要求的隐私合规检测一(教你手写Xposed模块代码)

    前言 原文地址 安卓端自行实现工信部要求的隐私合规检测一 教你手写Xposed模块代码 转载者言 只是简单监控隐私权限可以使用Android 11的新特性AppOpsManager OnOpNotedCallback 参考下面文章 隐私合规
  • Maven中GeoTools的引入 - Maven 的 repository 与 mirror

    Maven中GeoTools的引入 Maven 的 repository 与 mirror 在Maven中引入GeoTools时找不到jar包 搜索了蛮久才明白是自己maven没有学明白 于是重学了一次maven 解决了这个问题 关键在于理
  • python-共现矩阵(共词矩阵)计算

    共现矩阵 共词矩阵 统计文本中两两词组之间共同出现的次数 以此来描述词组间的亲密度 code 我这里求的对角线元素为该字段在文本中出现的总次数 import pandas as pd def gx matrix vol li 整合一下 输入
  • knife4j介绍及使用

    Knife4jInsight是一款致力于基于OpenAPI2及OpenAPI3规范进行聚合的独立中间件 在Knife4j 4 0版本发布之际 作者也对该组件进行了了架构重新设计 代码重构 并也发布了该独立中间件的2 0版本 基于Spring
  • windows使用makefile的三种方法

    windows使用makefile的三种方法 想再在windows上尝试makefile的可以试一试 注意需要下载好mingw 配置好gcc路径 才能成功使用make 第1种方法只需要命令行 2 3种方法需要借助vscode实现 当用户编译
  • Rokoko for Maya

    Rokoko for Maya 动捕应用 一 什么是Rokoko 二 使用 Rokoko Stufio 暂时没打算记录如何操作 Maya插件 rokoko studio live 下载安装 如何使用 三 其他 一 什么是Rokoko Rok
  • Raspberry Pi 与Arduino SPI通信

    本教程介绍了使用SPI 串行外围设备接口总线 进行Raspberry Pi与Arduino通讯和控制的基本框架 SPI代表了一种非常完善的芯片间通信方法 该方法在两种设备的硬件中均实现 在这里 我们将详细探讨SPI 讨论硬件和软件注意事项