STM32常用协议之SPI协议详解


SPI协议简介

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


一、SPI物理层

在这里插入图片描述

  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基本通信过程

在这里插入图片描述
上图为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的时序图:
在这里插入图片描述
首先,根据 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的时序图
在这里插入图片描述
由上图可知,不受CPOL的影响,MOSI及MISO数据有效信号在SCK的偶数边沿保持不变,故数据信号在SCK的偶数边沿被采样。


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

在这里插入图片描述

三、编程实现

// 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显示:
    在这里插入图片描述

逻辑分析仪显示:
在这里插入图片描述

  • 字符A

  • OLED显示
    在这里插入图片描述

  • 逻辑分析仪显示
    在这里插入图片描述
    这里,箭头所指的‘00’是指,字符串结束标志’\0’。
    在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
由FLASH手册及逻辑分析仪数据读取的截图可知,主机发送读取指令03H,接下来发送3字节地址信息【FF FF 9C】,然后再进行数据读取。


总结

  1. SPI协议是高速全双工的同步通信协议;
  2. 要注意SPI四种时序的区分,只在信号稳定期进行采样;
  3. 协议贵在实践,而非梳理,梳理只是为了简要理解协议形成大体框架而已;
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407是一款基于ARM Cortex-M4内核的微控制器系列,它具备了丰富的外设功能,其中包括了SPI(串行外围设备接口)。SPI是一种串行通信协议,用于在微控制器和外部设备之间进行数据传输。 STM32F407的SPI模块具备以下特点和功能: 1. SPI接口数量:STM32F407微控制器通常配备了多个SPI接口,每个接口都有自己的引脚。 2. SPI模式:SPI接口支持多种工作模式,包括主模式和从模式。在主模式下,STM32F407充当主设备,负责控制数据传输;在从模式下,STM32F407作为从设备接收和发送数据。 3. 数据帧格式:SPI接口支持多种数据帧格式,包括8位、16位等。可以根据外部设备的要求选择合适的数据帧格式。 4. 时钟极性和相位:SPI接口的时钟极性和相位可配置,以适应不同的外部设备。时钟极性定义了时钟信号的空闲状态,相位定义了数据传输的起始边沿。 5. 传输速率:SPI接口支持灵活的传输速率配置,可以根据需要选择合适的时钟频率。 6. 中断和DMA支持:STM32F407的SPI模块支持中断和DMA传输,可以提高数据传输的效率和可靠性。 在使用STM32F407的SPI接口时,通常需要按照以下步骤进行配置: 1. GPIO配置:根据SPI接口的引脚定义,将相应的引脚配置为SPI功能。 2. SPI初始化:通过SPI寄存器配置,设置SPI接口的工作模式、数据帧格式、时钟极性和相位等参数。 3. 使能SPI:使能SPI接口,开始数据传输。 4. 数据传输:根据需要,使用SPI发送和接收数据。 除了以上基本操作,还可以根据具体需求进行其他配置,例如中断和DMA传输的配置、多主机模式的配置等。 总结起来,STM32F407的SPI接口是一种强大而灵活的外设,可以与各种外部设备进行高速串行通信。通过合适的配置和操作,可以实现与外设的可靠数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值