当前位置: 首页 > news >正文

STM32的SPI通信

1 SPI协议简介

SPI(Serial Peripheral Interface)协议是由摩托罗拉公司提出的通信协议,即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间,使用于对通信速率要求较高的场合。

1.1 SPI物理层

SPI通信设备之间的常用连接方式如下图所示:

SPI通信使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为SS,它们的作用介绍如下:

  1. SS(Slave Select):从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下用NSS表示。当有多个SPI从设备与SPI主机相连时,设备的其他信号线SCK、MOSI、及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同使用这3条总线;而每个从设备都有独立的一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。IIC协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通信;而SPI协议中没有地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,主机便可以开始与被选中的从设备进行SPI通信。所以SPI通信以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。
  2. SCK(Serial Clock):时钟信号线,用于通信数据同步。它由通信主机产生,决定了通信的速率。不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为f_{pclk}/2。两个设备通信时,通信速率受限于低速设备。
  3. MOSI(Master Output,Slave Input):主设备输入/从设备输出引脚。主机从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
  4. MISO(Master Input,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机由这条信号线输出到主机,即这条线上数据的方向为从机到主机。

1.2 SPI协议层

与IIC类似,SPI协议定义了通信的起始和停止信号、数据有效性、时钟同步等环节。

1.2.1 SPI基本通信过程

先看看SPI通信的通信时序,如下图所示:

这是一个主机的通信时序。NSS、SCK、MOSI信号都由主机控制产生,而MISO的信号由从机产生、主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期,MOSI和MISO传输一位数据。

1.2.2 通信的起始和停止信号

以上通信流程中包含的各个信号分解如下:

在标号①处,NSS信号由高变低,是SPI通信的起始信号。NSS是每个从机各自独占的信号线,当从机在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通信。在标号⑥处,NSS信号由低变高,是SPI通信的停止信号,表示本次通信结束,从机的选中状态被取消。

1.2.3 数据有效性

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

观察图中②③④⑤标号处,MOSI及MISO的数据在SCK的上升沿器件变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻,MOSI及MISO的数据有效,高电平时表示数据“1”,低电平时表示数据“0”,在其他时刻,数据无效,MOSI及MISO为下一次表示数据做准备。

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

1.2.4 CPLO/CPHA及通信模式

上面讲述的只是SPI中的一种通信模式,SPI一共有4种通信模式,它们的主要区别是总线空闲时SCK的时钟状态以及数据采样时刻。为方便说明,在此引入“时钟极性CPOL”和“时钟相位CPHA”的概念。

时钟极性CPOL是指SPI通信设备处于空闲状态时,SCK信号线的电平信号(即SPI通信开始前、NSS线为高电平时SCK的状态)。CPOL=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的影响,数据信号在SCK的偶数边沿被采样。

由于CPLO及CPHA的不同状态,SPI分成了4种模式,见下表所示。主机与从机需要工作在相同的模式下才可以正常通信,实际中采用较多的是“模式0”与“模式3”。

——未完待续——

http://www.lryc.cn/news/387285.html

相关文章:

  • 机器学习引领教育革命:智能教育的新时代
  • 6月29日,每日信息差
  • SpringCloud中复制模块然后粘贴,文件图标缺少蓝色方块
  • JS乌龟吃鸡游戏
  • 第十节:学习ConfigurationProperties类来配置pojo实体类参数(自学Spring boot 3.x的第二天)
  • 如何学习Node.js
  • 云计算基础知识
  • 基于单片机光纤测距系统的设计与实现
  • python项目实战——人生重开模拟器
  • 小时候的子弹击中了现在的我-hive进阶:案例解析(第18天)
  • 电影票房预测管理系统设计
  • 正则表达式与Pyhton
  • Transformer常见面试题
  • Linux——vim的配置文件+异常处理
  • node mySql 实现数据的导入导出,以及导入批量插入的sql语句
  • Webpack: 底层配置逻辑
  • 数字图像处理期末复习题1
  • poi-tl 生成 word 文件(插入文字、图片、表格、图表)
  • centos上部署Ollama平台,实现语言大模型本地部署
  • Java学习 - Redis Redigo简单介绍
  • 【鸿蒙学习笔记】ArkTS组件 Blank
  • 如何使用Spring Boot进行单元测试
  • 2024steam夏促商店打不开、steam活动加载不了解决方法一览
  • IPC进程通信:QNX
  • OpenCV学习之cv2.imshow()函数
  • Oracle、MySQL、PostGreSQL、SQL Server-空值
  • python pip详解1
  • Linux常用命令大全(超详细!!!)
  • TDD测试驱动开发
  • huggingface镜像站