文章目录

  • 一、SPI简介
  • 二、物理层
  • 三、协议层
    • 3.1 通讯的起止
    • 3.2 数据的有效性
    • 3.3 CPOL/CPHA及通讯模式
  • 四、SPI架构剖析
    • 4.1 通讯引脚
    • 4.2 时钟控制逻辑
    • 4.3 数据控制逻辑
    • 4.4 整体控制逻辑
  • 五、通讯过程

记录SPI学习笔记

一、SPI简介

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

二、物理层

SPI通讯使用 3 条总线及片选线,3条总线分别为 SCK、MOSI、MISO。片选线为 SS。
1)SS:(Slave Select)从设备选择信号线,常称为片选信号线.也称为 NSS、CS。当有多个 SPI从设备与 SPI主机相连时,设备的其它信号线 SCK、MOSI及 MISO同时并联到相同的 SPI总线上,即无论有多少个从设备,都共同只使用这 3条总线; 而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线 I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 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):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

三、协议层

与 I2C的类似,SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
NSS、SCK、MOSI 信号都由主机控制产生,而 MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 NSS 为低电平的时候才有效,在 SCK的每个时钟周期 MOSI和 MISO传输一位数据。

3.1 通讯的起止

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

3.2 数据的有效性

SPI使用 MOSI及 MISO信号线来传输数据,使用 SCK信号线进行数据同步。MOSI及MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB 先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI通讯设备之间使用同样的协定,一般都会采用图 25-2 中的 MSB先行模式。
在 SCK 的下降沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI及 MISO为下一次表示数据做准备。
SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

3.3 CPOL/CPHA及通讯模式

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

SPI模式 CPOL CPHA 空闲时钟SCK时钟 采样时刻
0 0 0 低电平 奇数边沿
1 0 1 低电平 偶数边沿
2 1 0 高电平 奇数边沿
3 1 1 高电平 偶数边沿

时钟极性 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 的有效信号才发生切换。

四、SPI架构剖析

4.1 通讯引脚

其中 SPI1 是 APB2上的设备,最高通信速率达 36Mbtis/s,SPI2、SPI3 是 APB1上的设备,最高通信速率为 18Mbits/s。注意挂载的总线。
其中 SPI3用到了下载接口的引脚,这几个引脚默认功能是下载,第二功能才是 IO 口,如果想使用 SPI3 接口,则程序上必须先**禁用掉这几个 IO 口的下载功能。**一般在资源不是十分紧张的情况下,这几个 IO 口是专门用于下载和调试程序,不会复用为 SPI3。

4.2 时钟控制逻辑

4.3 数据控制逻辑

SPI的 MOSI及 MISO 都连接到数据移位寄存器上。数据移位寄存器的数据来源及目标接收、发送缓冲区以及 MISO、MOSI 线。
通过写 SPI的“数据寄存器 DR”把数据填充到发送 F 缓冲区中,通讯读“数据寄存器 DR”,可以获取接收缓冲区中的内容。
数据帧长度可以通过“控制寄存器 CR1”的“DFF 位”配置成 8位及 16位模式;配置“LSBFIRST位”可选择 MSB 先行还是 LSB 先行。

4.4 整体控制逻辑

整体控制逻辑负责协调整个 SPI 外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的 SPI 模式、波特率、LSB先行、主从模式、单双向模式等等,
在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生 SPI 中断信号、DMA 请求及控制NSS 信号线。
实际应用中,我们一般不使用 STM32 SPI外设的标准 NSS 信号线,而是更简单地使用普通的 GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。

五、通讯过程

  1. 控制 NSS信号线,产生起始信号;
  2. 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;
  3. 通讯开始,SCK 时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中;
  4. 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
  5. 等待到“TXE标志位”为1时,若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;等待到“RXNE 标志位”为 1时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容。

stm32学习第十四天相关推荐

  1. STM32学习心得十九:电容触摸按键实验及相关代码解读

    记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...

  2. STM32学习心得十八:通用定时器基本原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容: 1) 三种定时器分类及区别: 2) 通用定时器特点: 3) 通用定时器工作过程: 4) 实验一:定时器中断实验补充知识及部代码解读: 6) 实验二:定时器PWM输 ...

  3. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  4. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  5. python学习[第十四篇] 文件的输入与输出

    python学习[第十四篇] 文件的输入与输出 标准文件类型 一般来说只要程序一执行,就会访问3个文件: 标准输入(键盘) stdin 标准输出(显示器缓冲区) stdout 默认输出到屏幕 标准错误 ...

  6. 花书+吴恩达深度学习(十四)卷积神经网络 CNN 之经典案例(LetNet-5, AlexNet, VGG-16, ResNet, Inception Network)

    目录 0. 前言 1. LeNet-5 2. AlexNet 3. VGG-16 4. ResNet 残差网络 5. Inception Network 如果这篇文章对你有一点小小的帮助,请给个关注, ...

  7. JavaScript学习(十四)—元素节点关系和特殊节点

    JavaScript学习(十四)-元素节点关系和特殊节点 一.元素节点 (1).parentElement: 获取某元素的父元素,它和parentNode的区别是parentElement获取到的值时 ...

  8. Java基础学习——第十四章 网络编程

    Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...

  9. C++语言学习(十四)——C++类成员函数调用分析

    C++语言学习(十四)--C++类成员函数调用分析 一.C++成员函数 1.C++成员函数的编译 C++中的函数在编译时会根据命名空间.类.参数签名等信息进行重新命名,形成新的函数名.函数重命名的过程 ...

最新文章

  1. java 大文件 md5_使用Java为大文件生成MD5非常慢
  2. 2 JVM 运行机制
  3. 一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用
  4. 建行计算机招聘考试考什么,银行招聘考试考什么
  5. selenium 验证码_selenium自动化测试之验证码处理
  6. Python-装饰器进阶
  7. Linux tcp数据分节接收,TCP的建立和终止 图解
  8. RGB在线取色器,可视化三通道颜色
  9. java 支付宝转账_支付宝单笔转账到支付宝账户 Java
  10. python控制摄像头云台_python-onvif实现客户端控制相机云台
  11. jndi step by step(2)
  12. 洛谷P8255 解法 2020328
  13. Django的Forms.py
  14. c语言判断utf-8中文字符串,C语言中判断一个char*是不是utf8编码分享
  15. python读json文件数组_如何在python中从json文件读取json对象数组
  16. Ubuntu 21.04 虚拟机设置共享文件夹
  17. RGB颜色转HEX进制与单位换算
  18. java 合并两个List并去掉重复项
  19. 毛线剪藏(MaoXian Web Clipper)的安装、设置和使用
  20. 探索Android 9.0 Pie新特性变更

热门文章

  1. 简单14招助你玩转QQ空间
  2. C语言奇妙之旅_发展历史
  3. 品读国学经典之一——管仲《牧民》
  4. Python格式化输出10进制和16进制
  5. mysql的第一次作业_数据库入门第一次作业 - osc_2frf70qv的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 2020年中国大学生程序设计竞赛(CCPC) - 网络选拔赛部分题解
  7. 数据库SQL外键设置
  8. 趣谈 iOS Universal Link
  9. WebRTC:如何编译Windows版本的WebRTC(M66)
  10. SQL重复记录处理(查找,过滤,删除) 1