SPI(串行外围设备接口)是一种高速的、全双工、同步的通信协议,常用于微控制器与外围设备(如传感器、闪存、实时时钟等)之间的短距离通信。SPI接口通常由四个信号线组成:SCLK(串行时钟)、MOSI(主设备输出从设备输入)、MISO(主设备输入从设备输出)和SS/CS(从设备选择/片选)。
SPI的通信是通过主设备控制时钟信号来实现的,其基本时序如下:
1.SPI帧格式
SPI通信通常基于一个帧的概念,一个帧由以下部分组成:
- 起始位(可选):某些SPI设备可能需要起始位来标识数据的开始;
- 数据位:通常是8位,但也可以是16位、32位等;
- 停止位(可选):某些SPI设备可能需要停止位来标识数据的结束;
2.时序细节
以下是SPI通信的典型时序:
- SS/CS片选信号
- 低电平有效:在通信开始前,主设备将SS/CS线拉低,选中从设备;
- 高电平无效:在通信结束后,主设备将SS/CS线拉高,释放从设备;
- SCLK(串行时钟)
- 主设备产生SCLK信号,控制数据传输的节奏;
- 数据在SCLK的上升沿或下降沿进行移位;
- MOSI和MISO信号
- MOSI:主设备通过MOSI线发送数据给从设备;
- MISO:从设备通过MISO线发送数据给主设备;
以下是SPI通信的详细时序步骤:
- 初始化:所有设备未选中状态,SS/CS为高电平;
- 启动传输:
- 主设备将SS/CS线拉低,选中从设备;
- 主设备开始提供SCLK时钟信号;
- 数据传输:
- 在SCLK的第一个时钟沿(上升沿或下降沿,取决于配置),主设备将第一个数据位放在MOSI线上,同时从设备在MISO线上放置相应的数据位;
- 在接下来的时钟周期,数据位依次移位。例如,如果配置为上升沿触发,那么在每个上升沿,MOSI和MISO上的数据位都会更新;
- 数据位可以是8位、16位或更多,这取决于设备和配置;
- 完成传输:
- 当所有数据位都传输完毕后,主设备停止提供SCLK时钟;
- 主设备将SS/CS线拉高,释放从设备。
3.时钟极性和相位(CPOL和CPHA)
SPI协议的灵活性在于时钟极性(CPOL)和时钟相位(CPHA)的配置,它们决定了数据在时钟信号上的采样时机。
- CPOL(Clock Polarity):定义了SCLK空闲状态时的电平。CPOL=0表示空闲状态为低电平,CPOL=1表示空闲状态为高电平;
- CPHA(Clock Phase):定义了数据采样时刻。CPHA=0表示在时钟的第一个边沿(通常是上升沿)采样数据,CPHA=1表示在时钟的第二个边沿(下降沿)采样数据。
根据CPOL和CPHA的不同组合,SPI有四种工作模式:
- 模式0:CPOL=0, CPHA=0;
- 模式1:CPOL=0, CPHA=1;
- 模式2:CPOL=1, CPHA=0;
- 模式3:CPOL=1, CPHA=1;
不同的设备可能支持不同的模式,因此在使用SPI进行通信时,需要确保主从设备的模式设置匹配。 注意:SPI的数据位传输具有先后顺序,在SPI通信中,数据位是从最高有效位(MSB)开始传输,还是从最低有效位(LSB)开始传输,取决于设备的配置。以下是两种可能的传输顺序:
- MSB先行(Most Significant Bit First):
- 在这种方式下,数据传输从最高有效位开始,然后依次传输接下来的位,直到最低有效位结束;
- 例如,如果传输一个8位的数据0b10101100,那么传输的顺序将是:1, 0, 1, 0, 1, 1, 0, 0;
- LSB先行(Least Significant Bit First):
- 在这种方式下,数据传输从最低有效位开始,然后依次传输接下来的位,直到最高有效位结束;
- 使用同样的数据0b10101100,传输的顺序将是:0, 0, 1, 1, 0, 1, 0, 1;
SPI协议本身并没有规定必须使用哪一种传输顺序,因此不同的SPI设备可能会使用不同的传输顺序。当两个SPI设备进行通信时,必须确保它们的数据传输顺序设置是一致的。如果主设备和从设备的数据传输顺序不匹配,接收到的数据将会是错误的。
通常,设备的硬件手册或者数据手册会指明该设备是使用MSB先行还是LSB先行。在配置SPI接口时,主设备需要根据从设备的这一特性来设置相应的传输顺序。在软件编程时,这也通常是一个可配置的参数。
相关实验: