Skip to content

SPI

页面内容

概述

树莓派系列设备配备了许多SPI总线。 SPI可用于连接各种外围设备-显示器,网络控制器(以太网,CAN总线),UART等。内核设备驱动程序最好为这些设备提供支持,但是spidev API允许将用户空间驱动程序编写为多种语言。

硬件

所有树莓派器件共有的 BCM2835 内核具有 3 个 SPI 控制器: *具有两个硬件芯片选择的 SPI0 在所有 Pi 的头上都可用(尽管还有一个替代映射仅在 Compute Module上可用。 * SPI1,具有三个硬件芯片选择,可用于 40 引脚版本的 Pis 。 * SPI2也具有三个硬件芯片选择,仅在计算模块上可用,因为这些引脚未引到 40 引脚接头连接器上。

BCM2711增加了另外 4 条 SPI 总线-SPI3至 SPI6 ,每条总线具有 2 个硬件芯片选择。所有的引脚都在 40 针接头连接器上(只要没有其他尝试使用相同的引脚的话)。

BCM2835 ARM外围设备数据表中的第 10 章介绍了主控制器。第 2 .3章介绍了辅助控制器。

引脚/GPIO映射

SPI0(在所有 RPi 版本的 J8 /P1接头上可用)

| SPI功能接针| Broadcom引脚名称| Broadcom引脚功能| | --- | --- | --- ||- | MOSI | 19 | GPIO10 | SPI0_MOSI | | MISO | 21 | GPIO09 | SPI0_MISO | | SCLK | 23 | GPIO11 | SPI0_SCLK | | CE0 | 24 | GPIO08 | SPI0_CE0_N | | CE1 | 26 | GPIO07 | SPI0_CE1_N |

SPI0备用映射(仅在计算模块上可用)

| SPI功能 Broadcom 引脚名称| Broadcom引脚功能| | --- | --- | --- || | MOSI | GPIO38 | SPI0_MOSI | | MISO | GPIO37 | SPI0_MISO | | SCLK | GPIO39 | SPI0_SCLK | | CE0 | GPIO36 | SPI0_CE0_N | | CE1 | GPIO35 | SPI0_CE1_N |

SPI1(仅在 40 引脚 J8 接头上可用)

| SPI功能接针| Broadcom引脚名称| Broadcom引脚功能| | --- | --- | --- ||- | MOSI | 38 | GPIO20 | SPI1_MOSI | | MISO | 35 | GPIO19 | SPI1_MISO | | SCLK | 40 | GPIO21 | SPI1_SCLK | | CE0 | 12 | GPIO18 | SPI1_CE0_N | | CE1 | 11 | GPIO17 | SPI1_CE1_N | | CE2 | 36 | GPIO16 | SPI1_CE2_N |

SPI2(仅在计算模块上可用)

| SPI功能 Broadcom 引脚名称| Broadcom引脚功能| | --- | --- | --- || | MOSI | GPIO41 | SPI2_MOSI | | MISO | GPIO40 | SPI2_MISO | | SCLK | GPIO42 | SPI2_SCLK | | CE0 | GPIO43 | SPI2_CE0_N | | CE1 | GPIO44 | SPI2_CE1_N | | CE2 | GPIO45 | SPI2_CE2_N |

SPI3(仅 BCM2711 )

| SPI功能接针| Broadcom引脚名称| Broadcom引脚功能| | --- | --- | --- ||- | MOSI | 03 | GPIO02 | SPI3_MOSI | | MISO | 28 | GPIO01 | SPI3_MISO | | SCLK | 05 | GPIO03 | SPI3_SCLK | | CE0 | 27 | GPIO00 | SPI3_CE0_N | | CE1 | 18 | GPIO24 | SPI3_CE1_N |

SPI4(仅 BCM2711 )

| SPI功能接针| Broadcom引脚名称| Broadcom引脚功能| | --- | --- | --- ||- | MOSI | 31 | GPIO06 | SPI4_MOSI | | MISO | 29 | GPIO05 | SPI4_MISO | | SCLK | 26 | GPIO07 | SPI4_SCLK | | CE0 | 07 | GPIO04 | SPI4_CE0_N | | CE1 | 22 | GPIO25 | SPI4_CE1_N |

SPI5(仅 BCM2711 )

| SPI功能接针| Broadcom引脚名称| Broadcom引脚功能| | --- | --- | --- ||- | MOSI | 08 | GPIO14 | SPI5_MOSI | | MISO | 33 | GPIO13 | SPI5_MISO | | SCLK | 10 | GPIO15 | SPI5_SCLK | | CE0 | 32 | GPIO12 | SPI5_CE0_N | | CE1 | 37 | GPIO26 | SPI5_CE1_N |

SPI6(仅 BCM2711 )

| SPI功能接针| Broadcom引脚名称| Broadcom引脚功能| | --- | --- | --- ||- | MOSI | 38 | GPIO20 | SPI6_MOSI | | MISO | 35 | GPIO19 | SPI6_MISO | | SCLK | 40 | GPIO21 | SPI6_SCLK | | CE0 | 12 | GPIO18 | SPI6_CE0_N | | CE1 | 13 | GPIO27 | SPI6_CE1_N |

主模式

信号名称缩写

SCLK-串行时钟
CE-芯片使能(通常称为芯片选择)
MOSI-主输出从站
MISO-主进从出
MOMI-主进主进

标准模式

在标准 SPI 模式下,外设执行标准的 3 线串行协议(SCLK,MOSI和 MISO )。

双向模式

在双向 SPI 模式下,除了将一根导线用于数据(MOMI)而不是用于标准模式的两根导线(MISO和 MOSI )之外,实现了相同的 SPI 标准。在此模式下,MOSI引脚用作 MOMI 引脚。

LoSSI模式(低速串行接口)LoSSI标准允许向外围设备(LCD)发出命令,以及与外围设备之间传输数据。 LoSSI命令和参数的长度为 8 位,但是额外的一位用于指示该字节是命令还是参数/数据。对于数据,该额外位设置为高,对于命令,此额外位设置为低。结果的 9 位值被序列化到输出。 LoSSI通常与MIPI DBIC型兼容 LCD 控制器一起使用。

注意:

有些命令会触发 SPI 控制器的自动读取,因此该模式不能用作多功能 9 位 SPI 。

传输模式

  • 轮询
  • 打断
  • DMA

速度

CLK寄存器的 CDIV (时钟分频器)字段设置 SPI 时钟速度:

SCLK =核心时钟/CDIV
如果 CDIV 设置为 0 ,则除数为 65536 。除数必须为 2 的倍数,且四舍五入为奇数。请注意,由于模拟电气问题(上升时间,驱动强度等),并非所有可能的时钟速率都可用。

有关更多信息,请参见Linux驱动程序部分。

片选

DMA 模式下运行时,与 CS 线的自动断言和断言有关的建立和保持时间如下:

  • CS线将在传输的第一个字节的 msb 之前至少 3 个内核时钟周期被置为有效。
  • CS线将在最终时钟脉冲的下降沿之后不早于 1 个核心时钟周期被置为无效。

软件

Linux驱动程序

现在默认的 Linux 驱动程序是标准的 spi -bcm2835。

SPI0默认为禁用。要启用它,请使用raspi-config,或确保/boot /中的'dtparam = spi = on'行未被注释掉 config .txt。默认情况下,它使用 2 条芯片选择线,但是可以使用`dtoverlay = spi0-1cs'减少到 1 条。 dtoverlay = spi0-2cs也存在,并且没有任何参数,它等效于 dtparam = spi = on。

要启用 SPI1 ,可以使用 1 、 2 或 3 个芯片选择线,并分别添加:

dtoverlay = spi1-1cs#1芯片选择
dtoverlay = spi1-2cs#2芯片选择
dtoverlay = spi1-3cs#3芯片选择

到/boot/config.txt文件。 SPI2,SPI3,SPI4,SPI5和 SPI6 存在类似的覆盖。

由于某些限制,驱动程序不使用硬件芯片选择线-相反,它可以使用任意数量的 GPIO 作为软件/GPIO芯片选择。这意味着您可以自由选择任何备用 GPIO 作为 CS 线路,并且所有这些 SPI 覆盖都包括该控件-有关详细信息,请参见/boot/overlays/README,或运行(例如)dtoverlay -h spi0-2cs(dtoverlay -a | grep spi可能有助于将它们全部列出)。

速度

该驱动程序支持所有速度,甚至是内核时钟的整数倍数,尽管如上所述,由于 GPIO 和所连接设备的限制,并非所有这些速度都将支持数据传输。根据经验,超过 50MHz 的频率不太可能起作用,但是您的里程可能会有所不同。

支持的模式位

SPI_CPOL-时钟极性
SPI_CPHA-时钟相位
SPI_CS_HIGH-片选高电平有效
SPI_NO_CS-每条总线 1 个设备,无芯片选择
SPI_3WIRE-双向模式,数据输入和输出引脚共享

spi-bcm2835内核模块支持双向或" 3线"模式。请注意,在这种模式下,spi_transfer结构的 tx 或 rx 字段必须为 NULL 指针,因为只能进行半双工通信。否则,传输将失败。 spidev_test.c源代码没有正确考虑这一点,因此在三线模式下根本无法工作。

每个字支持的位数

  • 8-普通
  • 9-使用 LoSSI 模式支持此功能。

传输模式

所有 SPI 总线均支持中断模式。 SPI0和 SPI3 -6也支持 DMA 传输。

SPI驱动程序延迟

thread讨论了延迟问题。

spidev

spidev为各个 SPI CS线提供了一个基于 ioctl 的用户空间接口。设备树用于指示 CS 线路是由内核驱动程序模块驱动还是由 spidev 代表用户管理;不可能同时做两个。请注意,树莓派自己的内核对使用 Device Tree启用 spidev 更为放松-上游内核会显示有关此类用法的警告,并最终可能完全阻止使用它。

从 C 使用 spidev

Linux文档中有一个回送测试程序,可以用作起点。请参阅故障排除部分。

从 Python 使用 spidev

有几个 Python 库可提供对 spidev 的访问,包括想象中的spidev(pip install spidev-参见 https ://pypi.org/project/spidev/)和`SPI-Py(https://github.com/lthiery/SPI-Py)。

从 bash 等 shell 使用 spidev

``

写入二进制 1 、 2 和 3

echo -ne" \ x01 \ x02 \ x03"> /dev/spidev0.0 ```###其他 SPI 库 还有其他用户空间库通过直接操作硬件来提供 SPI 控制。不建议这样做。

故障排除

回送测试

这可用于测试 SPI 发送和接收。在 MOSI 和 MISO 之间放置一根电线。它不测试 CE0 和 CE1 。

`` wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/spi/spidev_test.c gcc -o spidev_test spidev_test.c ./spidev_test -D /dev/spidev0.0 spi模式:0 每个字的位数:8 最高速度:500000 Hz(500 KHz)

FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF DE AD BE EF BA AD F0 0D ```

上面的某些内容已从https://elinux.org/RPi_SPI复制而来,该内容也从此处借来。两者均受 CC -SA许可证的保护。