STM32单片机SPI通信详解

文章目录

1. SPI通信概述

2. 硬件电路

3. 移位示意图

4. SPI时序基本单元

5. SPI时序

6. Flash操作注意事项

7. SPI外设简介

8. SPI框图

9. SPI基本结构

10. 主模式全双工连续传输

11. 非连续传输

12. 软件/硬件波形对比

13. 代码示例


1. SPI通信概述

SPI(Serial Peripheral Interface)和I2C一样,都是实现主控芯片和外挂芯片之间的数据交流。

I2C 与 SPI 的比较

I2C的缺点:

  • 驱动能力差: I2C接口由于线路上拉电阻的电路结构,使得通信总线的驱动能力较弱。当通信线路电压较高时,电阻上的损耗就越大,限制了I2C的最大通信速度。在标准模式下,I2C的最高时钟频率仅为100kHz,相比于SPI要慢得多。

SPI的优点:

  • 传输速度高: SPI在设计上更注重速度,其设计简单且灵活,能够支持更高的传输速率。

 

SPI是一种串行同步通信协议。它通过四根通信线(SCK、MOSI、MISO、SS)进行数据传输。

  • 全双工: SPI支持全双工通信,可以同时进行数据发送和接收。
  • 多设备支持: SPI支持多设备挂载(主多从),但不支持多主多从。
  • 时钟线: SPI使用一根时钟线(SCK)来提供时钟信号。数据的输出和输入都在SCK的上升沿或下降沿进行,由主机提供时钟信号,数据接收由从机来完成。

SPI通信线

  • SCK(Serial Clock): 提供时钟信号,由主机控制。数据传输依赖于SCK的时钟信号。
  • MOSI(Master Out Slave In): 主机输出,从机输入。用于主设备向从设备发送数据。
  • MISO(Master In Slave Out): 从机输出,主机输入。用于从设备向主设备发送数据。
  • SS(Slave Select): 片选信号,用于选择从设备。每个从设备都有一个独立的SS线,通过拉低SS信号来选择相应的从设备进行通信。

SPI通信线别称

  • SCK: SCLK, CLK, CK
  • MOSI: MI, SIO, DO(Data Output)
  • MISO: DI(Data Input)
  • SS: NSS(Not Slave Select), CS(Chip Select)

时序和数据传输

  • 无应答机制: SPI没有应答机制,这意味着主机发送的数据没有确认信号,数据传输的完整性和正确性需要其他手段保障。
  • 时钟信号同步: SPI通信依赖时钟信号(SCK)进行数据同步,确保数据位在SCK的时钟沿(上升沿或下降沿)传输。

2. 硬件电路

三个从机,所以SS线需要3根,再加SCK,MOSI,MISO,就是六根。SPI所有通信线都是单端信号,它们的高低电平都是相对GND的电压差,所以单端信号的所有设备还需要共地,如果从机没有独立供电的话,主机还要额外引出电源VCC,给从机供电。

从机选择:主机的SS线都是输出,从机都是输入,SS线是低电平有效,主机想指定谁就把对应的SS输出线置低电平,其它置高,和指定的通信完成后再置回高电平。同一时间,主机只能置一个SS为低电平,只能选中一个从机。

SPI引脚配置:因为输入输出不会冲突所以输出引脚配置为推挽输出,高低电平都有很强的驱动能力,这使得SPI引脚信号的下降沿和上升沿非常迅速,可以达到MHZ的高速传输,I2C下降沿迅速,上升沿缓慢。如图SPI与I2C边沿示意图

SPI冲突点:MISO引脚,主机一个输入,但是从机三个全都是输出,如果三个从机始终都是推挽输出,势必会导致冲突,所以SPI协议规定,当从机的SS引脚为高电平时,也就是从机未被选中时,它的MISO引脚,必须切换为高阻态(相当于引脚断开,不输出任何电平),防止一条线有多个输出而导致的电平冲突问题。在SS为低电平时,MISO才允许变为推挽输出,从机会自动切换,写主机程序不用管。

3. 移位示意图

图中的移位示意图展示了主机和从机的数据交换过程。在每个时钟周期,主机和从机的移位寄存器都会同步向左移动一位,完成数据交换。 

移位操作:

  • SPI传输时,数据是通过移位寄存器进行传输的。主机和从机各自的移位寄存器在每个时钟脉冲时都会向左移动一位。
  • 主机的移位寄存器将数据通过MOSI引脚从左边移出,并输入到从机的移位寄存器的右边。同时,从机的移位寄存器的数据通过MISO引脚从右边移出,输入到主机的移位寄存器的左边。
  • 这一过程在每个SCK时钟周期的下降沿或者上升沿进行(取决于SPI模式)。

具体操作:

  • 主机发送数据: 当SCK时钟信号产生时,主机的移位寄存器将最高位的数据通过MOSI引脚输出到从机。
  • 从机接收数据: 从机的移位寄存器同步接收这个数据,并将其存入自己的移位寄存器中。同时,从机的移位寄存器也将数据通过MISO引脚发送回主机。
  • 双向通信: 通过这样的交替传输,SPI实现了同时发送和接收数据的功能。

4. SPI时序基本单元

起始条件:SS从高电平切换到低电平

终止条件:SS从低电平切换到高电平

交换一个字节(模式0)

CPOL=0:空闲状态时,SCK为低电平

CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

SPI 模式0 (CPOL=0, CPHA=0):

  • CPOL=0: 空闲状态时,SCK 线保持低电平。
  • CPHA=0: SCK 的第一个边沿(上升沿)用于将数据移入,第二个边沿(下降沿)用于移出数据。
  • 在这种模式下,数据的传输和接收都是在时钟信号的第一个边沿开始进行的。

数据传输过程:

  • 在 SCK 的第一个上升沿,主机将数据从 MOSI 线发送到从机,同时从机将数据从 MISO 线发送到主机。数据传输是在时钟信号的上升沿开始,而数据采样则是在下降沿进行的。
  • 具体步骤如下:
    1. SCK 上升沿(第一个边沿): 主机和从机的数据移位寄存器中的最高位 (B7) 开始传输。
    2. SCK 下降沿(第二个边沿): 数据传输完成,主机和从机在下降沿采样数据。
    3. 数据移位: 每个 SCK 周期,数据寄存器中的数据位都会左移一位,准备下一个数据位的传输。这个过程会持续 8 次,直到一个字节的数据完全传输。

同步数据交换:

  • 图示展示了主机和从机在同一个 SCK 时钟周期内的数据交换过程。主机在每个时钟周期将数据通过 MOSI 线发送,同时通过 MISO 线接收从机发送的数据。
  • 示例: 主机发送的数据是 "10101010",从机发送的数据是 "01010101"。在第一个时钟周期,主机的 B7 和从机的 B7 同时传输。在下一个时钟周期,B6 被传输,依此类推,直到 B0。

SPI 有四种模式 (Mode 0 到 Mode 3),由 CPOL 和 CPHA 两个参数决定。每种模式定义了时钟极性和相位的不同组合,适应不同的应用场景。

交换一个字节(模式1)

CPOL=0:空闲状态时,SCK为低电平

CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

Mode 1 (CPOL=0, CPHA=1): SCK 的第一个边沿(上升沿)移出数据,第二个边沿(下降沿)移入数据。

交换一个字节(模式2)

CPOL=1:空闲状态时,SCK为高电平

CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

Mode 2 (CPOL=1, CPHA=0): 空闲状态时 SCK 为高电平,下降沿移入数据,上升沿移出数据。

交换一个字节(模式3)

CPOL=1:空闲状态时,SCK为高电平

CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

Mode 3 (CPOL=1, CPHA=1): 空闲状态时 SCK 为高电平,下降沿移出数据,上升沿移入数据。

5. SPI时序

发送指令

向SS指定的设备,发送指令(0x06)(模式0)

指定地址写

向SS指定的设备,发送写指令(0x02),随后在指定地址(Address[23:0])下,写入指定数据(Data)

指定地址读

向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data)

W25Q64 的地址指针和数据传输

  • W25Q64 芯片具有 8M 字节的存储空间,一个字节的 8 位地址显然不够用,因此采用 24 位地址,即三个字节传输。SPI 和 I2C 一样,地址指针每次读写一个字节后自动加 1。这样可以实现从指定地址开始,连续写入多个字节数据。SPI 没有应答机制,发送一个字节后紧接着发送下一个字节。通信中,接收的 MISO 线路保持空闲,只有主机发送时才有数据传输。

SPI 命令传输模式

  • W25Q64 的操作遵循特定的命令流,类似于 I2C 的有数据流。SPI 通过发送指令来控制数据读写。首先,主机发送一个操作指令,指令后面紧跟地址和数据。每个指令定义了一组特定的操作,手册中详细列出了指令集。不同的指令可以有不同的功能,读写时需要先发送指令,然后是地址,最后是数据。

6. Flash操作注意事项

写入操作时:

  1. 写入操作前,必须先进行写使能
    • 为了防止误操作,类似于手机先解锁再使用,写入前必须启用写使能,以避免误操作。
  2. 每个数据位只能由1改写为0,不能由0改写为1
    • 由于Flash的特性,数据只能从高变低,不能从低变高。因此在写入数据前需要先执行擦除操作。
  3. 写入数据前必须先擦除
    • 擦除后,所有数据位都变为1。擦除操作是最小单位为扇区。
  4. 连续写入多字节时,最多写入一页的数据,超过页面尾位置的数据,会回到页面首覆盖写入
    • 一个写入时序最多只能写一页的数据,超过一页的数据会覆盖页面首部。
  5. 写入操作结束后,芯片进入忙状态,不影响新的读写操作
    • 写入结束后芯片会显示忙(BUSY=1),此时暂时不能写入,需要等待芯片不忙再进行写入。

读取操作时:

  1. 直接调用读取时序,无需使能,无需额外操作,没有页的限制
    • 读取操作不需要任何额外操作和限制,可以直接读取数据。
  2. 读取操作结束后不会进入忙状态,但不能在忙状态时读取
    • 读取操作结束后不会使芯片进入忙状态,但在芯片忙时不能进行读取操作。

写操作详解:

  1. 防止误操作,类似手机先解锁再使用
    • 写入前需要写使能命令,防止误操作。
  2. Flash不像RAM一样可以直接覆盖之前写入的数据
    • Flash只能实现1变0,不能实现0变1,所以写入前需要擦除。
  3. 擦除操作是最小擦除单位进行
    • 可以选择整个芯片擦除、按块、按扇区擦除等。最小擦除单位为扇区。
  4. 每个扇区有4096字节
    • 如果需要修改特定字节,需要将所在扇区整个擦除,再重新写入。
  5. 写入时序最多只能写一页的数据
    • 一页有256字节,写入超过256字节的数据会覆盖页面首部。
  6. Flash写入太快会导致数据丢失
    • 写入操作前需要擦除并进入忙状态,等待完成再写入。这样可以保证数据的正确写入。

例子:

  • 例如一个Flash扇区为4KB(4096字节),在写入数据前需要擦除整个扇区,才能写入数据。
  • 如果想修改0x00这个字节,需要擦除整个扇区,然后再将新的数据写入。
  • 为了防止数据丢失,可以将要修改的扇区数据先读出放到RAM中,修改后再写入Flash。

7. SPI外设简介

STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担

可配置8位/16位数据帧、高位先行/低位先行

时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)

支持多主机模型、主或从操作

可精简为半双工/单工通信

支持DMA

兼容I2S协议

STM32F103C8T6 硬件SPI资源:SPI1、SPI2

8. SPI框图

移位寄存器的操作

  • 右移过程:数据从低位一位一位地通过MOSI移出去,同时通过MISO一位一位地移入到数据高位。
  • 控制位:移位寄存器的状态由LSBFIRST(帧格式控制位)控制。
    • LSBFIRST = 0:先发送MSB(高位)。
    • LSBFIRST = 1:先发送LSB(低位)。

数据寄存器

  • 发送缓冲区(TDR)和接收缓冲区(RDR)
    • TDR:用于发送数据。
    • RDR:用于接收数据。
    • 这两个寄存器占用同一个地址,统一称为DR。

实现连续数据流

  • 发送数据流
    • 首先,将数据写入TDR。
    • 当移位寄存器空闲时,TDR的数据转移到移位寄存器,开始移位。
    • 转移时置TXE(发送寄存器空标志位)为1,表示可以继续写入下一个数据到TDR。
  • 接收数据流
    • 数据通过MISO移入移位寄存器。
    • 数据移入完成后,整体转移到RDR,同时置RXNE(接收寄存器非空标志位)为1,表示可以读取数据。

9. SPI基本结构

10. 主模式全双工连续传输

连续传输传输更快,但是操作复杂

11. 非连续传输

非连续传输好处容易封装,好理解,好用

12. 软件/硬件波形对比

硬件数据波形变化紧贴SCK边沿 软件数据变化在边沿后有些延迟。

I2C:SCL低电平期间数据变化,高电平期间数据采样 SPI:SCK下降沿数据移出,上升沿数据移入。 两者最终波形的表现形式都是一样的,无论是下降沿变化还是低电平期间变化,它们都 是一个意思,都可以作为数据变化的时刻。

13. 代码示例

STM32通过SPI软件读写W25Q64

STM32通过SPI硬件读写W25Q64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

keepalived高可用,LVS+keepalived的实现

概述: keepalived是集群高可用的一个技术,它是一个软件,与网络技术中VRRP协议的实现相类似,都是在若干个服务集群后虚拟出的一个对外提供服务的VIP(Virtual IP),即虚拟IP,当某一台服务器发生故障时&#x…

腾讯云API安全保障措施?有哪些调用限制?

腾讯云API的调用效率如何优化?怎么使用API接口发信? 腾讯云API作为腾讯云提供的核心服务之一,广泛应用于各行各业。然而,随着API应用的普及,API安全问题也日益突出。AokSend将详细探讨腾讯云API的安全保障措施&#x…

Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

shell命令 ls -al 实现 #include <43func.h> void error_check(int ret, const char *msg) {if (ret -1) {perror(msg);exit(EXIT_FAILURE);} }char get_file_type(mode_t mode) {if (S_ISREG(mode)) return -;//检查给定的文件模式&#xff08;通常是从 stat 或 lst…

数据结构—排序、查找、图论和字符串算法之Java实例

一&#xff1a;引言 在编程的海洋中&#xff0c;算法是程序员的灵魂之光。它们不仅指引着代码的前进方向&#xff0c;更能解决难题&#xff0c;提升效率。虽然各式各样的算法琳琅满目&#xff0c;但其中有一些却是每位程序员必定会遇到且应当深刻掌握的。本文将带您走进这些至…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

【arm扩容】docker load -i tar包 空间不足

背景&#xff1a; 首先我在/home/nvidia/work下导入了一些镜像源码tar包。然后逐个load进去。当我 load -i dev-aarch64-18.04-20210423_2000.tar包的时候&#xff0c;出现 Error processing tar file(exit status 1): write /9818cf5a7cbd5a828600d9a4d4e62185a7067e2a6f2ee…

【每日刷题】Day71

【每日刷题】Day71 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 牛群分隔 2. 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 3. 791. 自定义字符串排序 -…

C语言 | Leetcode C语言题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; int majorityElement(int* nums, int numsSize) {int ans 0;for (int i 0, cnts 0; i < numsSize; i) {if (nums[i] ans) {cnts;} else if (cnts 0) {ans nums[i];} else {cnts--;}}return ans; }

数据结构经典面试之数组——C#和C++篇

文章目录 1. 数组的基本概念与功能2. C#数组创建数组访问数组元素修改数组元素数组排序 3. C数组创建数组访问数组元素修改数组元素数组排序 4. 数组的实际应用与性能优化5. C#数组示例6. C数组示例总结 数组是编程中常用的数据结构之一&#xff0c;它用于存储一系列相同类型的…

基于.NET开源跨平台的文档管理系统

前言 今天大姚给大家分享一款基于.NET8开源&#xff08;MIT License&#xff09;、免费、跨平台的文档管理系统&#xff1a;Dorisoy.Pan。 官方项目介绍 Dorisoy.Pan是一款基于.NET8开源&#xff08;MIT License&#xff09;、免费、跨平台文档管理系统&#xff0c;使用MS S…

CDP问卷的目的是什么?CDP问卷对企业有什么好处

CDP问卷&#xff08;Carbon Disclosure Project问卷&#xff09;的目的是多方面的&#xff0c;主要包括以下几点&#xff1a; 推动透明度&#xff1a;CDP问卷要求企业公开披露其温室气体排放数据、减排目标和行动&#xff0c;以及气候风险管理策略等信息。这有助于增强企业的透…

并发锁机制

JDK1.6 synchronized &#xff08;底层是由C实现的&#xff09;&#xff1a; synchronized: 互斥锁&#xff0c;悲观 锁&#xff0c;同步锁&#xff0c;重量级锁&#xff08;耗性能&#xff09;&#xff0c;多线程使用重量级锁很容易发生线程阻塞&#xff0c;因为涉及到多个线程…

华为数通——OSPF

正掩码&#xff1a;/24 255.255.255.0 反掩码&#xff1a; 255.255.255.255 -255.-255.-255.0 0.0.0.255 例如掩码&#xff1a;255.255.252.0 反掩码&#xff1a;0.0.3.255 在反掩码里面&#xff0c;0 bit 表示精确匹配&#xff0c;1…

养车小程序系统源码,汽修源码,仿途虎养车系统源码,车辆保养小程序系统

用户端&#xff0b;商家端&#xff0b;师傅端 功能介绍: 支持下单上门服务、到店核销&#xff0c;支持单独选择项目、 也支持选择服务人员、和选择门店多种下单方式&#xff0c; 支持上门服务和到店核销两种服务方式&#xff0c;支持自营和多商家联营两种运营模式&#xff…

uni-app中的css3选择器使用

2.给 view 添加样式 .box view{ font-size: 40upx; color: #8A6DE9; } 3.想改变某一个view 样式 .box>view:nth-child(1){ background: #09BB07; } .box>view:nth-child(2){ background: red; } .box>view:nth-child(3){ background: yellow; } 注意&am…

【投稿优惠|稳定出版】2024年体育、健康与食品安全国际学术会议(ICSHFS 2024)

【投稿优惠|稳定出版】2024年体育、健康与食品安全国际学术会议&#xff08;ICSHFS 2024&#xff09; 2024 International Conference on Sports, Health, and Food Safety(ICSHFS 2024) 会议简介&#xff1a; 2024年体育、健康与食品安全国际学术会议&#xff08;ICSHFS 2024…

Java项目学习(员工管理)

新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API&#xff0c;其中每个方法的返回值会直接序列化为 JSON 或…

(纯原创)基于SSM的网上购物平台(完整源代码以及开发文档)

摘要 网上购物和计算机的飞速发展以及人们生活节奏的不断加快&#xff0c;网购已经逐渐融入了人们的日常生活当中&#xff0c;网上商城作为网购一种平台&#xff0c;已被大众逐渐接受。因此开发一个网上商城系统&#xff0c;适合当今形势&#xff0c;更加方便人们在线购物。…

【Unity | Editor强化工具】项目备忘录工具

经常会被美术和策划同事反复询问某几个问题&#xff0c;每次都要翻Wiki链接给他们&#xff0c;非常折磨人&#xff0c;所以做了个可以在Unity内部显示备忘录的小工具&#xff0c;能够减少一些查找成本&#xff08;另外我觉得&#xff0c;让他们养成查看Unity内触手可及的信息的…

2024广东省职业技能大赛云计算赛项实战——编排部署ERP管理系统

编排部署ERP管理系统 前言 编写docker-compose.yaml文件&#xff0c;要求使用镜像mysql、redis、nginx和erp完成ERP管理系统的编排部署。 编写docker-compose.yaml完成ERP管理系统的部署&#xff0c;要求定义mysql、redis、nginx和erp共四个Service&#xff0c;分别使用镜像e…