IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> SPI通信原理 -> 正文阅读

[嵌入式]SPI通信原理

一、SPI概述

SPI是串行外设接口 (Serial Peripheral Interface) 的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。

SPI没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。

二、SPI接线

SPI 接口一般使用 4 条线通信:

  1. MISO 主设备数据输入,从设备数据输出。
  2. MOSI 主设备数据输出,从设备数据输入。
  3. SCLK 时钟信号,由主设备产生。
  4. CS 从设备片选信号,由主设备控制。

SPI允许至少有一个主机,一般都是一个主机多个从机,当只有一个从机时:在这里插入图片描述

这站图来自于STM32参考手册,这个应该是STM双机通讯的接线,而且主机从机都工作在硬件模式(对于双击通讯不太懂),一会儿再聊移位寄存器的原理,现在先看个大概接法。

当有多个从机时,每个从机单独接一个片选信号:
在这里插入图片描述
这个图片很好的描述了主设备与多个从设备的接线

三、SPI 总线四种工作方式

STM32中的SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。

  • CPOL=0:SCLK=0时处于空闲态;CPOL=1:SCLK=1时处于空闲态;
  • CPHA=0:数据采样在第1个边沿;CPHA=1:数据采样在第2个边沿。

CPOL与CPHA各有两种状态,所以可以组成四种不同的工作方式。

为了能让主机与从机正常通讯,主机与从机应当设置为相同的模式,一般从机是出场就固定好的(一般在手册的SPECIFICATIONS->
TIMING CHARACTERISTICS中说明 ),我们要做的就是在SPI初始化时设置成与从机相同的工作方式。至于他不同模式时的时序图,一百度就能搜到,我觉得也不是重点,重点是你能在手册找到从机是哪种工作方式。

四、SPI接口初始化举例

以STM32f103控制的一个从设备的初始化过程来说明:
PB13为CLK,PB14为MISO,PB15为MOSI。

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );	//使能SPI2时钟
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟(SPI线所在的port)
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
	
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式,此处SPI设置为双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置SPI工作模式:设置STM32为主设备
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//当SCLK=1(高电平)时处于空闲态
	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_NSSInternalSoftwareConfig(SPI2,SPI_NSSInternalSoft_Set);//Configures internally by software the NSS pin//软件模式需要配置NSS为1,表示芯片工作在主模式。
	SPI_Cmd(SPI2, ENABLE); //SPI使能

五、主设备NSS的接线

想一下为何上面的初始化这两句什么含义呢?
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)或 软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_NSSInternalSoftwareConfig(SPI2,SPI_NSSInternalSoft_Set);

先来看看参考手册怎么说NSS的:

从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。当配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从模式。——STM32参考手册

反正我看完很晕,但我大致知道,NSS管脚可以配置为输入,也可以配置为输出,NSS有硬件模式和软件模式之分。而且NSS的连接与设备工作在主模式还是从模式有必然联系,我来慢慢讲。

问题1:NSS由“软件”还是“硬件”管理如何确定?
在这里插入图片描述
先看这张图,来自于参考手册。可知 芯片内部的NSS 即与“NSS外部引脚”有关也与“芯片的SPI_CR1寄存器的SSI位和SSM位”有关系,如果SSM置0,则内部NSS由外部NSS引脚电平确定;如果SSM置1,则外部NSS引脚无效,此时内部的NSS电平是由SSI位决定的。这些位的定义如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

五、(1)NSS信号软件模式(最常用):

就是NSS管脚由软件管理,就是stm芯片内部的NSS信号只与芯片的SPI_CR1寄存器有关系,与STM芯片的NSS管脚接啥毫无关系。这时候STM芯片的NSS脚可以当做普通的GPIO口用。
(1)软件模式下把stm32设置为主模式的方法:手册规定将SSM 和SSI 位均置位,体现在库函数上就是第五个标题下面那两行代码。 现在STM设置成主模式了,硬件接线如何连接呢?就如下图所示:

在这里插入图片描述
每个从设备都需要单独连接一个片选信号。

(2)软件模式下把stm32设置为从模式的方法:在NSS软件模式下,将SPI_CR1寄存器中的SSM位置1并清零SSI位。这些要求是我在参考手册找到的,因为没有实际应用,不清楚库函数怎么配置。

从机的软件片选是比较麻烦的。因为,从机的内部NSS电平是由从机CR1寄存器的SSI位决定的。同时,如果从机选择了软件片选,那么原本可以复用成SPI_CS的引脚也和普通引脚没有区别了。在标准库中,有一个函数是:SPI_NSSInternalSoftwareConfig(User_SPI,SPI_NSSInternalSoft_Reset)。这个函数就是用来控制CR1寄存器的SSI位的。这就很明显了,我们可以随便指定从机的一个GPIO口与主机的片选引脚连接,使能外部边沿中断,在中断中判断如果拉低就调用上述函数将从机内部NSS拉低以片选,反之则取消片选。——大佬博客

【注】:上面两种方法只是说明了在软件模式时,设置STM32为主模式还是从模式时与NSS有关寄存器的不同设置,其他的操作比如:指定数据传输从MSB位还是LSB位开始,设置SPI工作模式设置的相关SPI_CR1寄存器位还要视情况操作。还有一般STM32都做主模式使用,从模式用到了再做补充。

五、(2)NSS信号硬件模式:

就是NSS管脚由外部NSS引脚管理。而最让人困惑的是NSS引脚还可以设置为输入模式和输出模式,通过SPI_CR2的SSOE位进行设置。
在这里插入图片描述

(1)硬件模式下把stm32设置为主模式的方法
NSS引脚工作在输入模式设置为主模式(不常用):SSOE=0,在外部NSS引脚为高电平,即内部NSS引脚也为高电平时,才能进行数据传输。 当只有一个主设备一个从设备时,可将主设备的NSS直接接到高电平。SPI的从设备片选信号是有时序的,片选的由高到低,才是通讯的开始,所以从设备还需要主设备的一个GPIO连接到从设备的片选端。通过上图可知,此时可以工作在多主设备模式,这个情况百度都百度不到,应用很少(用到再说)。
NSS引脚工作在输出模式:SSOE=1, 外部NSS引脚会输出低电平,使能从设备,进行数据传输。 不需要额外的GPIO引脚就能控制从设备。
在这里插入图片描述
NSS引脚工作在输出模式设置为主模式:当STM32F10xxx工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时主机的NSS讲作为输出信号,引脚信号被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的STM32F10xxx SPI设备,将自动变成从SPI设备。此时两个的NSS信号线可以接个上拉电阻直连。(来自大佬博客,好多没用到的不太理解)

(2)硬件模式下把stm32设置为从模式的方法(最常用):
NSS引脚工作在输入模式设置为从模式:只需要SSM置0,此处要注意从机设置成硬件片选要复用SPI对应的4个GPIO口。并且想要stm32工作在从模式,硬件模式下NSS只能在输入模式。

总结:就是主机一般选用软件模式,NSS信号来自由内部寄存器,外部NSS管脚可做普通IO端口使用,从机一般选用硬件NSS为输入模式。

六、SPI数据交换原理

图片来源于https://blog.csdn.net/as480133937/article/details/105764119

多亏这几个高质量的博客:
【SPI一般步骤】
【STM32实现SPI双机通信】
【SPI的NSS的讨论】
【SPI的NSS的讨论2】

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:06:30  更:2021-07-17 12:07:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:22:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码