什么是SPI?
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。
特点及优缺点
SPI具有高速,非差分,同步,全双工,总线式的特点
- 优点:全双工,通讯简单,传输速率快
- 缺点:没有指定的流控制,没有应答机制确认是否接收到数据,所以跟I2C总线协议比较在数据 可靠性上有一定的缺陷。
原理
SPI是已主从方式进行通讯,同时支持多个从机;该协议总共有四根线,分别是SDO/MOSI(数据输出),SDI/MISO(数据输入),SCLK(时钟),CS/SS(片选信号)
- SDO/MOSI – 主设备数据输出,从设备数据输入;
- SDI/MISO – 主设备数据输入,从设备数据输出;
- SCLK– 时钟信号,由主设备产生;
- CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。
SPI时钟特点
SPI时钟特点主要包括:时钟速率、时钟极性和时钟相位三方面。
- 时钟速率:SPI总线上的主设备必须在通信开始时候配置并生成相应的时钟信号。从理论上讲,只要实际可行,时钟速率就可以是你想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。
- 时钟极性:根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。
CKP = 0:时钟空闲IDLE为低电平 0;CKP = 1:时钟空闲IDLE为高电平1。 - 根据硬件制造商的不同,时钟相位通常写为CKE或CPHA。顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0:在时钟信号SCK的第一个跳变沿采样;CKE = 1:在时钟信号SCK的第二个跳变沿采样。
SPI的四种模式
SPI通讯的步骤
SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。
具体步骤为
- 主机发送信号,CS/SS初始化(拉高或拉低,具体看配置的SPI模式),启动通讯
- 主设备通过发送时钟信号,开始采集数据(采集时机是时钟信号的上升沿(从低到高)或下降沿(从高到低),具体看配置的SPI模式),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)
- 主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,具体得看单片机的配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区
- 从机(Slave)也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
需要注意的是:SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。若只进行写操作,主机只需忽略接收到的字节(虚拟数据);反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。