STM32SPI
SPI通信(不完整)
物理层
在SPI通信协议中,所有的主机共用CLK、MOSI、MISO三根线,另外各自拉出来一条SS(CS)与主机相连。
- SS/CS(Slave select / Chip select):设备使能信号。一主多从时,SS/CS表示从设备是否被选中。当需要操作某一从设备时,这条设备单独拉出来一条SS/CS连接主机,此SS/CS上面的片选信号为预先规定的使能信号时,主设备对该从设备的操作才有效;
- SCLK(Serial Clock):就当i2c里的CLK理解即可;
- MOSI(Master Output Slave Input):主设备输出(从设备输入);
- MISO(Master Input Slave Output):主设备输入(从设备输出)。
MOSI和MISO一定有一个I而另一个就会是O,所以MISO和MOSI只需要看前面两个字母。
SPI特征
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial PeripheralInterface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU间,要求通讯速率较高的场合。1
SPI总线是一种高速全双工同步串行通信总线,它可以使CPU与各种外围设备以串行方式进行通信以交换信息。1
SPI的主要应用领域包括:EEPROM、FLASH、AD转换器、各种传感器等设备通信领域。SPI总线协议在不同的半导体公司的具体实施细节可能有所不同,因此具体的应用还是要参考特定器件的数据手册。1
SPI总线支持全双工通信,而且支持高速应用(100Mbp速率以上)。SPI协议支持的字长不限于8位,可以根据应用的特点灵活选择消息的字长。在点对点的通信中,SPI协议不需要进行寻址操作,显得简单且高效。1
但是SPI协议并没有流控制和应答机制,因此在可靠性方面可能较差。1
通信原理
- 主设备(Master,
唐僧师傅)发起信号,拉低SS,启动通信 - 主机发送时钟信号,告诉从设备进行写数据或读数据操作(采集时机可能是时钟上升沿或下降沿,取决于SPI四种模式的选择),从机会读取数据线上的1bit信号
- 主机发送的数据写到发送缓冲区(Memory),缓存区经过移位寄存器,串行移位寄存器通过MOSI发给从机,同时MISO接收到的数据放到接收缓存区
- 从机(Slave)将自己的串行移位寄存器中的值通过MISO发送给主机,同时MOSI接收主机发送的数据。
通信特性
设备选择
选择谁,就拉低谁的SS。
设备时钟
时钟速率不写了
时钟极性
时钟极性通常缩写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。
CKP可以配置为0或1,这意味着你可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。你必须参考设备的数据手册才能正确设置CKP和CKE。2
0 | 1 |
---|---|
时钟空闲IDLE为低电平 0 | 时钟空闲IDLE为高电平1 |
时钟相位
根据硬件制造商的不同,时钟相位通常写为CKE或CPHA。时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿。
0 | 1 |
---|---|
在时钟信号SCK的第一个跳变沿采样 | 在时钟信号SCK的第二个跳变沿采样 |
SPI通信操作模式
SPI通信操作模式定义了在时钟脉冲的哪条边沿输出信号,在哪条采样边沿采样输入信号。
- Mode0:CKP=0,CKE =0:当空闲态时,SCK处于低电平,数据采样是在第1个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。
- Mode1:CKP=0,CKE=1:当空闲态时,SCK处于低电平,数据发送是在第2个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
- Mode2:CKP=1,CKE=0:当空闲态时,SCK处于高电平,数据采集是在第1个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
- Mode3:CKP=1,CKE=1:当空闲态时,SCK处于高电平,数据发送是在第2个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
多个从机
感觉很容易理解,不写了。
参考文献
1. SPI通信协议 ↩
2. 一文搞懂SPI通信协议 ↩