STM32学习笔记(11_1)- SPI简介和工作原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

本期学习另一个通信协议SPI,和I2C差不多,都是实现主控芯片和各种外挂芯片之间的数据交流。学习流程也是一样,先学习SPI协议的软硬件规定。先用软件模拟的SPl,实现读写这个W25Q64 Flash存储器,之后再学习STM32中的SPI外设,再用硬件SPI实现一样的功能。

W25Q64是一个flash存储器芯片,内部可存8M,并且掉电不丢失。

I2C可以在消耗最低硬件资源的情况下,实现最多的功能,但是时序复杂,通信速度慢(标准模式下100KHz)。高位先行,只有在SCL高电平时才会读取SDA的电平。

SPI传输速度快,最大传输速率取决于芯片厂商的设计,比如W25Q64,手册里写的SPI时钟频率,最大可达80MHz;其次设计简单,没有I2C那么复杂;最后,硬件开销比较大,占用的通信线多。高位先行,数据位的输入和输出都是在SCK的上升沿或下降沿进行的。

在SPI中通常采用指令码加读写数据的模型,即SPI的通信流程是起始后+第一个字节(指令码里面的指令)+读/写指令。在SPI从机的芯片手册上,都会定义好对应的指令集。

SPI简介

这四根通信线可能还会有其他名称,比如SCLK、CLK、CK、DO、DI、NSS、CS等,下面以SPI官方文档为准。

数据位的输入和输出都是在SCK的上升沿或下降沿进行的。

左一是W25Q64,flash存储器芯片,内部可存8M。其上面DI指的是W25Q64的数据输入口,即MOSI。左二为SPI通信的OLED。左三为2.4G无线通信模块,芯片型号为NRF24L01。最后是micro SD卡,也是可以利用SPI进行读写。

SPI硬件电路

从机:比如存储器、显示屏、通信模块、传感器等等等等。

 SPI通信线上的电压都是对GND来说的,所以主机和从机还要共地

SS是低电平有效,主机想指定谁,就把对应的SS输出线置低电平。同一时间,主机只能选择一个从机进行通信。

当从机的SS引脚为高电平时,它的MISO引脚必须切换为高阻态(相当于引脚断开,不输出任何电平);当从机的SS引脚为低电平时,它的MISO引脚才允许为推挽输出。当然这个切换过程是在从机里进行,我们写主机程序并不需要用这个。

SPI移位示意图

 内部都有一个8位移位寄存器,高位先行,每来一个时钟,左移一次。SCK时钟源是由主机提供的,叫波特率发生器。

具体工作流程:首先,波特率发生器时钟的上升沿,所以移位寄存器向左移动一位,移出去的位放在引脚上;时钟下降沿,引脚上的位,采样输入到移位寄存器的最低位。

 下图是一个时钟采样后的现象,也就是波特率发生器来一个时钟信号,上升沿时,把主机的最高位1输出到MOSI线上、从机的最高位0输出到MISO线上;下降沿时,从机把MOSI线上的1采样输入到从机移位寄存器最低位、主机把MISO线上的0采样输入到主机移位寄存器。

这样8次后就实现了主机和从机一个字节的交换。那主机只发送不接收呢?还是数据交换的流程,不读取主机接收的数据即可;只接收不发送呢?也是一样的流程,主机随便发个数据到从机即可(一般发送0x00或0xFF)。

 SPI时序基本单元

SS下降沿是通信的开始,SS上升沿是通信的结束,在整个通信过程,SPI始终要保持低电平。

什么时候移位、上升沿移位还是下降沿移位?SPI并没有限定死,而是可以通过CPOL(clock polarity时钟极性)和CPHA(clock phase时钟相位)进行配置,共四种模式。

 这里介绍交换一个字节模式1,但是常用的是模式0.

模式0数据变化会提前半个周期。 

SPI时序例子

这里以W25Q64为例,在SPI中通常采用指令码加读写数据的模型,过程就是SPI起始后,第一个交换发送给从机的数据一般叫指令码,在从机中一般会定义一个指令集。需要发送什么指令时,就可以在起始后第一个字节发送指令集里面的数据。有的指令只需要一个字节的指令码就可以完成,比如W25Q64的写使能、写失能等指令;而有的指令后面还需要再跟读写的数据,比如W25Q64的写数据、读数据等,写数据就得跟上我在哪里写、写什么。在SPI从机的芯片手册上,都会定义好对应的指令集。

发送指令(单字节)

下图使用的是模式0

指定地址写 

因为W25Q64有8M的flash,8位地址不够表示,所以这里的地址是24位的。

8个时钟后SPI交换完成,0x02代表要写入数据 

 下图这里的三个字节表示从机收到的24位地址为0x123456

最后一个字节表示我要写入0x55这个数据,即在0x123456地址下写入0x55。只写入一个数据的话,这里就可以把SS拉高,结束通信了;还要写数据的话,在0x55的后一个字节继续写入数据就好。这里和I2C一样,每读写一次,地址指针会自动加1.

 指定地址读

发送读指令和指定地址都和指定地址写一样 ,这里就直接看最后一个字节读数据。

这时从机就会把0x123456地址下的数据通过MISO发给主机。

程序现象

用四根SPI通信线把W25Q64和STM32连接,STM32操作引脚电平,实现SPI通信时序,进而实现读写存储器芯片的目的。

第一行显示ID号,MID是厂商ID,读出来是0xEF;DID是设备ID,读出来是0x4017。ID号是手册固定的,我们用SPI读取ID号,就可以进行最简单的测试了。第二行W是写的内容,是4个字节,0x01、02、03、04。第三行是读的内容,也是0x01、02、03、04。写入和读出的数据一样,说明测试没什么问题。

软件SPI读写W25Q64

硬件SPI读写W25Q64

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

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

相关文章

Pytest接口自动化测试进阶

背景 随着Web应用的发展,越来越多的功能需要用户登录才能使用。而在接口测试中,往往需要模拟用户的登录状态来进行测试。一种常见的做法是通过Cookie来维持用户的登录状态。然而,由于Cookie的有效期限制以及网站的安全策略,如何在…

YOLOv5标签值含义根据标签将检测框色块替换(马赛克)

以一个检测人脸的图片为例: 检测后生成的标签txt如下, 此时,如何根据标签值将检测到的人脸同色块替换呢? 关键是获取检测框的左上角坐标和右下角坐标。 img Image.open(D:/PythonWokspace/JINX/datasets_transform/dataset/im…

YUDAO源码中的正序倒序表格ElmentUI的实现,与后端的配合?

前端展示和实现&#xff1a; 1. elmentUI表格的定义 2. JS请求参数改造 <!-- 列表 --><el-table v-loading"loading" :data"list" sort-change"handleSortChange"><el-table-column label"Expiry Date" prop"…

业主看完当场签约的神仙地产大屏,搞物业的你不来get同款么

各行各业都有可视化大屏的应用场景&#xff0c;不少同志曾私戳我&#xff1a;能不能给我XX行业的大屏示例哇&#xff0c;我展示的指标领导怎么都不满意哇&#xff01; 于是俺在行业顾问大哥那苦苦哀求&#xff0c;终于给大家带来这个地产行业的“营销战图大屏”方案&#xff0…

Linux函数学习 select

1、Linux select 函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds 最大文件fd 1 readfds 监听可读文件集合fd writefds 监听可写文件集合fd exceptfd 监听异常文件集…

Linux服务器上搭建深度学习环境(安装anaconda、创建虚拟环境、安装pytorch)

Linux服务器的搭配 Linux服务器上安装anaconda创建虚拟环境linux上安装pytorchxshell连接服务器 Linux服务器上安装anaconda 链接 创建虚拟环境 参考教程&#xff1a;此处 linux上安装pytorch 链接 xshell连接服务器 链接

Android获取连接到手机热点上的设备信息

主题&#xff1a;在手机开启热点网络的情况下&#xff0c;想要获取是哪个设备已经连接上了当前开启的热点。 实现思路&#xff1a;Android通过读取 /proc/net/arp 文件可以得到连接当前热点的设备信息&#xff0c;包括Mac地址、IP地址等信息。 一. 方法逻辑&#xff1a; /*** …

Hadoop安装部署-NameNode高可用版

Hadoop分布式文件系统支持NameNode的高可用性&#xff0c;本文主要描述NameNode多节点高可用性的安装部署。 如上所示&#xff0c;Hadoop分布式文件系统部署了NameNode的Master主节点以及NameNode的Slave副节点&#xff0c;当Master主节点发生故障变得不可用时&#xff0c;ZooK…

【C语言】扫雷小游戏

文章目录 前言一、游戏玩法二、创建文件test.c文件menu()——打印菜单game()——调用功能函数&#xff0c;游戏的实现main()主函数 game.c文件初始化棋盘打印棋盘随机布置雷的位置统计周围雷的个数展开周围一片没有雷的区域计算已排查位置的个数排查雷(包括检测输赢): game.h文…

3d模型太大怎么把物体显示小---模大狮模型网

在3D建模软件中&#xff0c;您可以通过缩放操作来改变物体的大小以便于显示和编辑。以下是在常见的3D建模软件(例如Blender、Maya、3ds Max等)中缩小物体的方法&#xff1a; Blender中缩小物体&#xff1a; 选择物体&#xff1a;首先&#xff0c;选择您想要缩小的物体。您可以…

科研学习|科研软件——SPSS统计作图教程:多组折线图(≥3个变量)

一、问题与数据 研究者想研究45-65岁不同性别人群中静坐时长和血胆固醇水平的关系,分别招募50名男性和女性(gender)询问其每天静坐时长(time,分钟),并检测其血液中胆固醇水平(cholesterol, mmol/L),部分数据如图1。研究者该如何绘图展示这两者间的关系呢? 二、问题…

秋招复习笔记——八股文部分:操作系统

笔试得刷算法题&#xff0c;那面试就离不开八股文&#xff0c;所以特地对着小林coding的图解八股文系列记一下笔记。 这一篇笔记是图解系统的内容。 硬件结构 CPU执行程序 计算机基本结构为 5 个部分&#xff0c;分别是运算器、控制器、存储器、输入设备、输出设备&#xf…