STM32常用协议之SPI协议详解

SPI协议详解

  • SPI协议简介
  • 一、SPI物理层
  • 二、SPI协议层
    • 2.1 SPI基本通信过程
    • 2.2 通信的起始和终止信号
    • 2.3 数据有效性
    • 2.4 CPOL/CPHA及通信模式
  • 三、编程实现
  • 四、实践分析
  • 总结


SPI协议简介

SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线, SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。 SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输)。该通信方式主要广泛地使用在ADC、LCD等设备与MCU间,适用于对通信速率要求较高的场合。


一、SPI物理层

STM32常用协议之SPI协议详解_第1张图片

  1. CS/SS(Slave Select/Chip Select),常称为片选信号线。当多个SPI从设备与SPI主机相连时,设备的其他信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同使用这3条总线;但值得注意的是:每个从设备都有独立的一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。区别于IIC协议通过设备地址进行寻址,从而完成与总线上某个设备进行通信方式的不同,SPI协议中没有设备地址,而是使用片选信号线来寻址,当主机要选择从设备时,通常情况下把该设备的片选信号线设置为低电平,从而使得该设备被选中,即片选有效,这样主机便和从设备之间建立通信。
  2. SCK(Serial Clock),时钟信号线,用于通信数据同步,通常由主机产生,但不同设备支持的通信速率不一致,而且值得注意的是:两设备之间通信时,通信速率受限于低速设备。
  3. MOSI/SDO(Master Out Slave In/Serial Data Output),主设备输出/从设备输入引脚,这根数据线只能用于主机向从机发送数据。
  4. MISO/SDI(Master In Slave Out/Serial Data Input),主设备输入/从设备输出引脚,这根数据线只能用户从机向主机发送数据。

二、SPI协议层

2.1 SPI基本通信过程

STM32常用协议之SPI协议详解_第2张图片
上图为SPI的主机通讯时序,NSS、SCK和MOSI信号都由主机控制,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。


2.2 通信的起始和终止信号

  • 起始信号:NSS信号由高变低,即为SPI通讯的起始信号;
  • 终止信号:NSS信号由低变高,即为SPI通讯的终止信号;

2.3 数据有效性

SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的【全双工】。数据传输时,MSB先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用MSB 先行模式

观察上图中的标号2-5处,可知MOSI及MISO的数据在在 SCK 的上升沿期间变化输出【触发】,在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及 MISO 为下一次表示数据做准备。

SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。


2.4 CPOL/CPHA及通信模式

SPI的四种通讯模式,主要区别是总线空闲时,SCK的时钟状态及数据采样时刻。为方便说明,在此引入“时钟极性 CPOL”和“时钟相位 CPHA”的概念。

  • 时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即:SPI通讯开启前,NSS线为高电平时SCK的状态)。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时,则相反。
  • 时钟相位CPHA是指数据的采样时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的“奇数边沿”被采样。当CPHA=1时,数据线在SCK的“偶数边沿”采样。

CPHA=0的时序图:
STM32常用协议之SPI协议详解_第3张图片
首先,根据 SCK 在空闲状态时的电平,分为两种情况。SCK信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。这里,无论CPOL=0还是=1,因为我们配置的时钟相位CPHA=0,在途中可以看到,采样时刻都是在SCK的奇数边沿。注意当CPOL=0的时候,时钟的奇数边沿是上升沿,而当CPOL=1时,时钟的奇数边沿则为下降沿,所以SPI的采样时刻不是由上升/下降沿决定的。而是因为无论是MOSI还是MISO数据线的有效信号在SCK的奇数边沿保持不变,故数字信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。


CPHA=1的时序图
STM32常用协议之SPI协议详解_第4张图片
由上图可知,不受CPOL的影响,MOSI及MISO数据有效信号在SCK的偶数边沿保持不变,故数据信号在SCK的偶数边沿被采样。


SPI的四种工作模式,实际中采用较多的是“模式0”与“模式3”,但值得注意的是:主机与从机需工作在相同的模式下才可以正常通讯。

STM32常用协议之SPI协议详解_第5张图片

三、编程实现

// Reference to 正点原子的代码
void SPI2_Init(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 
	RCC_APB1PeriphClockCmd(	RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能 	
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

 	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;		//串行同步时钟的空闲状态为高电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;	//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式
	SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
	SPI_Cmd(SPI2, ENABLE); //使能SPI外设
	
	SPI2_ReadWriteByte(0xff);//启动传输		 
} 

四、实践分析

通过在想FLASH中分别写入数字5和字符A后读出,然后通过逻辑分析仪进行观察分析。

  • 数字5
    OLED显示:
    STM32常用协议之SPI协议详解_第6张图片

逻辑分析仪显示:
STM32常用协议之SPI协议详解_第7张图片

  • 字符A

  • OLED显示
    STM32常用协议之SPI协议详解_第8张图片

  • 逻辑分析仪显示
    STM32常用协议之SPI协议详解_第9张图片
    这里,箭头所指的‘00’是指,字符串结束标志’\0’。
    在这里插入图片描述


STM32常用协议之SPI协议详解_第10张图片
STM32常用协议之SPI协议详解_第11张图片
由FLASH手册及逻辑分析仪数据读取的截图可知,主机发送读取指令03H,接下来发送3字节地址信息【FF FF 9C】,然后再进行数据读取。


总结

  1. SPI协议是高速全双工的同步通信协议;
  2. 要注意SPI四种时序的区分,只在信号稳定期进行采样;
  3. 协议贵在实践,而非梳理,梳理只是为了简要理解协议形成大体框架而已;

你可能感兴趣的:(STM32基本常用协议,stm32,单片机,嵌入式硬件)