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

https://embed.notionlytics.com/wt/ZXlKd1lXZGxTV1FpT2lJMU1HRTROVFpqTldSbFlqUTBNalJsT0dFNE5qa3laak13Wm1Oak9Ua3hPQ0lzSW5kdmNtdHpjR0ZqWlZSeVlXTnJaWEpKWkNJNklsZHNTR2hsVEZSUFdXeHpaVmRhUW1ZNU1YQmxJbjA9

介绍

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的时钟和数据线的名称和标签相同: