在高级应用程序中使用 SPI

重要

这是 Azure Sphere(旧版)文档。 Azure Sphere(旧版)将于 2027 年 9 月 27 日停用,用户此时必须迁移到 Azure Sphere(集成)。 使用位于 TOC 上方的版本选择器查看 Azure Sphere(集成)文档。

在主模式下,Azure Sphere 支持串行外围接口 (SPI)。 SPI 是用于在外围设备与集成线路之间进行通信的串行接口。 SPI 使用主/从模型,其中,主设备控制一组从属设备。 相比于 I2C,SPI 可用于更复杂的、速度更快的外围设备。

应用程序可以调用 Applibs SPI API 通过 SPI 访问外围设备,以针对 SPI 主接口执行操作。 LSM6DS3 SPI 示例描述了如何为 MT3620 设备上的硬件配置 SPI,以及如何在应用程序中使用 SPI。

芯片选择

“芯片选择”管理 SPI 主接口与一组从属设备之间的连接;允许主接口单独向每个从属设备发送数据以及接收其数据。 Azure Sphere 支持“芯片选择”的低主动和高主动设置,默认设置为低主动。 每个 SPI 主接口可由一个应用程序专用。 应用程序必须打开 SPI 主接口并识别每个连接的从属设备,然后才能在该接口上执行读取和写入操作。 Azure Sphere 上的 SPI 读取和写入操作使用阻塞 API。

SPI 要求

使用 SPI 的应用程序必须包含适用于 SPI 的相应的标头文件,并将 SPI 设置添加到应用程序清单

所有应用程序都必须设置其目标硬件,并包括相应的硬件定义头文件。

头文件

 #define SPI_STRUCTS_VERSION 1
 #include <applibs/spi.h>
 #include "path-to-your-target-hardware.h"

在包括头文件之前声明 SPI_STRUCTS_VERSION 预处理器定义。 这会指定应用程序使用的结构版本。

将“path-to-your-target-hardware.h”替换为硬件头文件的路径。

应用程序清单设置

若要使用 SPI API,必须将 SpiMaster 功能添加到应用程序清单,然后将每个 SPI 主控制器添加到该功能。 这样,应用程序便可以访问控制器。 Azure Sphere 应用程序清单 包含有关应用程序清单的更多详细信息。

在代码中,使用为硬件定义的常量来识别 SPI 主接口。 生成应用时,编译器会将这些值转换为原始值。

以下是一个应用清单的摘录,该清单将 MT3620 参考开发板 (RDB)设为目标,并配置了两个 SPI 主接口:

"SpiMaster": [ "$MT3620_RDB_HEADER2_ISU0_SPI", "$MT3620_RDB_HEADER4_ISU1_SPI" ],

以下摘录显示了如何在将 Avnet MT3620 初学者工具包设为目标的应用程序中指定相同的 SPI 主接口:

"SpiMaster": [ "$AVNET_MT3620_SK_ISU0_SPI", "$AVNET_MT3620_SK_ISU1_SPI" ]

配置“芯片选择”并打开 SPI 主接口

在 SPI 主接口上执行操作之前,必须配置“芯片选择”并打开该接口。 若要配置“芯片选择”,请调用 SPIMaster_InitConfig 函数来初始化 SPIMaster_Config 结构。 初始化 SPIMaster_Config 之后,使用 SPI_ChipSelectPolarity_ActiveLow 或 SPI_ChipSelectPolarity_ActiveHigh 设置更新 csPolarity 字段。

若要打开 SPI 主接口,请调用 SPIMaster_Open 函数。 这会将默认设置应用到该接口,并应用“芯片选择”设置:

  • SPI_Mode_0 表示 SPI 位顺序
  • SPI_BitOrder_MsbFirst 表示通信模式

更新 SPI 主接口的设置

初始化后,可以更改接口的设置:

在 SPI 主接口上执行读取和写入操作

Azure Sphere 支持使用多个选项来配合 SPI 执行读取和写入操作。 若要执行单向读取或写入操作以及与某些 POSIX API 保持互操作性,可以调用 POSIX read(2) 和 write(2) 函数。

可以调用 SPIMaster_WriteThenRead 函数在单个总线事务中依次执行写入和读取组合操作,而不会受到另一个事务的干扰。

如果需要更精确地控制读取或写入操作的计时,可以调用 SPIMaster_TransferSequential 函数。 这样,就可以在一对 CS 启用或禁用状态之间执行多个读取和写入操作。

关闭 SPI 接口

若要关闭该接口,请调用标准的 POSIX 函数 close()。

MT3620 支持

本部分介绍仅当在 MT3620 开发板上运行 Azure Sphere 时才适用的 SPI 选项。

MT3620 的 SPI 规格列在 MT3620 支持状态中。 MT3620 开发板用户指南介绍了适用于接线的引脚布局和功能。

Microsoft Azure Sphere SDK 安装目录中的 HardwareDefinitions 文件夹包含常见 Azure Sphere 开发板、模块和芯片的定义。 它包含标头和 JSON 文件,这些文件定义 MT3620、MT3620 RDB 和其他 MT3620 硬件的主接口。 HardwareDefinitions 文件夹的默认位置位于 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions Windows 和 /opt/azurespheresdk/HardwareDefinitions Linux 上。

GitHub 上的 Azure Sphere 示例存储库包含标头和 JSON 文件,用于定义 MT3620 芯片和 MT3620 RDBSPI 主接口,以及其他 MT3620 硬件。->

  • 配置 MT3620 开发板时,可将任何 ISU 端口用作 SPI 主接口。 最多可将两个从属设备连接到每个 ISU。 将 ISU 端口用作 SPI 主接口时,无法将同一个端口用作 I2C 或 UART 接口。
  • MT3620 支持最高 40 MHz 的 SPI 事务。
  • MT3620 不支持在单个总线事务中同时执行双向读取和写入(全双工)SPI 操作。