1、SPI  hardware

SPI:Serial Perripheral Interface,串行外围设备接口,由 Motorola 公司提出,是一种高速、全双工、同步通信总线。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,无应答机制。

本文我们讲解标准的 4 线 SPI,四根线如下:

①、CS/SS,Slave Select/Chip Select,片选信号线,用于选择需要进行通信的从设备。

②、SCK,Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。

③、MOSI/SDO,Master Out Slave In/Serial Data Output,主输出从输入。

④、MISO/SDI,Master In Slave Out/Serial Data Input,主输入从输出。

嵌入式系统中SPI 子系统基本原理实现_信号线

2、SPI 四种工作模式

SPI 有四种工作模式,通过时钟极性(CPOL)和时钟相位(CPHA)的搭配来得到四种工作模式:

①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

嵌入式系统中SPI 子系统基本原理实现_寄存器_02

示例波形图如下:

嵌入式系统中SPI 子系统基本原理实现_寄存器_03

SPI 是全双工的,所以读写时序可以一起完成。

3、SPI 传输机制

嵌入式系统中SPI 子系统基本原理实现_数据_04

从图可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。

外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

嵌入式系统中SPI 子系统基本原理实现_linux_05

嵌入式系统中SPI 子系统基本原理实现_寄存器_06

嵌入式系统中SPI 子系统基本原理实现_数据_07

虽然 SPI 四线制支持读写同时进行,但实际上我们很多时候并不需要又读又写,见以下两种情况(参考 BMA223 数据手册):

注意:如下三幅图示均为 CPOL=1,CPHA=1

1、主机向从机写数据

嵌入式系统中SPI 子系统基本原理实现_信号线_08

主机发送先发送 8 bits,第一个 bit 为 0 代表这次主机是想写数据到从机,AD6~AD0 表示要写的寄存器地址。然后,主机就会一直写下去。在这期间 SDO 一直没用,一直是高阻态,算是一直读到1。

2、主机从从机读数据

嵌入式系统中SPI 子系统基本原理实现_linux_09

这种情况下,主机先发送 8 bits,第一位为 1 代表这次是读,然后 AD6 ~ AD0 是想要读的寄存器地址,然后 SDO 开始返回数据。

4、SPI timing diagram

嵌入式系统中SPI 子系统基本原理实现_数据_10

Tcsb_setup:建立时间
Tcsb_hold:保持时间
tsckl:低电平时间
tsckh:高电平时间
SCK period :Tsckl + tsckh
一般情况下 Tsckl = tsckh

注意:真实的波形图如上,高低电平并不是到达最高点才算,0.3Vdd 以下为低电平,0.7Vdd 以上为高电平,计算信号时间长度的时候需要注意这个微小的时间,硬件设计必须注意信号质量风险,软件开发人员也要会看波形图。

这里的参数,一般 spi 驱动不需要设置,但是半导体厂商提供的 spi 控制器驱动中,可以修改这些参数。我们写 SPI 驱动时候,可以根据从设备的要求来修改这些参数。

5、DMA 与 FIFO

不同平台对于 SPI FIFO 和 DMA 的 buffer size 设置不同:

嵌入式系统中SPI 子系统基本原理实现_信号线_11

传输 32bytes 以下使用 FIFO,传输 32bytes 以上使用 DMA。

DMA 可以自动发起多次传输,一次最大 256K 。

6、I2C 与 SPI 对比

功能

I2C

SPI

线数

2(SDA,SCL)

4(MOSI,MISO,SCLK,CS)

主机数量

>=1

==1

类型

半双工

全双工

回应机制

yes

no

速度

<=3.4Mbps

high

应用

重要数据

大量数据

流控

yes

no

设备地址

yes

no

常规用途

命令

数据

I2C 和 SPI 的速率如下:

I2C模式

速度

标准

100KHz

快速

400KHz

快速+

1MHz

高速

3.4MHz

SPI 速率:几十 MHz 甚至上百 MHz,速度取决于 CPU 的 SPI 控制器和时钟 clock

STM32F103 的 SPI 最高支持 18MHz,imx6ull 的 SPI 最高支持 52MHz,其他芯片一般用不到更高的,因为速度越快波形质量越不好,越容易出问题。

具体采用多大速率还和外设有关,比如 EEPROM 的 W25Q128 的 SPI 最高支持 80MHz,ICM20608 传感器的 SPI 最高支持8MHz。一般用在 flash 上的速度会较快。

7、扩展

SPI 协议其实是包括:Standard SPI、Dual SPI 和 Queued SPI 三种协议接口。

Dual SPI 还是四线制,只是传输线可以变为同方向,速度是 Standard SPI 的两倍。

Queued SPI 是六线制,多了两根数据线,传输速度是 Standard SPI 的四倍。