spi 介绍
接口及特点
标准 spi 接口有4根信号线。
信号 | 作用 | 方向 |
---|---|---|
SCLK | 时钟信号线,用于通讯数据同步 | master->slave |
MOSI | 主设备输出 | master->slave |
MISO | 主设备输入 | slave->master |
CS | 从设备选择信号线,常称为片选信号线,也称为NSS、SS,拉低使能。 | master->slave |
spi flash 是一种常见的 spi 外设,通常接口有4~6根信号线。为了提高性能,spi flash 支持 Dual SPI 和 Quad SPI 模式,引入更多信号线来传输数据。
信号 | 作用 |
---|---|
CLK | Serial Clock Input |
DI/MOSI(IO0) | Serial Data Input(Data input output 0) |
DO/MISO(IO1) | Serial Data Output(Data input output 1) |
WP#(IO2) | Write Protect (Data input output 2) |
HOLD# / RESET# (3) (IO3) | Hold or Reset input(Data input output 3) |
CS | Chip Enable |
标准的 SPI 中 Master 到 Slave 和 Slave 到 Master 数据传输分别是一根信号线。
Dual SPI 就是让原来的 MISO 和 MOSI 都可以同时发送数据,实际并未增加信号线。
Quad SPI 则是又额外添加了两个信号线来进行数据传输,总共4根信号线同时发送数据。人们常说4线spi flash、6线 spi flash,从信号线接线可以看出区别。
还有一个常见 spi 外设是 spi 串口屏接口,通常带 spi LCM 外设的芯片,其屏幕的 spi 接口并不是标准的 4 线 spi(四根信号线:CS, MOSI, MISO, CLK),而是专用的 spi 接口,在接口上的区别主要在于4 线 spi 和 3 线 spi 接口的区别、1 data line 和 2 data line 的区别以及Ⅰ 型 和 Ⅱ 型屏的区别,具体可参考之前的文章:常见的 SPI LCD 接口分类。
spi 时钟模式
spi 一共有4种工作模式,分别对应不同的极性CPOL(Clock POLarity)和相位CPHA(Clock PHAse) 组合。
极性,SPI空闲时时钟信号SCLK的电平(0:空闲为低电平; 1:空闲为高电平),时序图里面看CS拉高时候的CLK电平。
相位,SPI在SCLK第几个边沿开始采样(0:第一个边沿采样; 1:第二个边沿采样)。
标准spi协议在一个时钟边沿发送数据,在另一个时钟边沿采样数据。而CPOL CPHA 的配置决定了 spi 通信在什么时候修改数据,以及在什么时候采样数据,这对于看波形来说是必须要知道的。
模式 | CPOL | CPHA | 采样时间 |
---|---|---|---|
mode0 | 0 | 0 | 下降沿修改数据,上升沿采样 |
mode1 | 0 | 1 | 下降沿采样,上升沿修改数据 |
mode2 | 1 | 0 | 下降沿采样,上升沿修改数据 |
mode3 | 1 | 1 | 下降沿修改数据,上升沿采样 |
对于 spi flash,通常支持 mode0 和 mode3,即都是在下降沿送数据,上升沿采样。
spi 波形
下面是使用逻辑分析仪抓取 stm32 spi master 与 ecr6600 slave 通信时的波形,工作在模式0。
ecr6600 slave 的通信时序是 cmd dummy data,各占一个字节,cmd 为 0x0B 时读取slave的数据,cmd 为 0x51 时写入数据到slave。
SPI 是全双工通信的,发送的同时也在接收。 什么时候收,什么时候发其实都由 master 控制,通常外设需要等到主机发送了命令才知道自己要接收数据还是要回复数据,以及回复什么数据,所以很多时候命令设计成了事实上的半双工:前半部分主机在发命令,外设发送无用的数据(dummy);后半部分外设在发送响应,主机发送无用的数据(dummy)。
前面 stm32 spi master 与 ecr6600 slave 通信时发现一个特点,连续收发数据的时候时钟不连续,每收发两个字节数据之间时钟有空隙,其实是 stm32 master 这边没有开 dma 导致的。 当使用dma传输时,连续收发数据时钟便是连续的。
高频下的spi通信问题
在 Using-SPI-Protocol-at-100MHz 中描述了 spi 通信时信号的延时路径,示例为 master 读取 slave 数据。
在高频情况下,需要考虑 master 到 slave 之间 clk 的传输延迟、slave 收到clk之后到数据输出到数据线上的延迟(slave 的响应速度)、slave 输出数据到 master 接收数据线上的延迟。
Tsamp 是 mater 采样数据的可用时间,计算方式如下:
在4MHz下没有问题。
但在100MHz下,Tsamp 的时间不够。100MHz 下时钟周期是10ns,要求 slave 收到master 时钟信号后,要在 5 ns 内准备好发送的数据(做出响应),实际上这样的响应速度很难做到。
怎么解决这个问题呢?
文档中提到3个办法:
缩短二者的通信距离,提高slave的响应速度,影响甚微。
降频。降频自然是可行的,按照前面的示例,时钟频率最大不超过53MHz才能正常通信。
延迟采样,延迟半个或者1个时钟周期采样。100MHz 下时钟周期是10ns,延时半个时钟周期采样则有10ns的时间给slave准备发送数据,延时1个时钟周期采样则有15ns的时间给slave准备发送数据。