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

STM32 SPI

在这里插入图片描述
SPI 串行外设接口,和IIC一样,是通用的数据总线,用于主控和外挂芯片之间的通信,
IIC和SPI的优劣势:
IIC的硬件电路和软件时序设计都相对复杂,,硬件上,要配置为开漏外加上拉的模式,
软件上的功能和要求,一根线通信兼数据收发,应答位的收发,寻址机制的设计。IIC可以在消耗最低硬件资源的情况下,实现最多的功能,在硬件上,无论需要挂载多少个设备,都只需要两根通信线
如果把通信协议比作一个人,IIC就属于精打细算,思维灵活这类型的人。既要实现硬件上最少的通信线,又要实现软件上最多的功能,IIC实现地非常优雅,但是由于IIC开漏外加上拉电阻地电路结构,使得通信线高电平的驱动能力比较弱,就会导致通信线由低电平向高电平跳变的时候,这个上升沿耗时比较长,会限制IIC的最大通信速度。所以IIC的标准模式只有100KHz的时钟频率,快速模式也只有400KH,虽然IIC协议之后又通过改进电路的方式,设计出了高速模式,可以达到3.4MHz,但是高速模式目前普及程度不高,所以一般情况下,认为IIC的时钟速度最多就是400KHz,

SPI传输更快,没有严格规定最大传输速度,这个最大传输速度取决于芯片厂商的设计需求,比如说W25Q64存储器芯片,手册里写的SPI时钟频率,最大可达80MHz,这比STM32F1的主频还要高,实现的功能没有IIC那么多,所以学习起来,SPI还是比IIC简单很多,最后SPI的硬件开销比较大,通信线的个数比较多,并且通信过程中,经常会有资源浪费的现象。
如果把通信协议比作一个人,SPI就属于富家子弟,有钱任性这类型的人,不在乎花了多少钱,只在乎我的任务有没有最简单,最快速的完成,这就是SPI的风格,

SCK 串行时钟线 SCLK、CLK、CK
MOSI 主机输出从机输入 DO Data Output
MISO 主机输入从机输出 DI Data Input
SS 从机选择 NSS Not SlaveSelect CS Chip Select

数据位的输出和输入,都是在SCK的上升沿和下降沿进行的,这样数据位的收发时刻就可以明确的确定,并且,同步时序,时钟快一点慢一点,或者中途暂停一会儿,都没有问题,这就是同步时序的好处。

主机和从机不能同时配置为输出或输入。数据流的方向不会改变,不用担心发送和接收没协调好冲突了,不支持多主多从,
SPI是专门用一条通信线用来指定要和哪个从机进行通信,SS从机选择线,有几个从机,就可开几条SS线,

在这里插入图片描述

SPI的所有通信线都是单端信号,他们的高低电平都是相对GND的电压差,所以单端信号,有的设备还需要共地,这里GND没有画出来,但是是必须要接的,然后如果从机没有单独供电的话,主机还需要再额外引出电源正极VCC,给从机供电,
时钟线完全由主机控制,时钟线都为输入,这样主机的同步时钟,就可以送到各个从机了,
SS是低电平有效,,主机想指定谁,就把对应的SS输出线置低电平就行了

当主机需要和从机1进行通信,主机就把SS1线输出低电平,从机1就知道主机在找我,然后主机在数据引脚进行的传输,就只有从机1会响应,其他从机的SS线是高电平,就会保持沉默。当主机和从机1完成通信之后,主机会把SS1置高电平,这样从机就知道,主机结束了和我的通信。同一时间,主机只能置一个SS为低电平,只能选中一个从机,否则如果主机同时选中多个从机,就会导致数据冲突,这就是SPI实现选择从机的方式。
输出引脚配置为推挽输出,输入引脚配置成浮空或上拉输入。对于输出,我们配置推挽输出,高低电平都有很强的驱动能力,这将使得SPI引脚信号的下降沿,非常迅速,上升沿也非常迅速,,SPI信号变化的快,自然它就能达到更高的传输速度,,一般SPI信号都轻松可以达到MHz的速度级别

SS未被选中时,它的MISO引脚,必须切换为高阻态,相当于引脚断开,不输出任何电平,这样就可以防止,一条线有多个输出,而导致的电平冲突的问题了,在SS为低电平时,MISO才允许变为推挽输出,这就是SPI对这个可能的冲突做出的规定,当然这个切换过程都是在从机里。所以我们主机的程序中,并不需要关注这个问题,

在这里插入图片描述
移位示意图是SPI硬件电路设计的核心,只要把移位示意图搞懂了,那无论是上面的硬件电路,还是我们等会学习的软件时序,
SPI的基本收发电路,就是使用了这样一个移位的模型,左边是SPI主机,里面有一个8为的移位寄存器,右边是SPI从机,里面也有一个8位移位寄存器,这里移位寄存器有一个时钟输入端,因为SPI一般是高位先行的,所以,每来一个时钟,移位寄存器都会向左进行移位,从机中的移位寄存器也是同理,然后,移位寄存器的时钟源是主机提供的,这里叫波特率发生器,它产生的时钟驱动主机的移位寄存器进行移位,同时,这个时钟也通过SCK引脚进行输出,接到从机的移位寄存器里,主机移位寄存器左边移出的数据,通过MOSI引脚,输入到从机移位寄存器的右边,从机移位寄存器左边一出去的数据,通过MISO,输入到主机移位寄存器的右边
波特率发生器时钟的上升沿,所有移位寄存器向左移动一位,移出去的位放到引脚上,波特率发生器时钟的下降沿,引脚上的位,采样输入到移位寄存器的最低位,接下来,假设主机有数据10101010要发送到从机,同时,从机有数据01010101要发送到主机,先产生一个上升沿,那从最高位移出去的数据,向左移动一次,
那最高位移出去的数据,就会放到通信线上,实际上是放到了输出数据寄存器,此时MOSI数据是1,所以MOSI的电平就是高电平,MISO的电平就是低电平,这就是第一个时钟上升沿执行的结果。上升沿之后,下一个边沿就是下降沿,在下降沿时,主机和从机内,都会进入数据采样输入,也就是MOSI的1,会采样输入到从机这里的最低位,MISO的0会采样输入到主机这里的最低位,这就是第一个时钟结束后的现象。一直到第8个时钟,都是同样的过程,实现了主机和从机一个字节的数据交换,实际上,SPI的运行过程就是这样,SPI数据的收发,都是基于字节交换,这个基本单元来进行的,当主机需要发送一个字节,并且同时需要接收一个字节时,这样,主机要发送的数据跑动从机,主机要从从机接收的数据,跑到主机。
只想发送,不想接收怎么办呢? 仍然调用交换字节的时序,发送同时接收,只是接收到的数据,我们不去看它。
如果只想接收,不想发送,就还是调用交换字节的时序,,只是会随便发送一个数据,只要能把从机的数据置换过来就行了。这里随便发过去的数据,从机也不会去看它,我们不会真的随便发,一般在接收的时候,我们会统一发送0x00或0xFF,去跟从机交换数据。

以上就是SPI的基本原理,SPI通信的基础是交换一个字节,有了交换一个字节,就可以实现发送一个字节、接收一个字节和发送同时接收一个字节这三种功能,可以看出,SPI在只执行发送或只执行接收的时候,会存在一些资源浪费现象。不过,全双工的通信,本来就会有浪费的情况发生,

在这里插入图片描述
SS低电平选中,高电平未选中。低电平器件就代表正在通信,下降沿是通信的开始,上升沿是通信的结束。

在这里插入图片描述
这个基本单元是建立在我们刚才说的移位模型上的,并且这个基本单元,什么时候开始移位?是上升沿移位还是下降沿移位?SPI并没有限定死,给了我们可以配置的选择,这样的话,SPI就可以兼容更多的芯片,SPI有俩i个可以配置的位,分别是CPOL(Clock Polarity)时钟极性,和CPHA(Clock Phase)时钟相位,每一位可以配置位1或0,总共组合起来就有4种模式,但是他们的功能都是一样的,在实际使用的时候,主要学习其中一种就可以了,剩下的模式,知道有这个东西可以配置,如果真的需要用,再过来了解一下即可。

在这里插入图片描述
CPOL=0,表示空闲状态,SCK位低电平,在SS未被选中时,SCK默认是低电平的,
CPHA=1,表示SCK第一个边沿移出数据,第二个边沿移入数据,有的地方写的是CPHA=1表示SCK的第二个边沿进行数据采样,或者是SCK的偶数边沿进行数据采样,意思都一样,这里为了照应刚才的移位模型,就这么写

SS高电平时,MISO用一条中间的线,表示高阻态。
SS下降沿之后,从机的MISO被允许开启输出,SS上升沿之后,从机的MISO必须置回高阻态,这是这一块的设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

W25Q64框图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.mrgr.cn/news/19911.html

相关文章:

  • 【电感】基础知识
  • 35.搜索插入位置
  • JSON Hero:视图查看更简单!!【送源码】
  • 【高等代数笔记】(18)N阶行列式
  • Linux教程8:文本编辑命令vi
  • 【JAVA】第三天
  • Java-互斥锁死锁释放锁
  • Leetcode—72. 编辑距离【中等】
  • 【IPV6从入门到起飞】3-域名解析动态IPV6(阿里云)
  • 栈和队列——用栈实现队列
  • Python使用turtle画笑脸
  • 【C++ 面试 - STL】每日 3 题(八)
  • 第11讲 回环检测
  • 【为项目做准备】Linux操作系统day2
  • 整形提升-C语言
  • 2157. 优秀的拆分(power)
  • Linux学习笔记5 值得一读,Linux(ubuntu)软件管理,搜索下载安装卸载全部搞定!(上)
  • 【重学 MySQL】八、MySQL 的演示使用和编码设置
  • ECCV2024|RegionDrag:基于区域的图像编辑方法,通过手动拖拽实现图像编辑!
  • hadoop dfs web页面访问增加鉴权