STM32的SPI通信介绍

SPI简介

  • SPI:串行外设接口,与IIC一样都是通用数据总线。
  • 四根通信线:SCK,MOSI(DO),MISO(DI),SS。
  • 同步(共用一根时钟线),全双工(数据发送和接收单独占一条线)
  • 支持挂载多设备,一主多从,每个从机占用一根ss线

SPI与IIC对比: 

        与IIC不同,IIC可以实现多主机,半双工。IIC可以在消耗最低硬件资源的情况下实现最多的功能,性价比很高,缺点是通信线高电平的驱动能力较弱,低电平上升到高电平时需要花费很多时间,标准模式只有100KHz左右的速度,快速模式也只有400KHz。

        SPI传输更快,设计简单粗暴,较为简单,硬件开销较大,通信线较多,简单快速。

硬件电路:

  • 所有SPI设备的SCKMOSIMISO分别连在一起
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

        得益于推挽输出的强驱动能力,使得高低电平变化很快,因此它的传输速度很快,注意:当从机的SS引脚为高电平,也就是从机未被选中的时候它的MISO引脚必须为高阻态,在SS为低电平时,才允许变为推挽输出。

SPI移位示意图:

        SPI运行原理:波特率发生器的作用就是产生时钟信号,经过一个上升沿和一个下降沿的时候,主机和从机就会交换一个数据,如图当产生上升沿时候,SPI主机和从机的移位寄存器都往左移,主机移出来一位1,从机移位出来一位0,这个移出来的数据放在各自线上的寄存器中,当产生下降沿时,主机与从机读取对方线上的数据,此时SPI主机的移位寄存器的最低位接收到了从机发出的0,同理SPI从机的移位寄存器接收到了1。这就是主机和从机交换一个字节的原理,就能同时实现数据的收发。

        主机和从机都是基于字节交换来完成数据收发的,每次收发数据就执行一次字节交换的时序,当需要发送不需要接收数据的时候怎么办呢?这时候还是调用字节交换的时序,只是不去读取从机接收的数据是什么。同理只需要接收不需要发送的时候,一般会让主机发送0x00或0xFF这种数据来把从机的数据置换过来。

SPI时序

  • 通信开始:SS从高电平切换为低电平
  • 通信保持:SS一直保持低电平
  • 通信终止:SS从低电平切换为高电平

        SPI有两个可以配置的位,分别为:CPOL,CPHA,每一位可以配置为1或0,总共组合起来一共有四种模式。

  • CPOL:时钟极性
  • CPHA:时钟相位

模式0(最常用)

  • CPIOL= 0,表示空闲状态时,SCK为低电平
  • CPHA = 0,表示SCK第一个边沿移入数据,第二个边沿移出数据

        模式0如图:由于时钟第一个边沿就要移入数据,那么应该提前有数据在数据线上,因此,在SS刚产生跳变时,MOSI和MISO就移出了一次数据,在时钟产生上升沿时,移入B7,紧接着时钟继续产生跳变,开始移出数据,就这样依次进行到最后一次时钟产生跳变时,MISO和MOSI还会再多移出一次数据,这样在下一次时钟产生上升沿的时候,才能继续移入数据,这样就能重复一个字节数据的收发了。

模式1:

  • CPIOL= 0,表示空闲状态时,SCK为低电平
  • CPHA = 1,表示SCK第一个边沿移出数据,第二个边沿移入数据

        如图模式1的时序图,MISO开始时为中间态,表示未选中从机时MISO为高阻态,当选中后也就是SS产生下降沿变为低电平时,开始传输数据,当SCK产生上升沿时,MOSI和MISO同时移出数据,当时钟产生下降沿时,又同时移入数据,这样就完成了一次数据交换,之后数据依次移出,移入,最后一个下降沿数据B0传输完成。然后将MOSI置到一个默认的高电平或者低电平,也可以不用去操作,从机将MISO置为高阻态。

模式2:

如图:

        模式2就是模式0的时钟相位取反,其余都相同。

模式3:

        同理,模式3与模式1也是时钟相位取反,其余相同。

SPI时序图:

发送一个字节的时序图

下图为发送一个0x06指令的时序图:

        通常使用指令码给从机,在从机中对应有指令集,这样可以指导从机进行相应的操作。具体指令参考从机的数据手册,有的指令只需要指令码,有的则是指令码+数据。

        如图这个波形为主机发送0x06指令,使用模式0,SS产生下降沿,MOSI和MISO开始变换数据,MOSI最高位是0,这里保持低电平不变,MISO这里从机没有数据发送给主机,引脚电平不用变换,MISO采用上拉输入,这里一直是高电平。在第一个时钟沿时,从机采样输入MOSI线,得到数据0,主机采样MISO线,得到数据1。到第6根绿线时,也就是第六个时钟沿,主机数据变化,这一位是1,那么改变MOSI信号为高电平。第二个时钟沿,也就是第二条绿线,这时候主机进行输出,由于第二位是0,那么波形也不用变化。

        有些芯片在不需要回传数据时,会保持MISO为高阻态,例如,W25Q64芯片在不需要回传数据时,MISO一直保持高阻态。

        总结来说就是下降沿变换数据,上升沿采样数据。

指定地址写的指令时序图

        如图实现了向指定设备发送写指令(0x02),再在指定地址下,写入数据。这个地址为24位,就需要三个字节进行传输,就要发三次8位的数据。如图,第一个字节时序实现了发送0x02指令,第二、三、四个字节时序分别发送了指令的23-16位,15-8位,7-0位的数据,最后一个字节时序发送了数据0x55。整个指令时序实现了在0x123456地址下写入0x55这个数据。

        如果发送一个字节后不终止,继续发送字节的话就会存储到下一个地址中,在SPI通信中,也会有地址指针,每读写一个字节,地址指针自动加1。

指定地址读的指令时序图

        如图实现了读从机的指定地址,第一个字节时序为读指令,第2、3、4个字节时序为地址,第五个字节时序就是随便发送一个数据来把从机的数据置换过来,一般这个数据为0xFF。 同理在这里也有地址指针,继续置换数据也会得到从机后一个地址的数据。

注意:由于MISO是由硬件自动控制,那么它会紧贴时钟的下降沿,MISO数据的最高位实际上是在上一个字节,最后一个下降沿提前发生的,因为是SPI模式0,所以数据变化都提前半个周期。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么卸载Mybatis?(仅需三步)

解决办法如下: 第一步:选择文件→设置 第二步:找到插件→输入Mybatis找到这个标志 第三步:把这个勾勾取消掉,点击确定,就可以轻松卸载了

对AOP的理解

目录 一、为何需要AOP?1、从实际需求出发2、现有的技术能解决吗?3、AOP可以解决 二、如何实现AOP?1、基本使用2、更推荐的做法2.1 “基本使用”存在的隐患2.2 最佳实践2.2.1 参考Transactional(通过AOP实现事务管理)2.…

glibc内存管理ptmalloc - 实时打印bin链的变化

前言 在《glibc内存管理ptmalloc - largebin》中我们详细解释了 largebins共63个,并用表格点出了每个bin的size的范围largebin在free一些内存后的状态 特别是第2点,我其实不太满意,因为只有全部free后的一个结果,并没有中间状态…

LeetCode刷题---查询近30天活跃用户数

1.给出满足的条件,截止至2019-07-27的近30天 activity_date BETWEEN DATE_ADD(2019-07-27,INTERVAL -29 day) and 2019-07-27这里使用了Between and 函数和 Date_add函数 2.按照日期分组,统计活跃用户个数 select activity_date day,count(distinct(us…

《Attention Is All You Need》

参考: Attention Is All You Need 论文解读:Attention is All you need Transformer模型中的attention结构作用是什么? 如何最简单、通俗地理解Transformer? Transformer 新型神经网络,基于注意力机制 的 编码器-解码器 的序列处…

Windows服务器性能监控

Windows服务器操作系统设计用于运行在客户端-服务器架构内的服务器上,这些服务器通常设计用于处理繁重的工作负载,并作为企业中涉及的大多数软件操作的骨干。因此,为了防止由于性能问题而导致的任何服务损失并保持操作的无缝流,Wi…

STM32使用HAL库SPI驱动W25Q16 使用FATFS文件系统+USB虚拟U盘

概述 使用stm32F407驱动W25Q16,使用FATFS文件系统,USB虚拟优盘功能,W25Q16一共512个扇区,其中128作为flash存取相关数据,其他的384个扇区用作虚拟U盘使用 CubeMax配置过程 代码 W25Q16.c /***********************…

idea使用git笔记

1.创建分支和切换分支 创建分支 切换分支 2.把新创建的分支提交到远程服务器上(注:如果没有提交的,随便找个文件修改再提交) (1)切换到要提交的分支,add (2)commit (3)push 3.在自己分支修改代码及提交到自己的远…

What‘s new in PikiwiDB (Pika) v3.5.3 (正式版)

随着 Redis 宣布采用双协议以维护其商业利益,PikiwiDB (Pika) 社区非常荣幸地宣布之际,我们的最新 v3.5.3 正式生产可用版本现已发布。 v3.5.3 版本不仅修复了长期存在的 Bug,还引入了一系列新特性。这些新特性包括 Pika 对 ACL 的支持、移除…

USART发送单字节数据原理及程序实现

硬件接线: 显示屏的SCA接在B11,SCL接在B10,串口的RX连接A9,TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中,实现初始化函数,等需要的函数,首先对串口进行初始化,只需要…

@Value注解的使用方式

Value 注解用于从配置文件中获取特定的属性值,并注入到 Spring Bean 中。它有多种使用方式,下面列举了一些常见的用法: 先贴图: 1. 注入单个属性值 Component public class MyBean {Value("${my.property}")private S…

DVB-S系统仿真学习

DVB-S系统用于卫星电视信号传输,发送端框图如下所示 扰码 实际数字通信中,载荷数据的码元会出现长连0或长连1的情况,不利于接收端提取时钟信号,同时会使得数据流中含有大量的低频分量,使得QPSK调制器的相位长时间不变…

2024.3.25 QT

思维导图 作业:完善对话框,点击登录对话框 如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个0k按钮,用户点击Ok后,关闭登录界面,跳转到其他界面如果账号和密码不…

JAVA面试大全之JVM和调休篇

目录 1、类加载机制 1.1、类加载的生命周期? 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别? 1.4、JVM有哪些类加载机制? 2、内存结构 2.1、说说JVM内存整体的结构?线程私有还是共享的? 2.2…

春季装修选择传统空调还是中央空调?约克VRF中央空调帮你分析

春天,不仅是万物复苏的时刻,也是家居装修的黄金时期。正所谓“一年之计在于春”,气温适中,湿度适宜,正是施工的好时节。而且,春季的空气流通性好,有利于装修材料的干燥与挥发,减少有害物质的残留,对我们的健康也更有保障。更为重要的是,在这个气候不冷不热的季节,我们有更充足的…

推荐几个python的工具

Beautiful Soup Beautiful Soup用于清理和提取HTML和XLM中的数据。 它用于解析HTML文本,并允许数据科学家将文本数据转换为结构化数据,只需几行代码,就可以提取复杂的HTML数据。在某些情况下,您只需要一个表标签,并且…

24.park和unpark方法

1.park方法可以暂停线程,线程状态为wait。 2.unpark方法可以恢复线程,线程状态为runnable。 3.LockSupport的静态方法。 4.park和unpark方法调用不分先后,unpark先调用,park后执行也可以恢复线程。 public class ParkDemo {pu…

2024-03-27 作业

作业要求: 整理课上代码整理思维导图完成下面类 作业1: 完成了 作业2: 作业3: class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造myString():si…

如何使用ChatGPT准备即将到来的面试How to Use ChatGPT to Prepare for an Upcoming Interview

使用ChatGPT来准备即将到来的面试可以非常有帮助,因为它可以模拟真实的面试场景并提供反馈。以下是一些步骤和提示,说明如何利用ChatGPT进行面试准备: 研究职位和公司:在与ChatGPT对话之前,先对你申请的职位和公司进行…

基于 VB6的猜拳游戏

基于 VB6的猜拳游戏 1 欢迎页的制作 welcomeFrom 添加一个定时器 代码如下: Private Sub Form_Load()定时器Timer1的时间间隔设置为1000毫秒Timer1.Interval 1000Timer1.Enabled TrueEnd SubPrivate Sub Timer1_Timer()关闭当前窗体Unload MeReadyFrom.Show…