目录
1. 基本信号线
2. 主从结构
3. 数据传输模式(CPOL和CPHA)
4. 数据传输过程
举例:一个简单的数据传输流程
5、问题解决
SPI(Serial Peripheral Interface,串行外设接口)是一种常用的串行通信协议,广泛应用于微控制器、传感器、存储器和显示设备之间的数据传输。它通常用于短距离的高速通信,支持全双工通信
1. 基本信号线
SPI通常使用四条信号线:
- MOSI(Master Out Slave In):主机输出、从机输入,主机通过这条线发送数据给从机。
- MISO(Master In Slave Out):主机输入、从机输出,从机通过这条线发送数据给主机。
- SCK(Serial Clock):串行时钟,由主机产生,用于同步数据传输。
- SS/CS(Slave Select/Chip Select):从机选择,由主机控制,用于选择哪个从机参与通信(低电平有效)。
2. 主从结构
SPI采用主从结构,主机(Master)控制时钟信号和数据传输,从机(Slave)仅在被选择时进行通信。主机可以有一个或多个从机,每个从机对应一个独立的SS/CS信号。当主机拉低某个从机的SS/CS信号时,该从机即参与通信。
3. 数据传输模式(CPOL和CPHA)
SPI的时钟有两个参数控制传输模式:
- CPOL(Clock Polarity):控制时钟的空闲状态是高电平(1)还是低电平(0)。
-
CPHA = 0:
- 数据在时钟的第一个边沿(上升沿)进行采样。
- 对应的工作模式:模式0和模式2。
-
CPHA = 1:
- 数据在时钟的第二个边沿(下降沿)进行采样。
- 对应的工作模式:模式1和模式3。
注意:在下图当中。当CPHA=0或者CPHA=1,不是说在开始发送数据的时候,时钟线是低电平或者高电平,而是说,CPHA = 0 是指数据在时钟上升沿被读取,CPHA=1是指在时钟下降沿的时候被读取。为了方便不混淆;可以说,
在MOSI信号线上:CPHA=0,每个周期的第一个边沿读取(从机去读取),CPHA=1,每个周期的第二个边沿读取(从机读取);
在MISO信号线上:CPHA=0,主机机会在每个时钟周期的第一个边沿读取主机发送的数据,CPHA=1,主机也会在每个时钟周期的第二个边沿读取从机发送的数据。
这两个参数的组合会形成4种工作模式,通常称为模式0、模式1、模式2和模式3。不同的设备可能支持不同的SPI模式,因此在通信时要确保主从双方的模式一致。所以一般的芯片手册上面,厂家会提供该芯片的通信模式
模式0:CPOL=0,CPHA=0;
模式0:CPOL=0(极性),CPHA(相位)=0:在模式0下面,时钟空闲状态时低电平,第一个边沿采样,所以当第一个周期开始的时候,此时第一个周期时低电平开始,主设备开始发送数据,当第一个周期当中,电平开始拉高产生上升沿的时候,从设备读取数据,当从设备接收到数据之后,在第二个周期当中,时钟信号变为低电平,产生下降沿,主设备发送数据,在第二个周期当中,时钟信号由低电平变为高电平的时候,产生上升沿,从设备接收数据,以此类推,当停止接收的时候,片选信号线会变为低电平,结束通信。
模式1:CPOL=0,CPHA=1;
- CPOL = 0:时钟空闲状态为低电平。
- CPHA = 1:数据在时钟信号的下降沿被采样。
-
片选信号(SS/CS):
- 主设备将对应从设备的片选信号拉低,选择该从设备进行通信。
-
第一个周期:
- 时钟信号:开始时,SCK保持在低电平。
-
主设备发送数据:
- 空闲状态是低电平,数据开始第一个周期会将时钟信号拉高,在拉低,第一个边沿为上升沿发送数据。
-
从设备接收数据:
- 在SCK从高电平下降到低电平时,从设备在这个下降沿采样MOSI线上的数据。
-
第二个周期:
- 时钟信号:SCK在这一周期继续在低电平和高电平之间切换。
-
主设备准备下一个数据位:
- 主设备在时钟信号上升沿时准备下一个数据位。
-
从设备接收数据:
- 当SCK再次下降到低电平时,从设备在这个下降沿采样MOSI线上的数据。
主设备在MOSI线上发送数据位,从最高有效位(MSB)开始。由于这时候CPHA=1,第二个边沿产生时,从机会读取数据。
前面时钟空闲状态为低电平,这时候拉高会产生上升沿,主设备会发送数据,而在第一个周期还没结束的时候,时钟线会由高到低,产生下降沿,从设备接收数据,在第二个周期开始的时候,时钟线被拉高,产生上升沿,因此主设备发送数据,在第二个周期当中,当时钟线由高到低的时候,产生下降沿,从设备接收数据,由此重复循环,就实现通信,当主设备不想通信的时候,就会将cs信号线电平拉低或者拉高来结束通信,cs信号线为高电平或者低电平看从设备的芯片要求来定,因为对于有些芯片来说,厂家设计的时候,规定了这款芯片进行SPI通信的时候,cs线是低电平通信,还是高电平通信。但是绝大部分都是高电平通信,所以在想要和从设备通信之前,必须先将cs线拉高或者拉低,如果你选择的从设备是高电平通信,将cs拉高,当想要结束通信的时候,将cs线拉低。
模式2:CPOL=1,CPHA=0;
-
时钟信号状态:在模式2中,时钟的空闲状态为高电平。这意味着在没有数据传输时,时钟线保持在高电平状态。
-
数据传输:
- 主设备在MOSI线上发送数据时,数据的有效传输发生在时钟的下降沿。这是主设备首先拉高时钟线,随后在数据传输期间从高到低产生下降沿。
- 从设备在下降沿时接收数据。
-
数据顺序:与模式1相同,主设备从MOSI线上发送数据时,也是从最高有效位(MSB)开始。
-
CS信号线:与模式1一样,CS信号线用于选择从设备,具体的高低电平取决于从设备的设计要求。当CS线有效时,主设备与从设备之间建立通信。
-
结束通信:同样,主设备在完成数据传输后,通过拉高或拉低CS线来结束通信。
模式3:CPOL=1,CPHA=1;
对于模式3来说,CPHA=1,在第二个边沿读取数据,所以,当第一个边沿时,是用来发送数据的,下降沿发送数据,第二个边沿接收数据。
4. 数据传输过程
在SPI通信中,数据在SCK的边沿传输。每个时钟周期,MOSI和MISO各发送1位数据,完成全双工通信。数据的传输方向和速率由主机决定,通常采用8位或16位为一个数据帧。
举例:一个简单的数据传输流程
- 主机拉低目标从机的SS/CS信号,使该从机进入通信状态。
- 主机开始发送SCK信号,同时在MOSI上发送数据位,从机在MISO上返回数据。
- 数据传输完成后,主机拉高SS/CS信号,结束与该从机的通信。
5、问题解决
完善一下,在学习的过程当中,我也产生了几个疑问:
1、主设备将数据放到MOSI线上,然后在下降沿进行接收。这种时序安排确保了数据能够在正确的时刻被接收和发送。那么对于MISO线来说,此时收到的数据是来自从设备的吗?
回答:当MOSI线在发送数据的时候,MISO线在接收来自从设备的数据,当MOSI线在发送数据时,MISO线则在接收来自从设备的数据。在SPI通信中,这种时序安排确保了主设备和从设备能够同时进行数据传输。主设备在MOSI线上发送数据的同时,从设备会在MISO线上发送数据,主设备可以在合适的时刻读取MISO线上的数据。这样实现了双向通信。这样是SPI作为全双工通信的特点。
2、假如主设备当中有多个寄存器地址,从设备怎么确定数据存放在哪个寄存器当中呢,假如从设备当中有多个寄存器地址,主机发送的数据又怎么确定放在哪个寄存器地址下面呢?
回答:
在SPI通信中,主设备和从设备通过特定的协议来管理寄存器地址。这通常涉及以下几个步骤:
寄存器选择:主设备在发送数据之前,会首先发送一个命令字或寄存器地址。这一部分数据可以通过MOSI线传输给从设备,告诉从设备要访问哪个寄存器。
数据传输:一旦从设备识别了要访问的寄存器地址,主设备可以随后发送数据到该寄存器,或者从该寄存器读取数据。
协议约定:这种寄存器选择的方式需要在主设备和从设备之间有一致的协议。例如,可能会有一个固定的命令格式,其中包括寄存器地址和操作类型(读或写)。
多从设备情形:如果有多个从设备,主设备可以通过选择特定的片选信号(Chip Select,CS)来激活对应的从设备。这些片选信号通常是独立的,每个从设备都有一个对应的信号线。
3、在发送寄存器地址方面,SPI不用确认从设备是否知道我要发送到哪个寄存器地址下面吗?如果是第一段数据是从设备寄存器地址,那么读写是不是已经确定了,不用读写位来确定,因为这时候MOSI已经确定发送和接收的关系了? 和IIC有相似之处吗?
回答:
在SPI中,主设备发送寄存器地址的确是在数据传输的初期阶段,这样从设备就可以知道接下来的数据是要写入哪个寄存器,或者是从哪个寄存器读取。主设备不需要单独确认从设备是否已经“知道”要发送到哪个寄存器,因为在发送寄存器地址后,从设备会根据这个地址来处理接下来的读或写操作。
相对于I2C,SPI的操作较为简单,因为I2C通常需要使用读写位来明确指示接下来是读还是写,而SPI则通过寄存器地址的顺序和主设备的时序来决定。因此,主设备通过发送正确的寄存器地址,已经在一定程度上确定了读写的关系,接下来的数据传输则依赖于协议的定义。