第一:SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。
第二:SPI,是一种高速的,全双工(发送和接收是独立的信号线),同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
第三:通常由一个主模块和一个或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据的交换。
SPI是一个环形结构,通信时需要至少4根线。
或者
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,主要是在sck的控制下,两个双向移位寄存器进行数据交换
主机和从机都有一个串行口移位寄存器(Shift Register),主机通过向它的SPI串行寄存器写入一个字节发起一次传输。
串行移位寄存器(Shift Register)通过MOSI信号线将字节传送给从机,从机也将自己的串行移位寄存器(Shift Register)中的内容通过MISO信号线返回给主机。这样,两个移位寄存器(Shift Register)中的内容就被交换。
外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK – Serial Clock,时钟信号,由主设备产生控制
(4)CS – Chip Select,从设备使能信号,由主设备控制。
其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。
SPI是串行通讯协议,也就是说数据是一位一位的传输的。在主器件产生的从器件使能信号和移位脉冲(SCLK提供)下,按位传输,高位在前,低位在后。在SCLK的下降沿上数据改变,同时一位数据被存入移位寄存器。脉冲时钟由SCLK提供,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。
SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义。
在主设备这边配置SPI接口时钟的时候一定要确认从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。
SPI总线不像IIC总线那样,SPI总线没有指定的流控制,没有应答机制确认是否接收到数据。
SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配 置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们 可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来 控制我们主设备的通信模式,具体如下SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配 置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们
可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来 控制我们主设备的通信模式,具体如下
模式0: CPOL=0,CPHA=1
模式1: CPOL=0,CPHA=1
模式2: CPOL=1,CPHA=0
模式3: CPOL=1,CPHA=1
是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,SPI主模块和与之通信的外设时钟相位和极性应该一致。
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
是用来配置数据采样是在第几个边沿
CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿,在每个周期的第一个时钟沿采样
CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿,在每个周期的第二个时钟沿采样
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
脉冲 |
主机SBUFF |
从机SBUFF |
SDI |
SDO |
状态 |
0空闲状态 |
10101010 |
01010101 |
0 |
0 |
无数据传输 |
1上升沿 |
0101010x |
1010101x |
0 |
1 |
发送 |
1下降沿 |
01010100 |
10101011 |
0 |
1 |
接收 |
2上升沿 |
1010100x |
0101011x |
1 |
0 |
发送 |
2下降沿 |
10101001 |
01010110 |
1 |
0 |
接收 |
3上升沿 |
0101001x |
1010110x |
0 |
1 |
发送 |
3下降沿 |
01010010 |
10101101 |
0 |
1 |
接收 |
4上升沿 |
1010010x |
0101101x |
1 |
0 |
发送 |
4下降沿 |
10100101 |
01011010 |
1 |
0 |
接收 |
5上升沿 |
0100101x |
1011010x |
0 |
1 |
发送 |
5下降沿 |
01001010 |
10110101 |
0 |
1 |
接收 |
6上升沿 |
1001010x |
0110101x |
1 |
0 |
发送 |
6下降沿 |
10010101 |
01101010 |
1 |
0 |
接收 |
7上升沿 |
0010101x |
1101010x |
0 |
1 |
发送 |
7下降沿 |
00101010 |
11010101 |
0 |
1 |
接收 |
8上升沿 |
0101010x |
1010101x |
1 |
0 |
发送 |
8下降沿 |
01010101 |
10101010 |
1 |
0 |
接收 |