spi基本概念
串行外设接口(Serial Peripheral Interface,SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。
SPI是一种同步、全双工、主从式接口。来自主机或从机的数据在时钟上升沿或下降沿同步。主机和从机可以同时传输数据。SPI接口可以是3线式或4线式。本文重点介绍常用的4线SPI接口。
接口
4线SPI器件有四个信号:
时钟(SPI CLK,SCLK):串行时钟,用来同步数据传输,由主机输出;
片选(CS):片选线,低电平有效,由主机输出;
主机输出、从机输入(MOSI):主机输出从机输入数据线;
主机输入、从机输出(MISO):主机输入从机输出数据线。
产生时钟信号的器件称为主机。主机和从机之间传输的数据与主机产生的时钟同步。与I2C接口相比,SPI器件支持更高的时钟频率。SPI接口只能有一个主机,但可以有一个或多个从机。上图显示了主机和从机之间的SPI连接。
来自主机的片选信号用于选择从机。这通常是一个低电平有效信号,拉高时从机与SPI总线断开连接。当使用多个从机时,主机需要为每个从机提供单独的片选信号。MOSI和MISO是数据线,MOSI将数据从主机发送到从机,MISO将数据从从机发送到主机。
时钟极性和时钟相位
在SPI中,主机可以选择时钟极性和时钟相位。
时钟极性CPOL(Clock Polarity):是用来配置SCLK的电平处于哪种状态时有效。
CPOL=0:表示高电平有效,低电平处于空闲态。
CPOL=1:表示低电平有效,高电平处于空闲态。
时钟相位CPHA(Clock Phase):是用来配置数据采样是在第几个边沿,0表示第一个边沿(前沿Leading edge),1表示第二个边沿(后沿Trailing edge)。
CPHA=0:表示数据采样是在第1个边沿,数据发送在第2个边沿。
CPHA=1:表示数据采样是在第2个边沿,数据发送在第1个边沿。
主机必须根据从机的要求选择时钟极性和时钟相位,也即从机的传输模式决定了主机的传输模式。故先要了解从机的SPI是何种模式,然后再将主机的SPI的模式设置成同样的模式,即可正常通讯。根据CPOL和CPHA位的选择,有四种SPI模式可用。
四种模式采样/输出时序图如下,其中应用比较多的是SPI0/SPI3两种模式:
SPI数据传输与交换
要开始SPI通信,主机必须发送时钟信号,并通过使能CS信号选择从机。片选通常是低电平有效信号。因此,主机必须在该信号上发送逻辑0以选择从机。
SPI是全双工接口,主机和从机可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上)和接收(采样或读取MISO/SDI总线上的数据)同时进行。串行时钟沿同步数据的移位和采样。SPI接口允许用户灵活选择时钟的上升沿或下降沿来采样和/或移位数据。
SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)" 或者"接收者(Receiver)"。在每个Clock周期内, SPI设备都会发送并接收一个bit大小的数据(不管主设备还是从设备),相当于该设备有一个bit大小的数据被交换了。
SPI设备通信过程中,Master设备和Slave设备之间会产生一个数据链路回环(Data Loop),SSPSR控制数据移入移出SSPBUF,Controller确定SPI总线的通信模式,SCLK传输时钟信号。
在每个时钟周期内,Master与Slave之间交换的数据其实都是SPI移位寄存器从SSPBUF里面拷贝的。我们可以通过往SSPBUF对应的寄存器 (Tx-Data/Rx-Data register) 里读写数据,间接地操控SPI设备内部的SSPBUF。
例如,在发送数据之前,我们应该先往Master的Tx-Data寄存器写入将要发送出去的数据,这些数据会被Master-SSPSR移位寄存器根据Bus-Width自动移入Master-SSPBUF里, 然后这些数据又会被Master-SSPSR根据Channel-Width从Master-SSPBUF中移出,通过Master-SDO管脚传给Slave-SDI管脚,Slave-SSPSR则把从Slave-SDI接收到的数据移入Slave-SSPBUF里。与此同时,Slave-SSPBUF里面的数据根据每次接收数据的大小(Channel-Width), 通过Slave-SDO发往Master-SDI,Master-SSPSR再把从Master-SDI接收的数据移入 Master-SSPBUF。在单次数据传输完成之后,用户程序可以通过从Master设备的Rx-Data寄存器读取Master设备数据交换得到的数据。
多从机配置
在常规模式下,主机需要为每个从机提供单独的片选信号。一旦主机使能(拉低)片选信号,MOSI/MISO线上的时钟和数据便可用于所选的从机。如果使能多个片选信号,则MISO线上的数据会被破坏,因为主机无法识别哪个从机正在传输数据。
在菊花链模式下,所有从机的片选信号连接在一起,数据从一个从机传播到下一个从机。在此配置中,所有从机同时接收同一SPI时钟。来自主机的数据直接送到第一个从机,该从机将数据提供给下一个从机,依此类推。
参考文档: