SPI外设简介

SPI外设简介

简介部分

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

  • SPI和I2C都是高位先行,串口是低位先行

  • PCLK是外设时钟,APB2是72MHz、APB1是36MHz

  • SPI1的时钟频率比SPI2的大一倍

  • 如果需要快速大量传输数据,可以使用DMA数据转运,更高效

  • I2S协议主要是数字音频传输协议

框图介绍

在这里插入图片描述

  1. 左上角移位寄存器

    1. 右边的数据低位,一位一位的,从MOSI移出去

    2. 然后MISO的数据一位一位的移入到左边的数据高位

    3. 移位寄存器是一个右移的状态

    4. LSBFIRST标志位可以控制是低位先行还是高位先行

    5. 在这里插入图片描述

    6. 发送缓冲寄存器TDR和接收缓冲寄存器RDR占用同一个地址,统一叫做DR

    7. 发送数据先写入TDR,再转到移位寄存器发送,发送的同时接收数据,等到八位数据从移位寄存器发送完,移位寄存器也移入了8位通过MISO来的数据,接收到的数据转到RDR,置标志位RXNE为1,然后读取数据

    8. 数据寄存器和移位寄存器的配合,可以实现无延迟的连续传输

    9. 发送和接收的寄存器是公用的

  2. 波特率发生器

    1. 主要用来产生SCK时钟的

    2. 内部主要是一个分频器

    3. 经过分频器之后,输出到SCK引脚

非连续传输步骤
  1. 等待TXE为1

  2. 写入发送的数据到TDR

  3. 等待RXNE为1

  4. 读取RDR接收的数据

硬件SPI读写W25Q64编码步骤
  1. 直接在MySPI模块进行修改

  2. 首先SS引脚还是使用软件模拟,所以写SS的函数留着

  3. 然后下面是三个,软件读写SPI通信引脚的函数,可以删掉

  4. 之后,MySPI初始化这里可以全都删掉,替换为SPI外设的初始化、(保留SS引脚的gpio初始化函数)

  5. 软件写SS引脚产生起始和停止信号的可以留着

  6. 之后,交换字节函数里的内容全都删掉,这样软件SPI操作时序的部分,就删完了

  7. 接着写上硬件SPI的代码就好

  8. 硬件SPI的代码其实就两个部分

  9. 第一部在初始化函数里,写上SPI初始化的代码

  10. 第二部分在交换一个字节函数里,写上SPI外设操作时序,完成交换一个字节的流程

在这里插入图片描述

  1. 第一步开启时钟、开启SPI和GPIO的时钟

  2. 第二部初始化GPIO,SCK和MOSI配置为复用推挽输出、MISO是硬件外设的输入信号,配置为上拉输入(因为输入设备可以有多个所以不存在复用输入这个东西,普通GPIO口可以输入,外设也可以输入)

  3. 最后是SS引脚,SS是软件控制的输出引脚,所以配置为通用推挽输出,这就是GPIO口的初始化配置

  4. 第三步配置SPI外设,使用一个结构体选参数即可,调用SPI_Init

  5. 调用SPI_Cmd给SPI使能即可

    在这里插入图片描述

  6. 初始化之后,惨老这个框图,执行运行控制的代码,从而产生交换字节的时序

    1. 首先等待Txe为1

    2. 使用库函数写入DR

    3. 通过发送ByteSend数据,会通过MOSI一位一位的移出去,在MOSI线上,就会自动产生这个发送的时序波形,由于是非连续传输,所以时序产生的这段时间,就不必把下一个数据放到Tdr等着,这段时间直接死等过去就行了,当MOSI移位完成,证明接收移位也完成了,MISO也移入了一个字节的数据到RXE,会置标志位RXNE标志位

    4. 等待RXNE为1,表示收到一个字节,同时也表示发送时序产生完成了

    5. 读取RDR,调用库函数读取RDR

      1. 在这里并不需要向软件一样,手动给SCK、MOSI置高低电平,也不用关心怎么把数据一个一个的取出来,这些工作硬件电路会自动帮我们完成

      2. 注意事项:

        1.这里的硬件SPI,必须是发送,同时接收,要想接收必须要先发送,因为只有给TDR写东西,才会触发时序的产生,如果不发送只调用接收的函数,时序是不会动的

        2.TXE和RXNE是不是会自动清除的问题,上面的图上写的是,TXE标志由硬件置位,并由软件清除、RXNE也是,这个由软件清除就比较迷惑,是不是要求我们,在标志位置1之后,还需要我们手动调用清除标志位的函数,实际上 这个并不需要我们手动清除,手册上状态标志那一节有写

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

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

相关文章

洛谷 P1048 [NOIP2005 普及组] 采药

辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同…

数据持久化 1 - PlayerPrefs

数据持久化 文章目录 数据持久化PlayerPrefs 基本方法存储读取删除 Type补充父子关系通过反射获得泛型类型 PlayerPrefs 基本方法 PlayerPrefs Unity用于存储读取玩家数据的公共类 存储 PlayerPrefs的数据存储类似于键值对存储 提供了3种方法 int float string PlayerPref…

浏览器插件——从开发到部署全流程详解

开发浏览器插件是一个很好的方式来扩展浏览器的功能。不过,需要注意的是,浏览器插件通常是使用JavaScript、HTML和CSS开发的,而不是Python。尽管如此,你可以使用一些工具将Python代码转换为JavaScript,但这通常不是开发…

安装VMware ESXi虚拟机系统

简介:ESXi是VMware公司开发的一款服务器虚拟化操作系统。它能够在一台物理服务器上运行多个虚拟机,每个虚拟机都可以独立运行操作系统和应用程序,而且对硬件配置要求低,系统运行稳定。 准备工具: 1.8G或者8G以上容…

【PDF-XSS攻击】Java项目-上传文件-解决PDF文件XSS攻击

文章目录 背景解决pdfbox依赖控制器代码PdfUtils工具类 验证最后源码参考 背景 上传xss-pdf造成存储型xss因为在浏览器直接预览的PDF,而不是预览,所以安全部门认为会有XSS漏洞 解决 安全部门修复建议 1、根据白名单的标签和属性对数据进行过滤&#…

JAVA之MDC的使用教程

文章目录 MDC简介MDC原理作用整体流程添加MDC依赖配置MDC 基本使用过程 MDC简介 MDC(Mapped Diagnostic Context)是用于分布式系统中跟踪和诊断日志的重要概念。是一个在Java项目中用于日志跟踪的工具,它允许你在多线程环境下关联和传递特定的上下文信息。 MDC是一…

金三银四面试题(十七):MySQL面试都问什么(2)

今天我们继续盘点那些高频的MySQL面试题。 说说InnoDB与MyISAM的区别 InnoDB 支持事务,MyISAM 不支持,对于InnoDB 每一条SQL 语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL 语言放在begin 和comm…

Java 二叉数(1)

一、认识树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 有一个特殊的…

react-router-dom+history路由跳转白屏需手动刷新才显示

搭建一个新项目&#xff0c;路由照常配好了&#xff0c;但是很奇怪&#xff0c;跳转的时候第一次白屏&#xff0c;<root></root>里面只有一个,号&#xff0c;页面是空白的&#xff0c;再手动刷新才显示内容&#xff0c;检查了路由很多遍&#xff0c;也看了地址栏都…

javascript密码验证规则,数字、字母、特殊符号两种以上

在验证密码复杂的正则表达试中&#xff0c;几位码友有发布过从两种字符里选两种的&#xff0c;从三种字符里选有三种的。 今天我提一个从三种里选两种的。有喜欢的朋友拿去用。 密码须包含数字、字母、特殊符号两种以上&#xff0c;且不少于8位&#xff0c;不多于32位。 pass…

IDEA中的Debug功能介绍

说明&#xff1a;本文介绍IDEA中的Debug功能&#xff0c;基于2023.2&#xff08;Ultimate Edition&#xff09;版本 简单介绍 首先&#xff0c;在程序需要停止的所在行号上&#xff0c;鼠标左键&#xff0c;可设置一个断点&#xff0c;是一个红色圆点标志&#xff0c;表示程序…

2024年腾讯云优惠券领取步骤使用教程详解

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始选择使用云服务来提升自己的业务能力和工作效率。腾讯云作为国内领先的云服务提供商&#xff0c;其优质的服务和丰富的资源吸引了大量的用户。为了回馈广大用户&#xff0c;腾讯云经常会推出各种优惠活动&#xf…

nfs部署--相关记录

以下是在 CentOS 8 中将 10.40.111.41 上的 /nfsdata 目录通过 NFS 共享到 10.40.111.43 和 10.40.111.45 的 /nfsdata 目录的详细步骤&#xff1a; 在 10.40.111.41 上操作&#xff1a; 安装并配置 NFS 服务器&#xff1a; a. 安装 NFS 服务器软件包&#xff1a; sudo dnf in…

【b站李同学的Lee】2 Git进阶【gitgithub】入门教程,必学!

课程地址&#xff1a;【【git&github】入门教程&#xff0c;必学&#xff01;】 https://www.bilibili.com/video/BV1cE411G7yc/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 Git进阶 2.1 分支 2.1.1 分支细分 2.1.2 分支命令 1查看…

LeetCode-热题100:148. 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a; head [4,2,1,3] 输出&#xff1a; [1,2,3,4] 示例 2&#xff1a; 输入&#xff1a; head [-1,5,3,4,0] 输出&#xff1a; [-1,0,3,4,5] 示例…

vue 和 react 的区别

不同点 vue vue 把 html、css、js写到一个文件中&#xff0c;逻辑更加清楚vue 使用了模版系统&#xff0c;提供了模版引擎处理响应式&#xff0c;数据的双向绑定&#xff0c;但是也是单向数据流更易于上手 react 使用 jsx 语法&#xff0c;允许我们在 js 中书协 html 代码…

unity学习(83)——细节名称和血条

眼中有细节&#xff0c;学习的过程才能平稳&#xff01; 1.游戏更新时把名字也更新 代码如下&#xff1a; 效果如下&#xff1a; 2.因为是第三人称&#xff0c;从背后看&#xff0c;所以名称应该水平对称&#xff0c;翻转一下&#xff01;rotate y180 游戏内效果如下&#xf…

升级xcode15 报错Error (Xcode): Cycle inside Runner

升级xcode15后报错 Could not build the precompiled application for the device. Error (Xcode): Cycle inside Runner; building could produce unreliable results. This usually can be resolved by moving the shell script phase Thin Binary so that it runs before th…

Python程序设计 列表

教学案例八 列表 1. 计算并显示斐波那契数列 输入n,计算并显示斐波那契数列前n项.一行打印5项&#xff0c;每项显示宽度为6 什么是斐波那契数列 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列、 因数学家莱昂纳多斐波那契&#xff…

vue动态绑定class的几种方法

一、对象语法 1、给v-bind:class 设置一个对象&#xff0c;可以动态地切换class&#xff0c;例如&#xff1a; <div id"app"><div :class"{active:isActive}"></div> </div> <script> var app new Vue({el:#app,data:{isA…