简介:
SPI(Serial Peripheral Interface),串行外围设备接口,一种高速全双工通信总线。由于通讯速度快,被广泛使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。
SPI物理层:
使用SCK、MOSI、MISO 3条总线及片选线。
1>片选信号线:
从设备选择线,也称为NSS、CS。
相对于I2C协议中通过设备地址寻址来选中总线上的某个设备与其通讯,SPI协议则是通过NSS信号线寻址,被选中的从设备的NSS信号线被设为低电平,即片选有效,并且在通讯发过程中以NSS低电平作为开始信号,以NSS高电平作为结束信号,因此,无需关注设备地址。
由SPI通讯通过片选NSS信号线来选中从设备可知,每个从设备都有独立的一条NSS信号线,且此信号线独占主机的一个引脚,也就是说,有多少个从设备,就有多少条片选信号线。此外,由图可见,无论有多少个从设备,都共用SCK、MOSI、MISO三条总线。
2>SCK(Serial Clock):
时钟信号线,由通讯主机产生,用于通讯数据同步,并且决定了通讯的速率。不同的设备支持的最高时钟频率不同,如STM32的SPI时钟频率最大为f(pclk)/2,两个设备间通讯时,通讯速率受限于低速设备。
3>MOSI(Master Output,Slave Output):
主出从如(主设备输出/从设备输出引脚)。
数据方向为主机到从机。
4>MISO(Master Input,Slave Output):
主入从出(主设备输入/从输入输出引脚)
数据方向为从机到主机
主机和从机都有一个串行移位寄存器,
主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器的内容通过MISO信号线返回给主机。这样两个移位寄存器中的内容就被交换了,且外设的读写操作都是同步完成的。
如果只进行写操作,主机只需要忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机传输。
协议层
总体而言,由主机控制产生NSS、SCK、MOSI信号,并且主机通过由从机产生的MISO信号读取从机数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。
CPOL/CPHA及通讯模式
SPI共有四种通讯模式,四种通讯模式的主要区别在于总线空闲SCK的时钟状态(CPOL)以及数据采样时刻(CPHA)。
CPOL:指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(也就是在SPI通讯开始前、NSS线为高电平时SCK的状态,或者说是未正式启动有效数据传输时的SCK状态)。
CPOL=0时,表SCK在空闲状态时为低电平,
CPOL=1时,则表SCK在空闲状态时为高电平。
CPHA(时钟相位):数据的采样时刻。(SPI的采样时刻不是简单的根据高低电平来采样)
当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿采样。
当CPHA=1时,则在偶数边沿采样。
在采样时刻记录的数是有效数据,而在非采样时刻,MOSI和MISO的有效信号发生切换。
CPOL/CPHA都有两种表示,两两组合共有4种,就构成了四种通讯模式:
通讯过程:
当NSS信号由高变低时,从机在自身的NSS线检测到起始信号,表明被主机选中,开始准备与主机通讯。
当NSS信号为低时,SPI使用的MOSI及MISO数据有效,进行传输数据,同时使用SCK信号线进行数据同步。SCK的每个时钟周期,MOSI及MISO传输一位数,且数据的输入输出同时进行(全双工)
(数据传输过程中可设置MSB先行或LSB先行(大小端传输方式的选择),SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限,此外,两个SPI通讯设备之间要使用同样的协定才能保证数据正确的传输。),
而后根据SPI的通讯模式的选择,在触发时刻发送MOSI和MISO信号线上的电平切换,在采样时刻记录有效数据。
当NSS信号由低变高,作为SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
STM32的SPI外设简介:
STM32的SPI外设可以作为通讯的主机及从机,支持最高的SCK时钟频率为f(pclk)/2,完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。且支持双线全双工、双线单向以及单线模式。
(双线单向模式:可以同时使用MOSI及MISO数据线向同一方向传输数据,因为是两根线同时同向传输,传输速度加快一倍
单线模式:可以减少硬件接线,不过速率会受到影响)
时钟控制逻辑:
由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对f(pclk)时钟的分频因子,分频结果即为SCK引脚的输出时钟频率。
提供的各种不同分频因子是可以达到一定范围的降频,如此可以兼容不同最高频率的设备进行SPI通讯。
此外,通过"控制寄存器CR“的“CPOL位“及“CPHA”位可以进行SPI模式的设置。
数据控制逻辑:
SPI的MOSI及MISO都连接到数据移位寄存器上。
当向外发送数据时,数据移位寄存器以“发送缓冲区”为数据源,将数据一位一位通过数据线发送出去;当向外部接收数据时,数据移位寄存器将数据线采集到的数据一位一位通过存储到“接收缓冲区”中。
通过SPI的“数据寄存器DR”将数据填充到发送缓冲区中,通讯读“数据寄存器DR”,就可以获得接收缓冲区中的内容。
(此外,数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置为8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行)
整体控制逻辑:
整体控制逻辑负责协调整个SPI外设,通过配置“控制寄存器(CR1/CR2)”的配置可以改变控制逻辑的工作模式。(其中包含SPI模式、波特率、LSB先行、主从模式、单双向模式等等)
在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,通过读取状态寄存器相关的寄存器位可以了解SPI的工作状态。
此外,控制逻辑还负责控制产生SPI中断信号、DMA信号及控制NSS信号线。
在实际应用中,我们一般不使用STM32 SPI外设的标准NSS信号线,而是更简单的使用普通的GPIO,软件控制它的电平输出,从而实现通讯起始及停止信号。
STM32的SPI通讯过程:
STM32使用SPI外设通讯时,在通讯的不同阶段它会对“状态寄存器SR”的不同数据位写入参数,因此,我们可以通过读取这些寄存器标志来了解通讯状态。
以“主模式”为例:
(1)控制NSS信号线,产生起始信号
(2)将要发送的数据写入到“数据寄存器DR”中,该数据会被存储到发送缓冲区
(3)通讯开始,SCK时钟开始运行。MOSI将发送缓冲区中的数据一位一位地传输出去;MISO则将数据一位一位存储到接收缓冲区中。
(4)当发送完一帧数据时,“状态寄存器SR”中的“TXE标志位”会被置1,表示传输完一帧,发送缓冲区已空;当接收完一帧数据时,“RXNE标志位”被置1,表示传输完一帧,接收缓冲区非空。
(5)待“TXE标志位”为1(即发送完一帧数据时),若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;待“RXNE标志位”为1时,通过读取“数据寄存器DR”可以获取接收缓冲区中的内容。
(6)若使能了TXE或EXNE中断,TXE或RXNE置1时会产生SPI中断信号,进入同一个中断服务函数,到SPI中断服务程序后,可通过检查寄存器位了解为哪个事件,再分别进行处理。也可以使用DMA方式收发“数据寄存器DR”中的数据。
参考资料:原子和野火的相关资料