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,主输入从输出。
2.SPI 四种工作模式
SPI 有四种工作模式,通过时钟极性(CPOL)和时钟相位(CPHA)的搭配来得到四种工作模式:
①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
示例波形图如下:
SPI 是全双工的,所以读写时序可以一起完成。
3.SPI 传输机制
从图可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。
外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
虽然 SPI 四线制支持读写同时进行,但实际上我们很多时候并不需要又读又写,见以下两种情况(参考 BMA223 数据手册):
注意:如下三幅图示均为 CPOL=1,CPHA=1
(1)主机向从机写数据
主机发送先发送 8 bits,第一个 bit 为 0 代表这次主机是想写数据到从机,AD6~AD0 表示要写的寄存器地址。然后,主机就会一直写下去。在这期间 SDO 一直没用,一直是高阻态,算是一直读到1。
(2)主机从从机读数据
这种情况下,主机先发送 8 bits,第一位为 1 代表这次是读,然后 AD6 ~ AD0 是想要读的寄存器地址,然后 SDO 开始返回数据。
4.SPI timing diagram
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 设置不同:
传输 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 的四倍。